ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【微服务负载均衡器】Ribbon

2026/8/14 7:10:10 拓冰建站 浏览量
【微服务负载均衡器】Ribbon Ribbon1. 什么是Ribbon1.1 客户端的负载均衡1.2 服务端的负载均衡1.3 常见负载均衡算法2. Nacos使用了Ribbon2.1 LoadBalanced 做了什么3. Ribbon负载均衡策略与支持的算法3.1 修改默认负载均衡策略4. 自定义负载均衡策略5. 使用LoadBalancer替换Ribbon5.1 RestTemplate整合LoadBalancer1. 什么是Ribbon目前主流的负载均衡方案可以分为以下两种:集中式负载均衡器在消费者和服务提供方中间使用独立的代理方式进行负载有应该的(比如F5)还有软件的如Nginx客户端根据自己的请求情况做负载均衡Ribbon就属于客户端自己做负载均衡Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具Ribbon客户端组件提供一系列的完善的配置如超时重试等。通过Load Balancer获取到服务提供的所有机器实例Ribbon会自动基于某种规则(轮询随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。1.1 客户端的负载均衡例如Spring Cloud中的Ribbon客户端会有一个服务器地址列表在发送请求前通过负载均衡算法选择一个服务器然后进行访问这是客户端负载均衡即在客户端就进行负债均衡算法分配。1.2 服务端的负载均衡例如Nginx通过Nginx进行负载均衡先发送请求然后通过负载均衡算法在多个服务器直接按选择一个进行访问即在服务器端再进行负载均衡算法分配。1.3 常见负载均衡算法随机通过随机选择服务进行执行轮询负载均衡默认的实现方式请求之后排队处理加权轮询通过对服务器新能分型给高配置低负载的服务器分配更高的权重均衡各个服务器的压力地址hash通过客户端请求的地址的HASH值取模映射进行服务器调度。ip hash最小链接数即使请求均衡压力不一定会均衡最小连接数法就是根据服务器的情况比如请求积压数等参数将请求分配到当前压力最小的服务器上。2. Nacos使用了RibbonNacos中默认就集成了Ribbon如下图所示如下使用LoadBalanced就开启了负载均衡ConfigurationpublicclassRestConfig{BeanLoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}2.1 LoadBalanced 做了什么它会给 RestTemplate自动注入一个 LoadBalancerInterceptor让 RestTemplate 支持✔️服务名调用自动从注册中心获取实例例如调用restTemplate.getForObject(http://user-service/api/user/1,String.class);其中 user-service 并不是域名而是服务名。Spring Cloud 会从注册中心Nacos/Eureka获取 user-service 的所有实例列表使用 Load BalancerRibbon、Spring Cloud LoadBalancer根据策略 轮询 / 随机 / 权重选择一个实例将最终 URL 转换为http://192.168.1.10:8080/api/user/1发起真实请求3. Ribbon负载均衡策略与支持的算法3.1 修改默认负载均衡策略全局配置调用其他微服务一律使用指定的负载均衡算法。1.配置类补充图2.配置文件调用指定微服务提供的服务时使用对应的负载均衡算法。修改application.yml4. 自定义负载均衡策略只需要我们都来实现IRule或者实现AbstractLoadBalancerRule实现基于Nacos权重的负载均衡策略5. 使用LoadBalancer替换RibbonSpring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器用来替代Ribbon。Spring官方提供了两种负载均衡的客户端1. Rest TemplateRestTemplate是Spring提供的用于访问Rest服务的客户端RestTemplate提供了多种便捷访问远程Htp服务的方法能够大大提高客户端的编写效率。默认情;况下RestTemplate默认依赖jdk的HTTP连接工具。2. WebClientWebclient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的容户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法可以用来发起相应的请求。5.1 RestTemplate整合LoadBalancer1. 引入依赖注意这里的父也需要加上spring-cloud的版本然后自定义一个LoadBalance的配置类ConfigurationpublicclassRestTemplateConfig{BeanLoadBalanced// 核心一行开启 Spring LoadBalancerpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}⭐ Bonus如果你想换成随机策略加一个自定义配置即可ConfigurationpublicclassMyLoadBalancerConfig{BeanReactorLoadBalancerServiceInstancerandomLoadBalancer(Environmentenv,LoadBalancerClientFactoryfactory){StringserviceNameenv.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);returnnewRandomLoadBalancer(factory.getLazyProvider(serviceName,ServiceInstanceListSupplier.class),serviceName);}}application.ymlspring:cloud:loadbalancer:configurations:provider-service:myLoadBalancerConfig