您的位置:首页 > 编程语言 > Java开发

【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: 服务目录框架用于服务的注册和服务事件发布和订阅

源码地址:下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐