本文主要是介绍dubbo服务过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
dubbo服务暴露过程
- Dubbo通过实现ApplicationListener接口,监听了容器刷新的事件,再容器刷新后调用onApplicationEvent方法,这个是服务暴露的启动点
- 通过识别带目标注解的服务类通过动态代理统一暴露出Invoker,如何通过配置文件以及目标协议(SPI机制)封装成exporter存储起来
- 如果是本地注册,将exporter存入ServiceConfig的缓存,如果是远程暴露,先获取注册中心的配置,进行注册中心的注册URL,然后往一个ConcurrentHashMap存储接口的全限定名以及exporter,接着打开server通过socket监听服务
- 如果有服务调用,根据注册中心的URL找到对应的exporter,再根据协议解析得到原始的实现类进行调用
dubbo引入过程
- 服务启动点的流程有两种:一种是饿汉式,通过调用afterPropertiesSet方法引入服务。一种是懒汉式,只有当这个服务被注入到其他类中启动引入流程(也就是用到才开始注入)利用的是实现FactoryBean接口,当对任意服务Interface进行自动注入或者getBean获取时,就会触发。默认所使用的是饿汉式
- 引入过程有三种情况:①本地引入走injvm协议,到服务暴露的缓存中去exporter②直连远程引入服务,直接写死Provider地址(一般测试时候用)③注册中心引入远程服务,Consumer通过注册中心得知Provider的相关信息,然后进行服务的引入
- 一般是注册中心,他需要获取注册中心实例,向注册中心注册自身,并订阅Provider节点等相关信息,通过配置文件的信息来构造一个URL,通过URL上的协议以及利用自适应扩展机制调用得到对应的invoker,然后通过invoker构建代理,封装invoker返回服务引用,之后consumer调用这个代理类(这个代理类对应多个invoker后面进行负载均衡调用)
dubbo服务调用过程
- 要是本地调用直接调用缓存的exporter就可以了
- 要是调用远程的,需要调用某个接口的方法会调用之前生成的代理类,然后会从invoker集群中通过负载均衡选择一个invoker发起远程调用。这个时候会记录此请求的ID等待服务端的响应
- 服务端接受请求之后会通过参数(接口的全限定名)找到之前暴露存储的map,得到对应的exporter然后找到invoker最终调用真正的实现类,然后再组装好结果返回,这个结果会带上之前请求的ID
- 消费者根据响应的id找到正确记录的请求,然后找到请求之后将响应塞到对应的Future中,唤醒等待的线程,最终得到响应
这篇关于dubbo服务过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!