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 接口, 表示支持序列化, 否則會報錯的.

 

結果展示:

從瀏覽器上看, 確實訪問到了數據. 再來看一下, 后台可打印了我要的信息.

再來看一下注冊監測中心:

看看提供者:

消費者:

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM