Dubbo的服务注册和暴露过程
首先了解一下Dubbo是什么
Dubbo是阿里开源的一款分布式微服务开发框架,它提供了RPC通信和微服务治理两大能力,使用Dubbo开发的微服务,具备远程发现与通信能力,同时Dubbo提供了服务发现、负载均衡、流量调度能力。
1.Dubbo的工作流程
- 启动spring容器时,自动启动Dubbo的Provider
- Provider启动后会到注册中心注册内容,包括ip、端口、接口列表、版本、协议等信息
- Consumer启动时,自动去注册中心获取已注册的服务信息
- 当provider的信息发生变化时,自动向注册中心推送通知,注册中心再通知Comsumer
Dubbo服务暴露过程
Dubbo采用url的方式约定参数类型
1.基于spring的事件回调机制,监听ContextRefresh事件,在springIOC容器刷新完成后,出发服务暴露。根据dubbo的配置得到url,再根据url选择对应实现类,实现扩展。
2.通过javassit动态代理封装服务实现类,统一暴露出Invoker使得调用方便、屏蔽底层细节,然后封装成exporter存储起来,等待消费者调用,然后将url注册到注册中心,使消费者可以获取到服务提供者的信息。
面试题:dubbo的服务暴露过程
1、服务启动时根据dubbo的配置,组装成url
2、根据URL进行服务暴露、创建代理Invoker、根据URL的协议,通过SPI机制选择对应的实现类实现Exporter
3、如果只是本地暴露,将Exporter存入本地ServiceConfig缓存
4、远程暴露,将URL转换成Exporter,然后获取注册中心配置,将URL注册到注册中心,启动netty服务器,监听注册中心
Dubbo服务引入过程
1、获取注册中心实例,向注册中心注册消费者,订阅provider,订阅生产者注册协议、接口、ip和端口信息,cluster将多个invoker进行封装,返回一个invoker
2、根据注册中心的配置构建URL,再根据URL获取对应的Dubbo协议实现类构建Invoker。然后构建代理,封装Invoker返回服务引用,之后消费者调用代理类调用接口。
Dubbo服务调用过程
1、客户端调用某个接口的方法会调用服务引入过程生成的代理类,然后从cluster层经过过滤和负载均衡选择一个invoker进行远程调用,记录请求和请求的ID等待服务端的响应
2、服务端接受到请求后根据参数找到之前存储的map,找到exporter,通过exporter调用invoker找到真正的实现类,接口的具体实现类处理完请求后,组装结果返回,这个响应带有之前的请求ID
3、客户端收到响应以后根据ID找到之前记录的请求,把响应放到对应的future中,唤醒等待的线程,最后消费端得到响应
Dubbo支持的负载均衡策略
1、RandomLoadBalance随机负载均衡
2、LeastActive最小活跃数负载均衡
3、ConsistentHash一致性Hash负载均衡
4、RandomRobinLoadBalance加权轮询负载均衡
Dubbo支持的序列化方式
1、Java标准序列化,json序列化、Hession、KryO、FST
Dubbo支持的
1、dubbo协议(默认),适合小数据量、并发量大的服务调用
2、rmi协议,java标准的rmi协议,适用于并发量小、数据量也小的使用场景
3、hession协议,适用于大数据包,可传文件
4、http 协议,
5、webservice协议
6、thrift协议
7、memcached协议