SpringCloudAlibaba项目之Ribbon负载均衡
SpringCloudAlibaba随笔目录
二、SpringCloudAlibaba项目之Nacos搭建及服务注册
三、SpringCloudAlibaba项目之生产者与消费者
四、SpringCloudAlibaba项目之Ribbon负载均衡
五、SpringCloudAlibaba项目之OpenFeign远程调用
六、SpringCloudAlibaba项目之Nacos-config配置中心
七、SpringCloudAlibaba项目之Sentinel流量控制
八、SpringCloudAlibaba项目之Seata分布式事务
九、SpringCloudAlibaba项目之GateWay网关
十、SpringCloudAlibaba项目之SkyWalking链路追踪
SpringCloudAlibaba项目之Ribbon负载均衡
1、Ribbon简介
在Spring Cloud 构建的微服务中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是与RestTemplate相结合,另一种是与Feign(现已闭源不更新了,由SpringCloud官方提供的OpenFeign代替,Feign的强化版)相结合。Feign已经默认集成了Ribbon。
Ribbon 是 Netflix 发布的开源项目,主要功能是提供 客户端的复杂均衡算法和服务调用。
Ribbon 客户端组件提供一系列完善的配置项如超时、重试等。
Ribbon 会自动的帮助你基于某种规则(如简单轮询,随机链接等)去链接这些机器。
Nginx 是服务器负载均衡,客户端所有请求都会交给nginx, 然后 nginx 实现转发请求。即负载均衡是由服务端实现的。
Ribbon 本地负载均衡(或服务消费端),在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到JVM 本地,从而在本地实现RPC远程 服务调用技术。
3、ribbon与LoadBalance
ribbon状态:停更进维
替代方案 -Spring Cloud Loadbalancer
b、ribbon是Netflix开源的基于HTTP和TCP等协议负载均衡组件,loadBalancer是SpringCloud自己写的,根据服务id获取负载均衡器rpc地址。
c、Ribbon的使用需要代码里手动调用目标服务,loadBalancer底层原理是默认调用ribbon的实现客户端负载均衡
LoadBalance和ribbon 比较:
负载均衡比较
ribbon 提供7中默认的负载均衡策略,常见的常见都有覆盖,一般我们都是使用 ZoneAvoidanceRule
复合判断server所在区域的性能和server的可用性选择server
配置方面丰富性
-
目前
spring-cloud-loadbalancer
仅支持 重试操作的配置 -
ribbon 支持超时、懒加载处理、重试及其和 hystrix整合高级属性等
4、修改默认负载均衡
方式1:配置类
RibbonRuleConfig,负载均衡配置类
/** * 方式1:配置负载均衡策略 * RibbonRuleConfig不能被@SpringBootApplication的@ComponentScan扫描到,否则就是全局配置的效果 */ @Configuration public class RibbonRuleConfig { /** * 全局配置,指定负载均衡策略 * @return */ @Bean public IRule iRule(){//方法名一定叫iRule,遵循约定大于配置 return new RandomRule();//使用随机负载均衡策略 //return new NacosRule();//指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机权重) } }
启动类:
@SpringBootApplication @EnableDiscoveryClient//可加可不加,依版本而定,从Spring Cloud Edgware开始,@EnableDiscoveryClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。 //可配置多个 RibbonRuleConfig不能被@SpringBootApplication的@ComponentScan扫描到,所以把它放到上一层,否则就是全局配置的效果 @RibbonClients(value = { @RibbonClient(name = "service-stock",configuration = RibbonRuleConfig.class) }) public class ServiceOrderApplication { public static void main(String[] args) { SpringApplication.run(ServiceOrderApplication.class, args); } }
方式2:配置文件
application.properties
# 应用名称 spring.application.name=service-order # 应用服务 WEB 访问端口 server.port=8040 # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html # Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public #方式2:负载均衡配置文件 #指定使用Nacos提供的负载均衡策略(优先调用同一集群实例,基于随机和权重) service-stock.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
5、自定义负载均衡策略
修改方式2,不使用官方提供的负载均衡策略,自定义负载均衡配置文件
自定义负载均衡策略规则CustomRule类:
/** * 方式2:自定义负载均衡策略规则 */ public class CustomRule extends AbstractLoadBalancerRule { /** * 初始化配置信息 * @param iClientConfig */ @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } /** * 负载均衡策略规则,此处以随机数为例,可以写其他的规则或者自己创造的新规则 * @param o * @return */ @Override public Server choose(Object o) { ILoadBalancer iLoadBalancer = this.getLoadBalancer(); //获取当前请求的服务实例 List<Server> reachableServers = iLoadBalancer.getReachableServers(); //根据服务实例产生随机数 int random = ThreadLocalRandom.current().nextInt(reachableServers.size()); //获取此随机数下的服务 Server server = reachableServers.get(random); return server; } }
application.properties
# 应用名称 spring.application.name=service-order # 应用服务 WEB 访问端口 server.port=8040 # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html # Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public #方式2:负载均衡配置文件 #指定使用Nacos提供的负载均衡策略(优先调用同一集群实例,基于随机和权重) #service-stock.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule #指定自定义负载均衡策略规则CustomRule类,使用自己定义的规则 service-stock.ribbon.NFLoadBalancerRuleClassName=com.qt.ribbon.rule.CustomRule
6、使用LoadBalancer替换Ribbon
目前LoadBalancer只提供了轮询负载策略。
移除nacos中的ribbon
方法1,修改pom.xml(推荐使用,防止一些类重名等):
<!-- nacos 服务注册发现(客户端)依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!--移除ribbon支持--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
方法2,修改配置文件application.properties:
# 应用名称
spring.application.name=service-order
# 应用服务 WEB 访问端口
server.port=8040
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
#不使用ribbon
spring.cloud.loadbalancer.ribbon.enabled=false
添加loadbalancer依赖
<!-- 添加 loadbalancer 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
RestTemplateConfig类
/** * SpringBoot-RestTemplate实现调用第三方API */ @Configuration @Component public class RestTemplateConfig { @Bean @LoadBalanced //启用负载均衡,使RestTemplate请求支持负载均衡 public RestTemplate restTemplate(RestTemplateBuilder builder){ RestTemplate restTemplate = builder.build(); return restTemplate; } }
访问地址:http://localhost:8040/order/addOrder