尚好房 04_服务拆分

尚好房:服务拆分

一、业务介绍

1、项目模块划分

根据前面的介绍,目前我们的系统规划了3个dubbo服务提供者模块:权限服务、房源服务与会员服务,及2个服务消费者模块:尚好房管理平台(web-admin)与网站前端(web-front)

2、服务调用关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKmBjFpK-1661870386677)(images/01/img_001.png)]

3、项目拆分说明

当前我们项目为单体的SSM项目,目前开发了权限管理的用户管理与角色管理,接着要开发房源管理的数据字典、小区管理与房源管理,权限管理与房源管理属于两不同的dubbo服务,当前我们就来把单体架构拆分为dubbo通信的分布式架构,拆分步骤:

1、shf-parent模块管理dubbo相关的依赖

2、common-util模块引入依赖

3、提取api接口模块:service-api

4、分解web-admin模块:

​ web-admin作为服务消费者,只负责dubbo消费端

​ service及dao层作为服务提供者,通过dubbo发布服务

二、服务拆分

1、shf-parent模块添加dubbo依赖管理

在shf-parent模块pom.xml新增依赖(第一天搭建环境的时候已经添加,不用重复添加)

  1. 版本锁定

    <dubbo.version>2.6.0</dubbo.version>
    <zookeeper.version>3.4.7</zookeeper.version>
    <junit.version>4.12</junit.version>
    <zkclient.version>0.1</zkclient.version>
    
  2. 管理依赖

    <!-- dubbo相关 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>${zookeeper.version}</version>
    </dependency>
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>${zkclient.version}</version>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>
    

2、common-util模块引入依赖

在common-util模块pom.xml引入依赖(第一天搭建环境的时候已经添加,不用重复添加)

<!-- dubbo相关 -->
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>dubbo</artifactId>
</dependency>
<dependency>
 <groupId>org.apache.zookeeper</groupId>
 <artifactId>zookeeper</artifactId>
</dependency>
<dependency>
 <groupId>com.github.sgroschupf</groupId>
 <artifactId>zkclient</artifactId>
</dependency>
<dependency>
 <groupId>javassist</groupId>
 <artifactId>javassist</artifactId>
</dependency>
<dependency>
 <groupId>commons-codec</groupId>
 <artifactId>commons-codec</artifactId>
</dependency>

3、搭建service-api模块

用于存放所有业务层接口

3.1 创建工程

shf-parent工程中创建子工程service-api

3.2 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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-parent</artifactId>
        <groupId>com.atguigu</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>service-api</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>common-util</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>model</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>
3.3 复制service接口

复制AdminServiceRoleServiceservice-api模块的com.atguigu.service包中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZRKjU1Hp-1661870386682)(images/04/img_002.png)]

4、搭建服务提供者模块

4.1 搭建service父工程
  1. shf-parent工程中搭建子工程命名为service,这个工程作为所有服务提供者的父工程

  2. 删除service工程的src目录

  3. 修改service工程的pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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-parent</artifactId>
            <groupId>com.atguigu</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>service</artifactId>
        <packaging>pom</packaging>
    
        <dependencies>
            <dependency>
                <groupId>com.atguigu</groupId>
                <artifactId>service-api</artifactId>
                <version>1.0</version>
            </dependency>
        </dependencies>
    </project>
    
4.2 搭建service-acl工程
4.2.1 创建工程

service工程中创建子工程service-acl子工程,并且使用插件将其转成javaweb项目

4.2.2 修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<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>service</artifactId>
        <groupId>com.atguigu</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-acl</artifactId>
    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.15.v20190215</version>
                <configuration>
                    <!-- 如果检测到项目有更改则自动热部署,每隔n秒扫描一次。默认为0,即不扫描-->
                    <scanIntervalSeconds>2</scanIntervalSeconds>
                    <webAppConfig>
                        <!--指定web项目的根路径,默认为/ -->
                        <contextPath>/</contextPath>
                    </webAppConfig>
                    <httpConnector>
                        <!--端口号,默认 8080-->
                        <port>7001</port>
                    </httpConnector>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
4.2.3 拷贝代码

拷贝web-admin工程中的业务层和持久层内容

  1. 创建相同的业务层和持久层包结构

  2. 拷贝AdminServiceImplRoleServiceImpl实现类到com.atguigu.service.impl

  3. 替换业务层实现类上的@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{
    
  4. 拷贝持久层接口AdminMapperRoleMappercom.atguigu.mapper包中

  5. 拷贝mappers目录到resources目录中

  6. 拷贝日志配置文件和jdbc.properties文件到resources目录中

  7. 拷贝spring-persist.xmlspring-service.xmlresources/spring目录中

  8. 修改spring-service.xml配置文件

    ① 删除包扫描配置,因为包扫描应该有dubbo完成,进行服务发布

    ② 修改事务注解驱动配置

    <!--
        开启事务控制的注解支持
        注意:此处必须加入proxy-target-class="true",
              需要进行事务控制,会由Spring框架产生代理对象,
              Dubbo需要将Service发布为服务,要求必须使用cglib创建代理对象。
    -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    
  9. 添加发布dubbo服务的配置文件:spring/spring-registry.xml

    <?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: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"/>
        <!--配置协议名和端口,如果不配置的话,端口默认为20880-->
        <dubbo:protocol name="dubbo" port="20881"/>
        <!--配置注册中心地址-->
        <dubbo:registry address="zookeeper://localhost:2181" />
        <!--包扫描发布服务-->
        <dubbo:annotation package="com.atguigu"/>
    </beans>
    
  10. 修改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"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5">
        <!--配置ContextLoaderListener-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-*.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>
    

    注意: spring-service.xml文件中可以不使用import标签导入spring-persist.xml

5、搭建服务消费者模块

5.1 搭建web父工程
  1. shf-parent工程中搭建子工程命名为web,这个工程作为所有服务消费者的父工程

  2. 删除web工程的src目录

  3. 修改web工程的pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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-parent</artifactId>
            <groupId>com.atguigu</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>web</artifactId>
        <packaging>pom</packaging>
        <dependencies>
            <dependency>
                <groupId>com.atguigu</groupId>
                <artifactId>service-api</artifactId>
                <version>1.0</version>
            </dependency>
        </dependencies>
    </project>
    
5.2 搭建web-admin工程
5.2.1 移动模块

① 将web-admin移动到web模块中

② 删除shf-parent模块pom.xml文件的<module>web-admin</module>标签,该模块已移动到web模块

③ 在web模块的pom.xml中新增

<modules>
    <module>web-admin</module>
</modules>
5.2.2 修改web-admin工程的pom.xml

修改了父模块为web,删除了依赖(父模块已引入依赖)

<?xml version="1.0" encoding="UTF-8"?>

<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>web</artifactId>
        <groupId>com.atguigu</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>web-admin</artifactId>
    <packaging>war</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.15.v20190215</version>
                <configuration>
                    <scanIntervalSeconds>2</scanIntervalSeconds>
                    <webAppConfig>
                        <!--指定web项目的根路径,默认为/ -->
                        <contextPath>/</contextPath>
                    </webAppConfig>
                    <httpConnector>
                        <!--端口号,默认 8080-->
                        <port>8000</port>
                    </httpConnector>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
5.2.3 删除service与dao层

① 删除com.atguigu.service包和com.atguigu.mapper

② 删除resources/mappers目录

③ 删除resources/spring/spring-service.xmlresources/spring/spring-persist.xml文件

5.2.4 新增dubbo配置文件

创建resources/spring/spring-registry.xml

<?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: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包扫描-->
    <dubbo:annotation package="com.atguigu"/>
    <!--启动时候不检查 设置连接超时时间-->
    <dubbo:consumer check="false" timeout="600000"></dubbo:consumer>
</beans>
5.2.5 修改web.xml

删除ContextLoadListenercomtext-param配置,并且将加载的配置文件路径改成classpath:spring/spring-*.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"
         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>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--配置解决乱码的过滤器-->
    <!-- 配置过滤器解决 POST 请求的字符乱码问题 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!-- encoding参数指定要使用的字符集名称 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <!-- 请求强制编码 -->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!-- 响应强制编码 -->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
5.2.6 改造表现层

将表现层注入服务对象的@Autowired注解改成@Reference注解

@Reference
private AdminService adminService;
@Reference
private RoleService roleService;

6、测试

① 在shf-parent项目中执行install

② 启动zookeeper

③ 使用jetty插件启动service-aclweb-admin模块

④ 访问:http://localhost:8000/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值