这两天用dubbo做了个案例,记录学习情况。dubbo的基本介绍省略,上一篇笔记中有记录,本次笔记只记录本次项目。
在做项目之前先搭建一个zookeeper集群,这个之前已经做过了,不说步骤。
dubbo入门案例:
创建一个provider工程项目,类型为jar类型,我的目录结构是这样的
首先工程创建完之后在pom文件中添加dubbo的gav坐标,由于2.5.3以及以下的版本对于spring的支持不太友好,只支持低版本spring,需要手动去除依赖,再添加自己要的版本的spring的依赖,所以采用2.5.4版本的dubbo。
先创建服务:就是编写接口和接口的实现类,之后要配置服务,新建一个spring配置文件命名为applicationContext-dubbo.xml或者application-dubbo.xml。添加好约束之后使用<dubbo:来进行配置:
配置完成之后要启动测试provider,首先在虚拟机中将zookeeper集群启动,然后将provider发布到zookeeper注册中心中。测试时要先加载spring配置文件,有两种方式,通过调用ApplicationContext的父类的实例化对象的start()方法,不过这样调用发布之后直接就会直接就停止服务,所以需要调用系统的System.in.read();让线程阻塞。还可以通过使用dubbo提供的Main类调用main()方法传入主方法中的参数,这种启动方式自带线程阻塞,支持优雅关系,不过这样启动的话需要将配置文件放在src/main/resources目录下的META-INF目录下的spring文件夹中,因为Main启动默认从该路径找spring配置文件。
启动时可能会报异常,因为需要依赖zookeeper基于java的客户端工具,需要依赖jar包:
启动成功
在zookeeper中使用zkCli.sh连接zookeeper服务可以查看服务信息,本来应该没有这么多接口的,但是后面做的crud中的provider也提交到注册中心了,所以都在这里能看到:
由于在这里查看服务不太方便,所以使用了一个admin管理平台,admin管理平台是一个war项目,使用upzip命令来解压该包,将解压出来的ROOT文件夹替换掉tomcat中webapps下的ROOT文件夹,可以对admin管理平台进行配置,zookeeper集群中给一个地址即可,用户名密码我使用默认,下面这张图ip地址不是我自己的。
在浏览器中输入http://192.168.xxx.xxx:8080即可访问,我用root用户登录:
在服务治理中可以查看服务提供者和消费者:
完成之后编写消费端,创建jar工程,在pom文件中依赖dubbo和zkclient的jar包,编写接口和实现类,然后编写配置文件:
然后编写测试类,测试以及测试结果如下:
入门案例结束,学到了很多,例如dubbo的使用以及provider和consumer。接下来做个实战小案例,完成对一张用户表的crud操作表中有userid(PRIMARY),username,userage三个属性,使用SOA面向服务架构。结构如下:依照如下结构图建立的工程
配置文件较多不再粘贴,源码直接分享百度云https://pan.baidu.com/s/1e219n92Y_KQMZ7FwxOCGxA 提取码4pef
接下来使用assembly打包插件,在provider服务项目的根目录下建一个名为assembly的目录,将解压的打包插件中的lib和conf目录放到assembly目录下,将conf目录下的dubbo.properties文件清空,在assembly根目录下创建一个assembly.xml的配置文件,修改项目的pom文件添加assembly的打包插件,对该项目install。
由于本机的虚拟机只开了一台常用的,分布部署provider和consumer时候需要部署provider的那台没有开,就不说分布部署了,只说一下环境,需要安装jdk,tomcat和mysql数据库。分布部署consumer时候需要依赖tomcat完成热部署,所以在consumer的Service工程中需要添加热部署插件,然后部署。
所以这里只记录在一台虚拟机 下部署项目的例子。首先由于provider的项目类型是jar类型,所以需要手动将接口等提交到注册中心,要不然启动consumer会报无法注入的错误。这里写了一个类用于提交:
提交之后在管理中心可以看到提交的所有接口,由于在provider中接口我是分开写的,所以这里就会有几个都被提交上来了:
接下来启动consumer端,启动之后访问页面,可以完成对user表的简单增删改查
有一点我觉得需要注意一下,在运行项目的时候需要将项目先进行打包,顺序不能出错,从parent开始打,然后打provider最后打consumer,要不然运行时会报错。