Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行使用,Ribbon利用从Eureka中读取到服务信息,在调用服务提供者提供的服务时,会根据一定的算 法进行负载。
image.png

Ribbon高级应用

不需要引入额外的Jar坐标,因为在服务消费者中我们引用过的eureka-client,它会引用Ribbon相关Jar

1、引入轮询的注解

  1. // 使用RestTemplate模板对象进行远程调用
  2. @Bean
  3. @LoadBalanced
  4. public RestTemplate getRestTemplate() {
  5. return new RestTemplate();
  6. }
  7. 然后所有对外提供的接口服务都使用注入进来,然后进行远程调用
  8. @Autowired
  9. private RestTemplate restTemplate;

2、服务提供者

其服务的路径是/resume/openstate/{userId}

  1. @RestController
  2. @RequestMapping("/resume")
  3. public class ResumeController {
  4. @Autowired
  5. private ResumeService resumeService;
  6. @Value("${server.port}")
  7. private Integer port;
  8. //"/resume/openstate/1545132"
  9. @GetMapping("/openstate/{userId}")
  10. public Integer findDefaultResumeState(@PathVariable Long userId) throws Exception {
  11. //return resumeService.findDefaultResumeByUserId(userId).getIsOpenResume();
  12. System.out.println("====>>>>>>>>>>>>>>我是8081,访问到我这里了......");
  13. return port;
  14. }
  15. }

3、消费端

也是根据这个路径去请求的,先将restTemplate注入

  1. @Autowired
  2. private RestTemplate restTemplate;
  3. @Test
  4. public void testRibbon() {
  5. // 客户端面对的其实是服务了----lagou-service-resume,具体访问到哪个实例是由ribbon决定的
  6. String url = "http://lagou-service-resume/resume/openstate/1545132";
  7. // 调用远程服务—> 简历微服务接口 RestTemplate -> JdbcTempate
  8. // httpclient封装好多内容进行远程调用
  9. Integer forObject = restTemplate.getForObject(url, Integer.class);
  10. System.out.println("=====》》》使用ribbon负载均衡访问,访问的服务实例的端口号:" + forObject);
  11. }

Ribbon负载均衡策略

在yml的配置文件中,修改负载均衡策略

  1. #针对的被调用方的微服务名称,不加就是全局失效
  2. lagou-service-resume: #如果是全局生效就把这个具体的服务名取消即可,其他往前移动
  3. ribbon:
  4. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载策略调整

Ribbon的工作原理 image.png

思考:Ribbon在做什么: 当我们访问http://lagou-service-resume/resume/openstate/的时候,ribbon应该 根据服务名lagou-service-resume获取到该服务的实例列表并按照⼀定的负载均衡 策略从实例列表中获取一个实例Server,并最终通过RestTemplate进行请求访问

Ribbon细节结构图

(涉及到底层的一些组件/类的描述) 1)获取服务实例列表 2)从列表中选择一个server
image.png
图中核心是负载均衡管理器LoadBalancer(总的协调者,相当于大脑,为了做事 情,协调四肢),围绕它周围的多有IRule、IPing等
IRule:是在选择实例的时候的负载均衡策略对象
IPing:是用来向服务发起心跳检测的,通过心跳检测来判断该服务是否可用
ServerListFilter:根据一些规则过滤传入的服务实例列表
ServerListUpdater:定义了一系列的对服务列表的更新操作