第四章 AlibabaCloud集成Ribbon实现负载均衡
作者:互联网
1.什么负载均衡和常见的解决方案
-
什么是负载均衡(Load Balance)
分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量 -
软硬件角度负载均衡的种类
通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵的
通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略 -
从端的角度负载均衡有两种
服务端负载均衡
客户端负载均衡 -
常见的负载均衡策略(看组件的支持情况)
节点轮询:每个请求按顺序分配到不同的后端服务器
weight 权重配置:weight和访问比率成正比,数字越大,分配得到的流量越高
固定分发:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器
随机选择、最短响应时间等等
2.AlibabaCloud集成Ribbon实现负载均衡
-
什么是Ribbon
Ribbon是一个客户端负载均衡工具,通过Spring Cloud封装,可以轻松和AlibabaCloud整合 -
订单服务增加@LoadBalanced 注解
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String [] args){
SpringApplication.run(OrderApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- Video,VideoOrder实体类增加serverInfo字段记录服务器信息方便测试
- 修改VideoController
@RestController
@RequestMapping("api/v1/video")
public class VideoController {
@Autowired
private VideoService videoService;
@RequestMapping("find_by_id")
public Object findVideoById(int videoId, HttpServletRequest request){
Video video = videoService.findById(videoId);
video.setServerInfo(request.getServerName()+":"+request.getServerPort());
return video;
}
}
- 修改OrderController
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/save")
public Object save(int videoId){
//Video video = restTemplate.getForObject("http://localhost:9000/api/v1/video/find_by_id?videoId="+videoId, Video.class);
//List<ServiceInstance> list = discoveryClient.getInstances("xdclass-video-service");
//ServiceInstance serviceInstance = list.get(0);
Video video = restTemplate.getForObject("http://xdclass-video-service/api/v1/video/find_by_id?videoId="+videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
videoOrder.setServerInfo(video.getServerInfo());
return videoOrder;
}
}
- IDE设置启动多个video服务
依次修改server端口进行启动
- postman进行测试
标签:负载,videoId,videoOrder,video,均衡,public,Ribbon,AlibabaCloud 来源: https://blog.csdn.net/qq_15906903/article/details/122756273