01、Dubbo实战:消费者生产者模式搭建

据说写文章可以激发学习热情,所以我来了。谨以此激励下自己,也希望能帮助各位看官解决一些相同的技术问题。

准备出个Dubbo系列技术篇,把玩下最新的一些流行技术。

准备:IDEA 2019.02 / Gradle-5.4.1 / zookeeper 3.4.12 /JDK1.8

目标:IDEA + Dubbo搭建生产消费模型

步骤:

1、 JDK环境,gradle环境,请参考一些网络资料,这里不介绍同时强烈建议先对dubbo和RPC运行原理做了解,有助于理解以下内容马上被人质疑了,好好的Maven不用,gradle我不懂,别给我来这套我想说,不折腾,无进步,此学习之道也,你会发现新大陆;

2、 新建根项目,因为是建多module项目,根项目可以不必选勾选任何附加项,避免生成一些不必要的文件或目录选择自己的JDK,项目名为:“integrate”;

*

这里有个注意点:新建一个空gradle项目后,直接build失败,很是打击学习热情!

*

导致没法选择子module,

*

不过我寻遍四方,已有解药在此:

*

然后再build刷新一下,是不是很欣喜,CONFIGURE SUCCESSFUL in 7s

2、 在当前项目名右键,new-->module,这里勾选java,就会生成子module中的java常规目录,如src,main,java,resources,test等;

*

并且会自动生成一个属于该module的初始build.gradle文件,这个文件非常重要,相当于springboot中的pom.xml,说明如下,后续使用中会逐步丰富:

plugins: 插件,group:当前项目组别 version:版本

sourceCompatibility:源码兼容jdk版本 repositories:编译依赖下载点

dependencies: 依赖包 testCompile 编译阶段测试使用的依赖

*

3、 相同方法建立一共3个module:common,公共模块;consumer,消费者模块;provider,生产者模块,结构如下:;

*

*

整体项目结构说明在setting.gradle中:

*

另外有个点:关于根项目中的 build.gradle 和module中的 build.gradle:两者结构一样,根项目中的可以配置全局公共依赖,module中可配置独有的编译属性。

4、 建立common公共module的Interface:一个超级simple的方法,;

知识点:这里有default方法,这是java8的新特性,接口中不用实现的方法。另外,使用Interface变量代替Enum用作常量,为什么?在这争分夺秒的年代,要注意java运行效率问题,使用Enum不如Interface变量。

*

*

5、 建立生产者module:;

重点是@Service,这是

com.alibaba.dubbo.config.annotation.Service,不是Spring的

service,这里即注解该类为provider(生产者),sleepWhile可以自行加一些内容,如让程序休息3秒,模拟处理过程。


Thread.sleep(3000);


*

以下很重要,使用Spring的@Configuration进行Bean注入,一是@EnableDubbo,配合@Service,即可将dubbo服务注入,@PropertySource即指定properties文件的位置,使用ProviderConfig类和

RegistryConfig类进行dubbo相关配置,注意点:properties文件配置不能

API配置方法冲突,比如不能一个指定

dubbo.protocol.port=20880,一个指定20881,dubbo就蒙了,直接

提示confliction!亲测如此,请君自测,此学习之道也!


*

properties文件内容:

*

6、 启动类,在这里加了@DubboComponentScan,其实@EnableDubbo里包含了@DubboComponentScan,这里仅是为了认识一下,可以不加,;


*

7、 建立消费者:结构类似provider,;

只是这里使用ConsumerConfig类,这里注意:

consumerConfig.setCheck(false);//服务检查,可以先false,防止有些提供的服务还没完全加载,

会报错,


*

controller层做个测试调用:

*

启动类,我直接注释掉了@DubboComponentScan,没影响的,道理请上滑屏幕,

*

注意点:两个module的server端口不要重复,

*

8、 收获快乐的时候到了!步骤:启动ZK-->启动provider-->启动consumer;

开启ZK: bindXXXX ,ZK启动成功,

*

以下就是我想要的大结局!

*

复盘记:

1、 dubbo有三种配置方式,XML方式繁琐原始,抛弃!API方式,全部使用dubbo提供的API做配置,如以上的ConsumerConfig等注解方式@Service和@Reference,其实也不是纯注解,也要配合使用部分API,只是少使用了以下2个API而已,有点忽悠;

ReferenceConfig
ServiceConfig

2、 zookeeper可以下载window版本,cmd命令启动,使用curator进行连接,;

3、 gradle工具构建多module项目,只有根项目有setting.gradle描述项目结构,子项目无setting.gradle,即使有也无效果,其实gradle非常强大,可以自定义Task和plugin,比pom.xml内容少而精炼但是,我还是推荐使用maven,说多了,都是泪;

4、 公共的module不能使用springinitializr生成,否则其他module无法引用;

5、 consumer和provider引用common模块对象,设置:;

gradle中配置build.gradle进行引用设置:compile project(":common") 且配置sourceSets{}

6、 zk和curator注意版本搭配,否则连接错误!curator注意版本即可;

7、 gradle下载慢,可以配置repositories为alibaba的mavenrepository;

8、 查找各类依赖的推荐网站,各类版本加引用方法:https://mvnrepository.com/;

9、 对于可能的错误提示,亲测的一些水坑,我使用>>>>做标识输出;

*

10,源码地址:其中的 day01

https://github.com/xiexiaobiao/dubbo-project.git

11,码字不易,既然来了,点个赞再走吧!