Ribbon服务调用+负载均衡(入门)
1、Ribbon
Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物;
主要功能是提供客户端的软件负载均衡算法和服务调用
Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中
①.Nginx和Ribbon的区别
Nginx是服务器的负载均衡,客户端将所有请求给Nginx,Nginx实现转发。辅助均衡通过服务端实现。
而Ribbon是本地的负载均衡,在调用微服务的接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM,之后就在本地实现RPC调用了。
②.什么是Ribbon
负载均衡+restTemplate实现远程调用
Ribbon是一个软负载均衡客户端组件,可以和其他所需请求的客户端结合使用,比如Eureka......
③.Ribbon工作流程
- 选择EurekaServer,优先选一个负载较少的Server
- 根据用户指定的策略,从server渠道的服务注册表中选一个地址(Ribbon提供多种策略:轮询、随机、响应事件加权)
2、演示
①.为什么之前支持负载均衡?
在微服务注册中心的笔记中,没有单独显示Ribbon的引用,同样能实现负载均衡
原因:之前我们在使用eureka注册中心的时候引入了如下的依赖:
<!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
通过Maven能够看到也引入了Ribbon
同样能够看到使用zookeeper和consul都有ribbon这个依赖
②开启负载均衡
开启负载均衡
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
③.RestTemplate
RestTemplate有两个方法:
-
getForObject或者getForEntity方法
-
postForObject或者postForEntity方法
ForObject和ForEntity的区别
ForObject返回为响应体中数据转化成的对象,可以理解为json
FoeEntity返回对象为ResponseEntity
对象,包含响应中的一些重要信息,比如响应头,响应的状态码和响应体
一.ForObject(推荐这个)
@GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class); }
二.ForEntity
@GetMapping("/consumer/payment/getForEntity/{id}") public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){ ResponseEntity<CommonResult> entity =restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id, CommonResult.class); //成功 if (entity.getStatusCode().is2xxSuccessful()){ return entity.getBody(); }else { return new CommonResult<>(444,"get fail"); } }
3、负载均衡算法
①.算法有哪些
Rabbion负载均衡算法:
- (默认)RoundRobinRule(轮询)
- RandomRule(随机)
- RetryRule(按照RoundRobinRule即轮询获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务)
- WeightResponseTimeRule(对RoundRobinRule的拓展,响应速度越快的实例选择的权重越大)
- BestAvailableRule(过滤多次故障处于断路器跳闸状态的服务,然后选一个并非量最小的服务)
- AvailabilityFilteringRule(先过滤故障实例,然后选择并发量比较小的实例)
- ZoneAvoidanceRule(默认规则,复合判断server所在的区域的性能和server的可用性选择服务器)
- 1.RoundRobinRule
②.RoundRobinRule原理
负载均衡算法:
rest接口第几次条用数%服务器集群总数=实际的调用位置下标,每次服务重启动后rest接口计数从1开始
例:
总台数:2
List=2 instance
第一次调用:1%2 ---->index=1 list.get(Index)
第二次调用:2%2 ---->index=0 list.get(Index)
第三次调用:3%2 ---->index=1 list.get(Index)
4、替换默认负载均衡算法
自定义的配置类不能放在@ComponentScan
所扫描的当前包下以及子包下
否则我们自定义的配置类会被所有Ribbon客户端共享(即多个调用服务会使用同一个IRule规则)
多个调用服务会使用同一个IRule规则:
比如order想要调用payment服务和user服务,调用payment使用轮询,调用user使用随机规则。这样就区分了Ribbon的负载均衡算法
解释:
Springboot启动类:在springcloud这个包下,其中一个注解@SpringBootApplication
如下图所示,@ComponentScan在是springclooud这个类下,所以我们的Ribbon配置类不能放在springcloud包及其子包内
上面的解释理清了Ribbon配置类的位置要求,下面编写配置类
1.关闭的Ribbon的负载均衡
2.新建myrule包,与springcloud包同级
3.编写配置类
@Configuration public class MyselfRule { @Bean public IRule myRule(){ return new RandomRule();//随机规则 } }
4.配置Client的负载均衡规则
修改启动类的注解
@SpringBootApplication @EnableEurekaClient //name 需要访问的微服务的名称 ,configuration为负载均衡规则的配置类 @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
RibbonCilent需要调用CLOUD-PAYMENT-SERVICE
测试:
经过5次调用,可以看到Ribbon的负载均衡算法从默认的轮询替换为了随机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!