北京专业制作网站公司哪家好,公司网站运营维护单位,中国十大传媒公司,阜阳网站推广目录
什么是负载均衡
服务端负载均衡
客户端负载均衡
Spring Cloud LoadBalancer快速上手
启动多个product-service实例
测试负载均衡
负载均衡策略
自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance#xff0c;简称 LB) , 是高并发, 高可用系统必不可少的关…目录
什么是负载均衡
服务端负载均衡
客户端负载均衡
Spring Cloud LoadBalancer快速上手
启动多个product-service实例
测试负载均衡
负载均衡策略
自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance简称 LB) , 是高并发, 高可用系统必不可少的关键组件。
当服务流量增大时通常会采用增加机器的方式进行扩容负载均衡就是用来在多个机器或者其他资源中,按照⼀定的规则合理分配负载。
负载均衡分为服务端负载均衡和客户端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。
比较有名的服务端负载均衡器是Nginx。请求先到达Nginx负载均衡器,然后通过负载均衡算法在多个服务器之间选择⼀个进行访问。
如图 客户端负载均衡 把负载均衡的功能以库的方式集成到客户端而不再是由一台指定的负载均衡设备集中提供。
比如Spring Cloud的Ribbon请求发送到客户端客户端从注册中心(比如Eureka)获取服务列表在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问。
Ribbon是Spring Cloud早期的默认实现由于不维护了所以最新版本的Spring Cloud负载均衡集成的是Spring Cloud LoadBalancer(Spring Cloud官方维护)。
如图 客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。 Spring Cloud LoadBalancer快速上手 1给 RestTemplate 这个Bean添加 LoadBalanced 注解就可以。
如代码
Configurationpublic class BeanConfig {BeanLoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
2修改IP端口号为服务名称。
public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo orderMapper.selectOrderById(orderId);
//String url http://127.0.0.1:9090/product/ orderInfo.getProductId();String url http://product-service/product/ orderInfo.getProductId();ProductInfo productInfo restTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
上述的代码是基于nacos实现的order是一个点单的服务还有一个产品的服务(product)
产品服务测试启动多个服务来测试负载均衡。 启动多个product-service实例 启动多个product-service实例
如图 测试负载均衡 连续多次发起请求: http://127.0.0.1:8080/order/1
观察product-service的日志, 会发现请求被分配到这3个实例上了
如图 负载均衡策略 负载均衡策略是⼀种思想无论是哪种负载均衡器它们的负载均衡策略都是相似的SpringCloud LoadBalancer 仅支持两种负载均衡策略轮询策略 和 随机策略
1. 轮询(Round Robin)轮询策略是指服务器轮流处理用户的请求这是⼀种实现最简单也最常用的策略生活中也有类似的场景比如学校轮流值日或者轮流打扫卫生。
2. 随机选择Random)随机选择策略是指随机选择⼀个后端服务器来处理新的请求。 自定义负载均衡策略 Spring Cloud LoadBalancer 默认负载均衡策略是轮询策略实现是 RoundRobinLoadBalancer如果服务的消费者如果想采用随机的负载均衡策略也非常简单。 1定义随机算法对象, 通过 Bean 将其加载到 Spring 容器中
如代码
public class LoadBalancerConfig {BeanReactorLoadBalancerServiceInstance randomLoadBalancer(Environmentenvironment,LoadBalancerClientFactory loadBalancerClientFactory) {String name environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);System.out.println(name);return newRandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}}
注意该类需要满足:
1. 不用 Configuration 注释
2. 在组件扫描范围内 (2) 使用 LoadBalancerClient 或者 LoadBalancerClients 注解
在 RestTemplate 配置类上方使用 LoadBalancerClient 或 LoadBalancerClients 注解可以对不同的服务提供方配置不同的客户端负载均衡算法策略。
如代码
LoadBalancerClient(name product-service, configuration LoadBalancerConfig.class)Configurationpublic class BeanConfig {BeanLoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}}
LoadBalancerClient 注解说明
1 name该负载均衡策略对哪个服务生效服务提供方。
2configuration该负载均衡策略用哪个负载均衡策略实现。