闲来无事想练手一下springboot+dubbo+zk,因为公司的架构不支持(比较low,RPC用的还是ESB 这种比较年久的东西了)
所以只好自己本地整下,以后工作要用到也不至于踩坑,提前踩了.
搭建过程参考了网上很多文章,磕磕绊绊,最后还是搭建成功了,看了数篇文章后,最推荐的还是这篇,讲的比较详细,但是实际搭建起来还是有出入的地方, 后面一边填坑一边说
参考大佬文章:https://www.jianshu.com/p/6acfb2398bf4
----------------------------------------------踩坑的分割线----------------------------------------------
坑1. error:java: 无效的源发行版: 11
因为我用的IDEA构建的项目,想着写demo的话就干脆重新来过,于是就简单生成了一个SpringBoot项目
此处我什么都没有点,直接下一步了, 于是在启动时一直报编译错误,检查了jdk的版本,也一直是1.8没错.搞得我头都大了.然后在无意间看到pom文件里的 <properties> 里有个参数 java.version = 11. 然后把它删掉.重新编译就过了..
坑2. 怎么也启动不了的springboot
结果在启动项目时一直报无法连接到 127.0.0.1:63747(随机端口). 查了很久,都是说端口被占用,但是我们配置文件里的server.port :8090 严格来说应该不会被占用才对, 后来有一个不起眼的回答说的是IDEA在构建简单spring项目时,jar包引入的不对. 要启动的jar应为 spring-boot-starter-web . 而默认引用的为 spring-boot-starter,导致启动不了.
唉,委实是平时能新建项目的机会不多,而且每个公司都有自己的架构,难得犯一次低级错误,记下了
坑3. 半天也启动不了的tomcat
在搭建过程中,我们需要启动tomcat,来启动dubbo-admin.war项目, 来检查服务是否已经注册到zk上, 于是就捣鼓了半天,下载了war包,解压放进tomcat/webapps项目下,然后启动.然后大半天也不见有反应,一直停在 INFO zkclient.ZkEventThread - Starting ZkClient event thread. (为此我还专门去上了个厕所,回来一看,咋还是在这里没有动),于是很愚蠢的发现是不是我的zk没有启动,于是一启动zk,就很顺畅的启动了tomcat.
坑4. 启动后无法注册
奇怪的是我按照上面大佬的文章一步一步配置dubbo,zk, 但是我在dubbo-admin界面里仍然看不到注册的provider.查了一会也不知道大家在说啥, 但是有一个大佬说在启动类上加上注解 @EnableDubbo 就可以了,于是试着加了一下,但是又报一个奇怪的错误
java.lang.IllegalStateException: No such application config! Please add <dubbo:application name="..." /> to your spring config.
对于这种奇怪的错误现在我已经见怪不怪了. 前面说了下,我搭建项目的时候参考了起码4篇文章,那在引入pom文件的地方每片文章都不一样,最后用的哪种也忘了.这里讲一下, dubbo的包有两种版本,一种是spring的,一种是alibaba的,两种包的配置文部分有小小的出入,spring相关的配置文件用的是spring.dubbo.application.name=,而alibaba的配置文件用的是dubbo.application.name=, 两者不要弄混了.
坑5. consumer不能直接用controller调用@Reference的接口,还是得调用你本项目的接口,再由本项目的接口调用dubbo接口
坑6.服务名与服务接口所在包要与服务端提供的一致
其实这点我非常不理解,这就强制了大家在调用服务的时候必须要在相同的包结构下写一个相同的interface及方法.那我要是对接的数量多了呢? 10个项目,20个项目?对比起来ESB就很简单, ESB可以写一个ESBclient 然后在服务启动时将这个ESBclient当成一个实例注册在工厂里,只要出入参一致,加个注解就行.对于dubbo还需要做这么多无用功, 我更觉得匹配一个ID之类的方法会更好.