• springboot 多模块 -- 将web拆分出去


    前言:

      之前将各层都拆分出去, 作为一个独立的可替换的子模块. 感觉比以前确实是灵活了一些.

      不管是电商项目, 还是现在公司做的项目, 其中, 有很多的业务逻辑, 都是一样的, 但是由于不在一个系统中, 大家需要进行重复的工作. 有的拷贝还好, 但是有的, 没法直接拷贝. 相当的蛋疼. 能不能, 将业务逻辑独立出去, 供所有的展示层调用呢? 

      是不是可以使用前一篇介绍的 dubbo 呢?

    框架改造:

      前一篇, 通过多模块, 将各层拆分出去, 各自变成了一个独立的项目. 这里, 先将之前的稍微修改了下, 主要是改了项目名称, 加了一个common项目, 放一些共用的东西.

      common我也是用 springboot 建的, 只不过将入口那里注释掉了. 这里, 除了web有入口程序, 其他的入口全都注释掉了.

      

    改造后的目录结构:

      

    这里要注意开启service中的入口程序, 创建application.yml文件, 将之前在web中, 对mybatis的配置部分, 全部迁移到service中, 包括 MybatisConfig 和 MybatisMapperScannerConfig.

    迁移哦, 不是复制. web端不需要这些东西了. 

    具体的改造过程, 就不贴了, 代码我会上传到码云中. 地址: https://gitee.com/elvinle/bookshop/tree/master/bookshop

    集成dubbo zookeeper:

    1. 业务层改造 -- 服务端

    pom.xml 中加入:

    <!--dubbo相关-->
    <!-- https://mvnrepository.com/artifact/com.gitee.reger/spring-boot-starter-dubbo -->
    <dependency>
        <groupId>com.gitee.reger</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.netty</groupId>
                <artifactId>netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    application.yml:

    spring:
      dubbo:
        application: bookshop_provider
        registry:
          address: 192.168.153.129
          protocol: zookeeper
          port: 2181
        protocol:
          name: dubbo
          port: 20880
        base-package: cn.elvinle.manager.simpl

    application : 名称自己随便取一个都可以, 不重复就好.

    address : 前面zookeeper部署的电脑ip.

    port: zookeeper服务的端口号

    registry.protocol : 注册协议, zookeeper注册中心, 默认2181端口

    dubbo.protocol : 服务协议, 使用 dubbo

    dubbo.port : 服务端口, 默认20880

    timeout : 调用超时, 默认为1000ms.

    base-package : 客户端被扫描的包

    这里使用的是单机部署, 没有使用zookeeper集群. 后面有机会的话, 会使用到.

    代码改造:

    package cn.elvinle.manager.simpl;
    
    import cn.elvinle.manager.dao.mapper.UserMapper;
    import cn.elvinle.manager.pojo.User;
    import cn.elvinle.manager.service.UserService;
    import com.alibaba.dubbo.config.annotation.Service;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.util.List;
    
    @Service
    public class UserSImpl implements UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        @Override
        public List<User> getAll() {
    
            List<User> list = userMapper.getAll();
    
            System.out.println("服务端读取到数据:" + list);
    
            return list;
        }
    }

    这里貌似与之前的没什么不同, 但是, 这里的Service 注解, 不是之前的那个了, 而是 com.alibaba.dubbo.config.annotation.Service

    2. web 集成 -- 客户端

    pom.xml文件加入引用:

    <!--dubbo相关-->
    <!-- https://mvnrepository.com/artifact/com.gitee.reger/spring-boot-starter-dubbo -->
    <dependency>
        <groupId>com.gitee.reger</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.netty</groupId>
                <artifactId>netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    application.yml  

    spring:
      dubbo:
        application: web_consumer
        registry:
          address: 192.168.153.129
          protocol: zookeeper
          port: 2181
        base-package: cn.elvinle.manager.web.controller
        consumer:
          timeout: 10000 

    代码改造:

    package cn.elvinle.web.controller;
    
    import cn.elvinle.manager.pojo.User;
    import cn.elvinle.manager.service.UserService;
    import com.alibaba.dubbo.config.annotation.Reference;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("user")
    public class UserController {
    
        @Reference
        private UserService userService;
    
        @RequestMapping("index")
        public List<User> index(){
    
            List<User> all = userService.getAll();
    
            System.out.println("客户端读取到数据: " + all);
    
            return all;
        }
    }

    这里, 可以看到, 不再是使用Autowire了, 而是使用Reference注解, 是dubbo里面的.

     3. 注意:

      这里有个需要注意的地方, 就是传输的类, 必须实现  Serializable 接口, 表示支持序列化, 否则会报错的.

    结果展示:

    从浏览器上看, 确实访问到了数据. 再来看一下, 后台可打印了我要的信息.

    再来看一下注册监测中心:

    看看提供者:

    消费者:

      

  • 相关阅读:
    路由器配置深入浅出—静态路由和缺省路由配置
    盘点飞思卡尔i.MX多媒体处理器前世今生 (转)
    ubuntu18.04下取消中键复制粘贴功能
    uboot常用命令及其使用
    MCU软件最佳实践——使用printf打印数据
    uboot无法通过nfs加载ubuntu18.04中的文件(转)
    GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)
    ENDIAN的由来及BIGEDIAN 和LITTLEENDIAN(转)
    自动生成c# Model属性
    使用JAVA生成随机的AES密钥
  • 原文地址:https://www.cnblogs.com/elvinle/p/8251585.html
Copyright © 2020-2023  润新知