根据前面的介绍,目前我们的系统规划了3个dubbo服务提供者模块:权限服务、房源服务与会员服务,及2个服务消费者模块:尚好房管理平台(web-admin)与网站前端(web-front)
当前我们项目为单体的SSM项目,目前开发了权限管理的用户管理与角色管理,接着要开发房源管理的数据字典、小区管理与房源管理,权限管理与房源管理属于两不同的dubbo服务,当前我们就来把单体架构拆分为dubbo通信的分布式架构,拆分步骤:
1、shf-parent模块管理dubbo相关的依赖
2、common-util模块引入依赖
3、提取api接口模块:service-api
4、分解web-admin模块:
web-admin作为服务消费者,只负责dubbo消费端
service及dao层作为服务提供者,通过dubbo发布服务
在shf-parent模块pom.xml新增依赖(第一天搭建环境的时候已经添加,不用重复添加)
版本锁定
<dubbo.version>2.6.0dubbo.version>
<zookeeper.version>3.4.7zookeeper.version>
<junit.version>4.12junit.version>
<zkclient.version>0.1zkclient.version>
管理依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
<version>${dubbo.version}version>
dependency>
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>${zookeeper.version}version>
dependency>
<dependency>
<groupId>com.github.sgroschupfgroupId>
<artifactId>zkclientartifactId>
<version>${zkclient.version}version>
dependency>
<dependency>
<groupId>javassistgroupId>
<artifactId>javassistartifactId>
<version>3.12.1.GAversion>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
<version>1.10version>
dependency>
在common-util模块pom.xml引入依赖(第一天搭建环境的时候已经添加,不用重复添加)
<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
dependency>
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
dependency>
<dependency>
<groupId>com.github.sgroschupfgroupId>
<artifactId>zkclientartifactId>
dependency>
<dependency>
<groupId>javassistgroupId>
<artifactId>javassistartifactId>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
dependency>
用于存放所有业务层接口
在shf-parent
工程中创建子工程service-api
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shf-parentartifactId>
<groupId>com.atguigugroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>service-apiartifactId>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>common-utilartifactId>
<version>1.0version>
dependency>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>modelartifactId>
<version>1.0version>
dependency>
dependencies>
project>
复制AdminService
与RoleService
到service-api
模块的com.atguigu.service
包中
在shf-parent
工程中搭建子工程命名为service
,这个工程作为所有服务提供者的父工程
删除service
工程的src
目录
修改service
工程的pom.xml
文件
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shf-parentartifactId>
<groupId>com.atguigugroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>serviceartifactId>
<packaging>pompackaging>
<dependencies>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>service-apiartifactId>
<version>1.0version>
dependency>
dependencies>
project>
在service
工程中创建子工程service-acl
子工程,并且使用插件将其转成javaweb
项目
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>serviceartifactId>
<groupId>com.atguigugroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>service-aclartifactId>
<packaging>warpackaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-maven-pluginartifactId>
<version>9.4.15.v20190215version>
<configuration>
<scanIntervalSeconds>2scanIntervalSeconds>
<webAppConfig>
<contextPath>/contextPath>
webAppConfig>
<httpConnector>
<port>7001port>
httpConnector>
configuration>
plugin>
plugins>
build>
project>
拷贝web-admin
工程中的业务层和持久层内容
创建相同的业务层和持久层包结构
拷贝AdminServiceImpl
和RoleServiceImpl
实现类到com.atguigu.service.impl
包
替换业务层实现类上的@Service
注解为Dubbo的Service注解
@Service(interfaceClass = AdminService.class)
@Transactional(propagation = Propagation.REQUIRED)
public class AdminServiceImpl extends BaseServiceImpl<Admin> implements AdminService {
@Service(interfaceClass = RoleService.class)
@Transactional(propagation = Propagation.REQUIRED)
public class RoleServiceImpl extends BaseServiceImpl<Role> implements RoleService{
拷贝持久层接口AdminMapper
和RoleMapper
到com.atguigu.mapper
包中
拷贝mappers
目录到resources
目录中
拷贝日志配置文件和jdbc.properties
文件到resources
目录中
拷贝spring-persist.xml
和spring-service.xml
到resources/spring
目录中
修改spring-service.xml
配置文件
① 删除包扫描配置,因为包扫描应该有dubbo完成,进行服务发布
② 修改事务注解驱动配置
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
添加发布dubbo服务的配置文件:spring/spring-registry.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="service-acl"/>
<dubbo:protocol name="dubbo" port="20881"/>
<dubbo:registry address="zookeeper://localhost:2181" />
<dubbo:annotation package="com.atguigu"/>
beans>
修改web.xml
文件
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/spring-*.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
web-app>
注意: spring-service.xml
文件中可以不使用import
标签导入spring-persist.xml
了
在shf-parent
工程中搭建子工程命名为web
,这个工程作为所有服务消费者的父工程
删除web
工程的src
目录
修改web
工程的pom.xml
文件
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>shf-parentartifactId>
<groupId>com.atguigugroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>webartifactId>
<packaging>pompackaging>
<dependencies>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>service-apiartifactId>
<version>1.0version>
dependency>
dependencies>
project>
① 将web-admin
移动到web
模块中
② 删除shf-parent
模块pom.xml
文件的
标签,该模块已移动到web模块
③ 在web
模块的pom.xml
中新增
<modules>
<module>web-adminmodule>
modules>
修改了父模块为web,删除了依赖(父模块已引入依赖)
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>webartifactId>
<groupId>com.atguigugroupId>
<version>1.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>web-adminartifactId>
<packaging>warpackaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-maven-pluginartifactId>
<version>9.4.15.v20190215version>
<configuration>
<scanIntervalSeconds>2scanIntervalSeconds>
<webAppConfig>
<contextPath>/contextPath>
webAppConfig>
<httpConnector>
<port>8000port>
httpConnector>
configuration>
plugin>
plugins>
build>
project>
① 删除com.atguigu.service
包和com.atguigu.mapper
包
② 删除resources/mappers
目录
③ 删除resources/spring/spring-service.xml
和resources/spring/spring-persist.xml
文件
创建resources/spring/spring-registry.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="web-admin"/>
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:annotation package="com.atguigu"/>
<dubbo:consumer check="false" timeout="600000">dubbo:consumer>
beans>
删除ContextLoadListener
和comtext-param
配置,并且将加载的配置文件路径改成classpath:spring/spring-*.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/spring-*.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
将表现层注入服务对象的@Autowired
注解改成@Reference
注解
@Reference
private AdminService adminService;
@Reference
private RoleService roleService;
① 在shf-parent
项目中执行install
② 启动zookeeper
③ 使用jetty
插件启动service-acl
与web-admin
模块
④ 访问:http://localhost:8000/