据说写文章可以激发学习热情,所以我来了。谨以此激励下自己,也希望能帮助各位看官解决一些相同的技术问题。
准备出个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,码字不易,既然来了,点个赞再走吧!