【Dubbo三】SSM集成Dubbo+Zookeeper实现服务化
2016-12-19 13:13
393 查看
前言
最近在做一个小项目,基于Maven构建,框架使用现在主流的:SpringMVC(4.1)+spring(4.1)+MyBatis(3.4.0),实现基本增删改查,页面国际化。数据源采用阿里开源的Druid,前端采用基于Bootstrap封装的模板AdminLTE(2.3.6)及Bootstrap的一些插件。上个周末刚好有时间,将项目进行拆分,集成Dubbo2.5.3+Zookeeper3.4.6,实现服务化。后续逐步将MQ、Reds等进行集成实现服务调用异步解耦、缓存机制等。前面两篇分别对Dubbo和Zookeeper进行介绍、安装、配置说明。
1、Dubbo介绍:http://blog.csdn.net/cyh1111/article/details/53737074
2、Zookeeper安装与配置:http://blog.csdn.net/cyh1111/article/details/53737902
3、SSM集成配置:http://blog.csdn.net/cyh1111/article/details/53641814
实现
本文创建两个工程,分别是:dubbo-service、dubbo-client,采用Maven构建。dubbo-service提供服务,提供数据增删改查服务,无页面及Controller。
dubbo_client提供页面访问,具体的增删改查条用dubbo-service远程服务。
Pom依赖
服务端和客户端一致。在SSM基础上加入Dubbo和Zookeeper依赖。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cyh</groupId> <artifactId>dubbo-service</artifactId> <packaging>war</packaging> <version>1.0.0.0</version> <name>dubbo-service</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- libs --> <junit.version>4.11</junit.version> <jstl.version>1.2</jstl.version> <javaee-api.version>7.0</javaee-api.version> <cglib.version>3.2.2</cglib.version> <aspectjrt.version>1.8.0</aspectjrt.version> <aspectjweaver.version>1.8.0</aspectjweaver.version> <spring.version>4.1.7.RELEASE</spring.version> <mybatis-spring.version>1.3.0</mybatis-spring.version> <mybatis.version>3.4.0</mybatis.version> <log4j.version>1.2.17</log4j.version> <slf4j.version>1.7.21</slf4j.version> <fileupload.version>1.3.1</fileupload.version> <mysql.version>5.1.35</mysql.version> <druid.version>1.0.19</druid.version> <fastjson.version>1.2.11</fastjson.version> <gson.version>2.3.1</gson.version> <!-- <commons-lang.version>2.6</commons-lang.version> <commons-io.version>2.5</commons-io.version> <jdom.version>2.0.2</jdom.version> <activeMQ.version>5.11.4</activeMQ.version> <javassist.version>3.12.1.GA</javassist.version> <transaction.version>1.1</transaction.version> --> </properties> <!-- 依赖包集合 --> <dependencies> <!-- 1. junit 依赖 begin junit3.0使用编程方式运行,junit4.0使用注解方式运行 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <!-- junit 依赖 end --> <!-- 2. Servlet web相关依赖 begin--> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>${javaee-api.version}</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- Servlet web相关依赖 end--> <!-- 3. aspectjweaver 依赖 begin --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectjweaver.version}</version> </dependency> <!-- aspectjweaver 依赖 end --> <!-- 4. spring依赖 begin--> <!-- spring核心依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- spring ioc依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!-- spring aop依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- spring 扩展依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!--spring dao层依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- spring web相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- spring test相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- spring依赖 end--> <!-- 5. mybatis依赖 begin--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!-- mybatis依赖 end--> <!-- 6. 数据库相关依赖 begin--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- 数据库相关依赖 end--> <!-- 7. log日志依赖 begin--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!--log日志依赖 end--> <!-- Dubbo 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- Zookeeper 依赖 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!-- 10. 其他依赖 begin --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <!-- fileupload 文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${fileupload.version}</version> </dependency> <!-- POI 相关依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency> <!-- 二维码依赖 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <!-- gson依赖 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>${gson.version}</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160212</version> </dependency> </dependencies> </project>
服务端配置
服务接口
/** * @描述:国家信息service接口 * @作者:CYH * @版本:V1.0 * @创建时间::2016-12-14 下午3:43:16 */ public interface IAreaService{ /** * 功能描述:获取所有国家信息 * @return */ public List<Area> getAllArea(); /** * 功能描述:根据条件获取国家信息 * @return */ public DatatablesView<Area> getAreaByCondition(QueryCondition query); /** * 功能描述:根据ID获取国家信息 * @param AreaId * @return */ public Area getAreaById(long areaId); /** * 功能描述:添加国家信息 * @param Area * @return */ public int addArea(Area area); /** * 功能描述:修改国家信息 * @param Area * @return */ public int editArea(Area area); /** * @功能描述:删除国家信息 * @param areaId * @return int */ public int removeArea(long areaId); }
实现
/** * @描述:国家信息service * @作者:CYH * @版本:V1.0 * @创建时间::2016-12-14 下午3:42:45 */ @Service("areaService") public class AreaService implements IAreaService{ @Resource private AreaDao areaDao; public DatatablesView<Area> getAreaByCondition(QueryCondition query) { DatatablesView<Area> dataView = new DatatablesView<Area>(); //构建查询条件 WherePrams where = areaDao.structureConditon(query); Long count = areaDao.count(where); List<Area> list = areaDao.list(where); dataView.setRecordsTotal(count.intValue()); dataView.setData(list); return dataView; } public List<Area> getAllArea(){ return areaDao.list(); } public Area getAreaById(long areaId){ return areaDao.get(areaId); } public int addArea(Area area){ return areaDao.addLocal(area); } public int editArea(Area area){ area.setUpdateTime(DateUtil.getNowTime()); WherePrams where = new WherePrams(); where.and("areaId", C.EQ, area.getAreaId()); return areaDao.updateLocal(area,where); } public int removeArea(long areaId){ return areaDao.del(areaId); } }
Dubbo服务声明
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubbo_provider" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 areaService 使用注解已经声明--> <dubbo:service interface="com.cyh.sy.service.IAreaService" ref="areaService" /> <!-- 声明需要暴露的服务接口 companyService使用注解已经声明--> <dubbo:service interface="com.cyh.sy.service.ICompanyService" ref="companyService" /> </beans>
Web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>zy</display-name> <!-- 自定义Listener --> <listener> <listener-class>com.cyh.sy.common.listener.Listener</listener-class> </listener> <!-- 加载Spring容器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 设置Spring容器加载配置文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config/spring-*.xml</param-value> </context-param> <!-- Spring 刷新Introspector防止内存泄露 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!--配置Springmvc核心控制器--> <servlet> <servlet-name>spmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>spmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <session-config> <session-timeout>60</session-timeout> </session-config> <welcome-file-list> <welcome-file>/</welcome-file> </welcome-file-list>
安装Dubbo-admin
需要将Zookeeper注册中心先启动。这里下载Dubbo-admin2.5.3.war,将war复制到Tomcat/webapp/ROOT/目录下,启动Tomcat
http://127.0.0.1:8803/dubbo-admin/ 用户名:root 密码:root
我这里安装了4个Tomcat分别是8800,8801,8802,8803,dubbo部署在第四个Tomcat中。
由于服务端和客户端都没有启用,所有服务、提供者、消费者均为0.
启动Service端
将Service部署在Tomcat1中,启动Tomcat1,刷新Dubbo-admin页面,查看已经有两个服务提供者。一个应用,两个服务提供者
具体服务
点击服务治理–服务,查看具体服务
客户端配置
接口声明
同样需要将服务接口在客户端声明。dubbo服务声明
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd" > <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubbo_consumer" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:reference interface="com.cyh.sy.service.IAreaService" id="areaService" check="false"/> <!-- 声明需要暴露的服务接口 --> <dubbo:reference interface="com.cyh.sy.service.ICompanyService" id="companyService" check="false"/> </beans>
实体类声明
说明:服务端和客户端中需要交互的实体类必须实现Serializable接口/** * @描述:国家信息实体 * @作者:CYH * @版本:V1.0 * @创建时间::2016-12-14 下午3:41:31 */ @SuppressWarnings("serial") public class Area implements Serializable{ private Long areaId; //国家ID private String areaIdStr; private String areaNameCn=""; //国家中文名称 private String areaNameEn; //国际英文名称 private String createTime; //创建时间 private String updateTime; //修改时间 public Area() { super(); } public Area(String areaNameCn, String areaNameEn) { this.areaNameCn = areaNameCn; this.areaNameEn = areaNameEn; } public Long getAreaId() { return areaId; } public void setAreaId(Long areaId) { this.areaIdStr = areaId.toString(); this.areaId = areaId; } public String getAreaIdStr() { return areaIdStr; } public void setAreaIdStr(String areaIdStr) { this.areaIdStr = areaIdStr; } public String getAreaNameCn() { return areaNameCn; } public void setAreaNameCn(String areaNameCn) { this.areaNameCn = areaNameCn; } public String getAreaNameEn() { return areaNameEn; } public void setAreaNameEn(String areaNameEn) { this.areaNameEn = areaNameEn; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getUpdateTime() { return updateTime; } public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } @Override public String toString() { return "Area [areaId=" + areaId + ", areaIdStr=" + areaIdStr + ", areaNameCn=" + areaNameCn + ", areaNameEn=" + areaNameEn + ", createTime=" + createTime + ", updateTime=" + updateTime + "]"; } }
客户端部署启用
将client部署在Tomcat2中,启动Tomcat2,刷新Dubbo-admin页面,已经多了两个服务消费者。效果
打开http://127.0.0.1:8802/dubbo-client,可以正常登陆,增删改查,通过查看日志或者工程Debug,即可看到服务端已经开始提供服务。总结
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。主要核心部件:
• Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制.
• RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能
• Registry: 服务目录框架用于服务的注册和服务事件发布和订阅
源码地址:下载
相关文章推荐
- dubbo对传统ssm进行服务化改造的思路以及一些分布式工具实现的思路
- 以zookeeper为注册中心springmvc集成dubbo的服务实现
- Spring Boot 集成Dubbo+Zookeeper实现分布式架构
- dubbo学习之dubbo管理控制台装配及集成zookeeper集群部署(1)
- Zookeeper实现集群和负载均衡---(4)Zabbix集成集群监控
- zookeeper集群与Dubbo的实现与整合
- Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- 一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
- Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务
- ZooKeeper集群搭建实例,以及集成dubbo时的配置
- dubbo学习之dubbo管理控制台装配及集成zookeeper集群部署(1)
- Netty+Zookeeper实现一个类似Dubbo的RPC框架
- dubbo学习之dubbo管理控制台装配及集成zookeeper集群部署(1)
- Zookeeper实现集群和负载均衡---(5)Zabbix集成Zookeeper示例
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例
- Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例
- NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(3)