前言: 之前將各層都拆分出去, 作為一個獨立的可替換的子模塊. 感覺比以前確實是靈活了一些. 不管是電商項目, 還是現在公司做的項目, 其中, 有很多的業務邏輯, 都是一樣的, 但是由於不在一個系統中, 大家需要進行重覆的工作. 有的拷貝還好, 但是有的, 沒法直接拷貝. 相當的蛋疼. 能不能, 將 ...
前言:
之前將各層都拆分出去, 作為一個獨立的可替換的子模塊. 感覺比以前確實是靈活了一些.
不管是電商項目, 還是現在公司做的項目, 其中, 有很多的業務邏輯, 都是一樣的, 但是由於不在一個系統中, 大家需要進行重覆的工作. 有的拷貝還好, 但是有的, 沒法直接拷貝. 相當的蛋疼. 能不能, 將業務邏輯獨立出去, 供所有的展示層調用呢?
是不是可以使用前一篇介紹的 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 介面, 表示支持序列化, 否則會報錯的.
結果展示:
從瀏覽器上看, 確實訪問到了數據. 再來看一下, 後臺可列印了我要的信息.
再來看一下註冊監測中心:
看看提供者:
消費者: