dubbo学习总结

        对应dubbo来说,相信很多人都听说过,也有很多人都使用过,我们也可以通过官网文档(http://dubbo.apache.org/zh-cn/docs/user/quick-start.html)进行学习,目前官方文档介绍的是2.6.4的版本,跟目前2.7.x的版本相差也有点远了,很多代码都进行了重构,比如说DefaultFuture,在2.6.4版本中它实现了ResponseFuture接口,在接收到服务端返回的消息后通过doReceived(Response res)的done.signal()方法来将线程唤醒告知其消息已经正常返回,但是在2.7.x的版本中它却继承了java.util.concurrent.CompletableFuture类,它直接通过CompletableFuture的complete()方法来直接实现了线程的消息完成操作。目前2.7.x的dubbo只支持Java 8+的环境。

        对于dubbo来说主要就是用来进行分布式的远程服务调用,如果从简单的角度来讲我们只需要实现客户端通过网络连接服务端应用即可,即client+transport+server就可以实现一套远端服务调用了,但是为了更好的管理客户端和服务端的连接以及实现服务治理,dubbo提供了注册中心管理客户端和服务端的对象,同时针对多个服务端的时候提供了loadbalance机制进行服务端连接的选取,在服务端连接出错的时候提供了容错机制,以及当容错机制提供的操作完成后仍不能解决的mock机制即在客户端返回默认值,有时候我们也可以对客户端和服务端的连接进行路由配置,有点类似于黑白名单,指定客户端只能连接某些ip的服务端或者服务端只接收来自某些ip的客户端的请求,这个路由我们也可以通过dubbo admin去配置,这些内容都在官方文档里面有具体的说明,到时自己去翻阅下。

       通过官方文档我们自己需要去了解下各种参考手册,通过参考手册能够快速的上手服务的配置,在dubbo中最重要的就是URL,在URL上面我们会把大多数的配置放在里面,在代码中进行各种获取操作的时候基本都是通过URL来进行获取的。在dubbo中针对各种不同的配置采用了SPI的方式进行扩展,这里的SPI和Java的SPI不一样,这个是dubbo自己进行扩展了的,如果需要自己扩展某一类型的SPI,需要在自己的项目路径下面新建目录如META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory的全限定名文件。针对扩展点的加载dubbo提供了ExtensionLoader.getExtensionLoader(xxx.class).getExtension(extensionName)来进行运行时的加载,xxx表示具体的需要加载的扩展接口类,extensionName表示定义好了的扩展的实现类,通过这种加载方式,我们就可以根据需要完全动态生成代理类在具体调用时使用,这个代理类的生成是保存在内存中的,并没有实际输出任何的class文件。

       在源码的阅读上面,其实官网已经介绍的非常清楚了,虽然跟现在的版本有点脱节,但是对比起来还是可以阅读的,因为现在dubbo托管到了Apache下面,所以在很多类上面都做了修改,但是为了兼容以前的老版本,在2.7.x的版本中以前的com.alibaba目录下的代码都继承了新的org.apache目录的类,源码阅读根据官网从上往下分析也会得出一个代码的加载顺序其实就是按照这个源码阅读的顺序来的,先要进行SPI扩展类的加载同时进行URL地址的拼接,毕竟URL是整个dubbo的中心,SPI加载完成后就可以将服务端需要提供的服务导出到注册中心进行注册,注册完成后客户端就可以从注册中心进行服务的引入了,同时客户端也把自己的信息注册到注册中心从而实现服务治理,在客户端引入服务后,那么我们需要怎么来实现远程调用,这个在前面也已经说明过,最后服务调用过程的源码分析基本就把整个dubbo应用串联起来了,这个里面主要分析了序列化,编解码以及服务的请求和响应过程中涉及到的handler、invoker、netty的一系列调用流程。

       以上就是dubbo的一些学习总结,总之还是需要多去官网看看它的一些描述定义,因为是alibaba提供的,所以有中文文档,不用担心看不懂,这个还是需要在实际开发中才能纯熟记住,看了几遍后也只能有个大概的模糊印象,因为没有实际的业务场景,所以自己只是写了一个小demo,采用了springboot+dubbo的xml+注解的形式,xml主要用于服务端,注解在客户端使用,地址是https://github.com/422518490/spring-boot-dubbo 。

     下面有一点小疑问是关于@Method注解的用法,这个注解目前只能在别的注解上面使用,但是定义好新的注解后怎么让这个新注解起作用呢,没有搞明白,难道还需要自己去把这个新注解获取出来去解析一遍,即使这样,但是怎么起作用呢,没有搞明白,希望了解的朋友告知下。

猜你喜欢

转载自www.iteye.com/blog/357029540-2443537
今日推荐