扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理(自编总结)
Nacos:
- Nacos是一个注册中心和配置中心
- 客户端和服务端:
- 服务端需要单独部署,用来保存服务实例数据的
- 客户端就是用来跟服务端通信的SDK,支持不同语言
- 服务注册到Nacos服务端的时候,在服务端内部会有一个集合去存储服务的信息,服务注册表。
- 如何进行服务自动注册?
- 服务实例数据封装--Registration:Registration是SpringCloud提供的一个接口,继承了ServiceInstance接口。
- ServiceRegistry也是个接口,泛型就是上面提到的服务实例数据封装的接口。这个接口的作用就是把上面封装的当前服务的数据Registration注册通过register方法注册到注册中心中。
- 服务自动注册--AutoServiceRegistration,AutoServiceRegistration是一个标记接口,所以本身没有实际的意义,仅仅代表了自动注册的意思。AutoServiceRegistration有个抽象实现AbstractAutoServiceRegistration。AbstractAutoServiceRegistration实现了ApplicationListener,监听了WebServerInitializedEvent事件。SpringBoot项目启动,最终就会调用ServiceRegistry注册Registration,实现服务自动注册。
Ribbon:
- Ribbon是负载均衡组件,他的作用就是从众多的服务实例中根据一定的算法选择一个服务实例。
- Ribbon提供了一个获取服务实例的接口,叫ServerList,会基于这些数据来做负载均衡的。Nacos自然而然也实现了ServerList接口,为Ribbon提供Nacos注册中心中的服务数据。
- Ribbon的缺点:
- SpringCloud和Ribbon的耦合问题:Ribbon本身是一个具体的负载均衡组件,注册中心要想整合SpringCloud,还得需要单独去适配Ribbon。SpringCloud本身就是一套约束、规范,只要遵守这套规范,那么就可以实现各个组件的替换,这就是为什么换个注册中心只需要换个依赖,改个配置文件就行。就类似mybatis一样,mybatis依靠jdbc,但是mybatis根本不关心哪个数据库实现的jdbc。
- Ribbon已经不维护了
- 解决:而SpringCloud实际上是提供了这么一个获取服务实例的api,DiscoveryClient,随着Ribbon等组件停止维护之后,SpringCloud官方自己也搞了一个负载均衡组件
loadbalancer
,用来平替Ribbon。
OpenFeign:
- OpenFeign是一个rpc框架,当我们需要调用远程服务的时候,只需要声明个接口就可以远程调用了。其实本质上就是后面会为接口创建一个动态代理对象,解析类上,方法上的注解。
- 当调用方法的时候,会根据方法上面的参数拼接一个http请求地址,这个地址的格式是这样的
http://服务名/接口路径
。 - Ribbon就会从注册中心获取到的服务实例中根据负载均衡策略选择一个服务实例返回给OpenFeign。OpenFeign拿到了服务实例,此时就获取到了服务所在的ip和端口,接下来就会重新构建请求路径,将路径中的服务名替换成ip和端口。
loadbalancer
,其实也是一样的,他也会根据负载均衡算法,从DiscoveryClient获取到的服务实例中选择一个服务实例给OpenFeign,后面也会根据服务实例重构url,再发送http请求。