什么是负载均衡(Load Balance)
分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量
软硬件角度负载均衡的种类
通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵的
通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略
从端的角度负载均衡有两种
服务端负载均衡
客户端负载均衡
常见的负载均衡策略(看组件的支持情况)
节点轮询:每个请求按顺序分配到不同的后端服务器
weight 权重配置:weight和访问比率成正比,数字越大,分配得到的流量越高
固定分发:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器
随机选择、最短响应时间等等
什么是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(); } }
@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; } }
@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; } }