提纲:

🔥服务注册 & 调用

  • 功能

  • 解决的问题

  • 工作流程

  • Ribbon负载均衡策略

  • Open Feign

一、服务注册 & 调用

1. 功能

  • 1、服务注册:微服务提供者将服务信息提供给注册中心

  • 2、服务发现:微服务消费者通过注册中心找到服务提供者的具体信息,通过这些信息去访问具体的服务提供者

  • 3、服务剔除:如果通过心跳检测发现服务不可用,就将服务进行剔除

2.解决的问题

  • 1、解耦:使用 RestTemplate 或 Feign 调用需要知道微服务提供者的 ip 地址与端口,且服务提供者一旦宕机就需要修改远程调用的地址,使用 Nacos 配合 Feign,可以直接将服务名作为调用的资源路径,由注册中心根据服务状态即负载均衡算法返回一个可用的服务提供者

  • 2、负载均衡:降低服务端负载均衡组件(Nginx 等)的压力,对于大型分布式应用,一般会有多层负载,其中 Nacos 等注册中心属于客户端负载,Nginx 等组件属于服务端负载

    • 在服务端由中间件 Nginx 负责负载均衡,代码侵入少,可跨语言跨平台,缺点在于所有请求都要穿透 Nginx,对服务端压力大

    • 从注册中心拉取可用的服务列表,在本地完成负载均衡算法,并进行调用,优点是对服务端压力小,缺点是依赖于组件与平台,不同语言与平台间的可移植性差

3.工作流程

  • 1、在服务启动时从 Nacos 服务端获取所有服务实例的注册信息并保存在本地,并每隔一段时间向 Nacos 服务端发出一次 ping,检查服务列表中服务的状态与数量是否发生改变,若发生改变则通过 pull 拉取新的服务

  • 2、服务实例会每隔一段时间向 Nacos 服务端发送心跳检测,若未收到心跳检测则剔除该节点,需要手动去重新启动该节点的服务重新注册

  • 3、Nacos 不仅支持 Client 主动 pull 拉取信息,还支持一种非临时的微服务提供实例,对于非临时实例,Nacos 在心跳检测失败后不会将其剔除,并且会定期通过 push 主动向 Client 传递非临时实例信息

  • 4、负载均衡组件 Ribbon:底层集成了 LoadBalanceClient,默认的负载均衡策略是 WeightedResponseTimeRule,即加权轮询的方式,可以为性能较强的机器配置更高的权重,性能较弱的机器配置较低的权重,合理分配请求

4.Ribbon 负载均衡策略

  • 1、Random Rule:随机选择列表中的服务,直到选到一个可用的为止

  • 2、Round Robin Rule:轮询的方式,将收到的请求逐一分发

  • 3、Retry Rule:重试策略,PlanA 选择服务失败后使用 PlanB 选择直至成功

  • 4、Predicate Base Rule:可用性过滤策略,在轮询的基础上,排除掉连接失败和高并发连接的服务节点

  • 5、Weighted Response Time Rule:响应时间权重策略,根据服务的响应时间分配权重

  • 6、Best Available Rule:最高可用策略,每次通过轮询查找并发度最低的节点,缺点是每一次调用都需要轮询,服务过多的情况可能性能低

  • 7、Zone Avoidance Rule:区域权重策略

5.Open Feign

  • 特点:对 HTTPClient 等远程调用组件进行了封装,支持 Spring 注解开发使用,并且集成了 Ribbon 负载均衡组件

  • 原理

    • FeignClient 接口的实现

      • 1、FeignClient 是通过 JDK 动态代理的方式来实现的,因此必须要采用接口的方式编写远程调用服务

      • 2、在动态代理前,解析 RequestMapping 注解中的访问资源 url 并包装,得到一个方法与 MethodHandler 的 Map 映射

      • 3、创建代理类,由 map 映射中方法具体的 MethodHandler 完成 HTTP 调用,并将调用结果反序列化为对象返回


相关阅读: