SpringCloud Netflix Ribbon
负载均衡
目前主流的负载方案分为以下两种:
• 集中式负载均衡:在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。也就是服务器端负载均衡,请求到达后端服务器之后由这些负载均衡器根据⼀定的算法将请求路由到⽬标服务器处理。
• 客户端负载均衡:根据自己的请求情况做负载,Ribbon 就属于客户端自己做负载。服务消费者客户端会有⼀个服务器地址列表,调⽤⽅在请求前通过⼀定的负载均衡算法选择⼀个服务器进⾏访问,负载均衡算法的执⾏是在请求客户端进⾏。
一、简介
Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。
二、使用
1.使用 RestTemplate 与整合 Ribbon
若是已经引入了eureka-client依赖,这里就不用加入其他的依赖了,因为 Eureka 中已经引用了 Ribbon。
RestTemplate配置,加上LoadBalanced注解实现负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean @LoadBalanced // 负载均衡 public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } } |
请求方式
1 2 3 4 5 | @RequestMapping ( "/test" ) public String testRibbon(){ // ribbon调用的方式是根据服务名称调用 RIBBON-PROVIDER表示是发布者在注册中心的名称 return restTemplate.getForObject( "http://RIBBON-PROVIDER/provider/hello?msg={0}" ,String. class , "ribbon" ); } |
2.使用 Feign客户端
Feign客户端实际是对Ribbon进行了一个封装;spring-cloud-starter-feign 里面已经包含了 spring-cloud-starter-ribbon,而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址,所以要引入eureka-client
<!--eureka的核心依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--feign的核心依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
三、Ribbon负载均衡策略
Ribbon 作为一款客户端负载均衡框架,默认的负载策略是轮询,同时也提供了很多其他的策略,能够让用户根据自身的业务需求进行选择。
代码配置Ribbon
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @Configuration public class RibbonConfig { @Bean public IRule ribbonRule(){ return new RandomRule(); //分配策略:随机选择一个server // return new BestAvailableRule(); //分配策略:选择一个最小的并发请求的server,逐个考察Server,如果Server被tripped了,则忽略 // return new RoundRobinRule(); //分配策略:轮询选择,轮询index,选择index对应位置的server // return new WeightedResponseTimeRule(); //分配策略:根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低 // return new ZoneAvoidanceRule(); //分配策略:复合判断server所在区域的性能和server的可用性选择server // return new RetryRule(); //分配策略:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server } @Bean public IPing ribbonPing() { return new PingUrl(); } @Bean public ServerListSubsetFilter serverListFilter() { ServerListSubsetFilter filter = new ServerListSubsetFilter(); return filter; } } |
在主启动类上添加@RibbonClient注解,或者在配置文件中指定哪个微服务使用自定义负载均衡策略
@RibbonClient注解的使用方法如下:
启动类上加上@RibbonClient(name="微服务名称", configuration="自定义配置类.class")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?