Ribbon服务调用+负载均衡(入门)

1、Ribbon

Ribbon中文:(用于捆绑或装饰的)带子; 丝带; 带状物;

主要功能是提供客户端的软件负载均衡算法服务调用

Ribbon已经进入了维护模式了,但是Ribbon仍然被广泛使用中

①.Nginx和Ribbon的区别

Nginx是服务器的负载均衡,客户端将所有请求给Nginx,Nginx实现转发。辅助均衡通过服务端实现。

而Ribbon是本地的负载均衡,在调用微服务的接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM,之后就在本地实现RPC调用了。

②.什么是Ribbon

负载均衡+restTemplate实现远程调用

Ribbon是一个软负载均衡客户端组件,可以和其他所需请求的客户端结合使用,比如Eureka......

③.Ribbon工作流程

  1. 选择EurekaServer,优先选一个负载较少的Server
  2. 根据用户指定的策略,从server渠道的服务注册表中选一个地址(Ribbon提供多种策略:轮询、随机、响应事件加权)

2、演示

①.为什么之前支持负载均衡?

在微服务注册中心的笔记中,没有单独显示Ribbon的引用,同样能实现负载均衡

原因:之前我们在使用eureka注册中心的时候引入了如下的依赖:

<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

通过Maven能够看到也引入了Ribbon

image-20230114210728085

同样能够看到使用zookeeper和consul都有ribbon这个依赖

image-20230114210852058

image-20230114210908472

②开启负载均衡

开启负载均衡

@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

③.RestTemplate

RestTemplate有两个方法:

  1. getForObject或者getForEntity方法

  2. 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);
}

image-20230114212324751

二.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");
}
}

image-20230114212237991

3、负载均衡算法

①.算法有哪些

Rabbion负载均衡算法:

  1. (默认)RoundRobinRule(轮询)
  2. RandomRule(随机)
  3. RetryRule(按照RoundRobinRule即轮询获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务)
  4. WeightResponseTimeRule(对RoundRobinRule的拓展,响应速度越快的实例选择的权重越大)
  5. BestAvailableRule(过滤多次故障处于断路器跳闸状态的服务,然后选一个并非量最小的服务)
  6. AvailabilityFilteringRule(先过滤故障实例,然后选择并发量比较小的实例)
  7. ZoneAvoidanceRule(默认规则,复合判断server所在的区域的性能和server的可用性选择服务器)
  8. 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

image-20230114213855435

如下图所示,@ComponentScan在是springclooud这个类下,所以我们的Ribbon配置类不能放在springcloud包及其子包内

image-20230114214014211

上面的解释理清了Ribbon配置类的位置要求,下面编写配置类

1.关闭的Ribbon的负载均衡

image-20230115141735241

2.新建myrule包,与springcloud包同级

image-20230114214704277

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

image-20230114215628836

测试:

经过5次调用,可以看到Ribbon的负载均衡算法从默认的轮询替换为了随机

image-20230114220348362

posted @   yikolemon  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示