1. 程式人生 > >Dubbo直連方式改造

Dubbo直連方式改造

[TOC] ## 一、dubbo 服務化最佳實踐 ### 1. 分包 建議將服務介面、服務模型、服務異常等均放在公共包中 ### 2. 粒度 服務介面儘可能大粒度,每個服務方法應代表一個功能,而不是某功能的一個步驟,否則將面臨分散式事務問題,Dubbo 暫未提供分散式事務支援 服務介面建議以業務場景為單位劃分,並對相近業務做抽象,防止介面數量爆炸 不建議使用過於抽象的通用介面,如:Map query(Map),這樣的介面沒有明確語義,會給後期維護帶來不便 ### 3. 版本 每個介面都應定義版本號,為後續不相容升級提供可能,如: 。 建議使用兩位版本號,要變更服務版本。先升級一半提供者為新版本,再將消費者全部升為新版本,然後將剩下的一半提供者升為新版本 ## 二、改造 dubbo 專案 抽象分散在多個專案中的公共介面,實體類,異常,工具類到一個專案中(比如:link-interface) 在其他專案如服務提供者,消費者共用公共的資源 ## 三、link-interface link-interface是一個maven Java工程 dubbo官方推薦使用的一個模式,將實體bean和業務介面存放到介面工程中 ### 1. pom.xml 這只是一個java工程,這裡不用改變 ```xml 4.0.0
com.md.dubbo 03-link-interface 1.0.0
``` ### 2. 實體類 ```java package com.md.dubbo.model; import java.io.Serializable; /** * @author MD * @create 2020-08-19 10:40 */ // 對於分散式開發,物件要進行序列化操作 public class User implements Serializable { private Integer id; private String username; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } ``` ### 3. 公共介面 ```java package com.md.dubbo.service; import com.md.dubbo.model.User; /** * @author MD * @create 2020-08-19 10:41 */ public interface UserService { /** * 通過使用者id獲取使用者資訊 * @param id * @return */ User queryUserById(Integer id); /** * 獲取使用者總人數 * @return */ Integer queryAllUserCount(); } ``` ## 四、提供者 建立maven web工程 ### 1. pom.xml 注意引入介面工程的依賴 ```xml
4.0.0 com.md.dubbo 04-link-userservice-provider 1.0.0 war UTF-8 1.8 1.8 junit junit 4.11 test org.springframework spring-context 4.3.16.RELEASE org.springframework spring-webmvc 4.3.16.RELEASE
com.alibaba dubbo 2.6.2 com.md.dubbo 03-link-interface 1.0.0
``` ### 2. 介面實現 這裡只是一個簡單的模擬 ```java package com.md.dubbo.service.impl; import com.md.dubbo.model.User; import com.md.dubbo.service.UserService; /** * @author MD * @create 2020-08-19 10:48 */ public class UserServiceImpl implements UserService { @Override public User queryUserById(Integer id) { User user = new User(); user.setId(id); user.setUsername("山丘!"); return user; } @Override public Integer queryAllUserCount() { return 9; } } ``` ### 3. 服務提供者的核心配置檔案 在resources目錄下建立dubbo-userservice-provider.xml檔案 ```xml ``` ### 4. 新增監聽器 在web.xml中 ```xml contextConfigLocation classpath:dubbo-userservice-provider.xml org.springframework.web.context.ContextLoaderListener ``` ### 5. 配置Tomcat **埠號注意修改一下:避免衝突** HTTP port :8081 JMX port:1098 ## 五、消費者 ### 1. pom.xml 還是maven web專案 `注意:添加了介面的依賴` ```xml 4.0.0 com.md.dubbo 05-link-consumer 1.0.0 war UTF-8 1.8 1.8 junit junit 4.11 test org.springframework spring-context 4.3.16.RELEASE org.springframework spring-webmvc 4.3.16.RELEASE com.alibaba dubbo 2.6.2 com.md.dubbo 03-link-interface 1.0.0 ``` ### 2. 服務消費者的核心配置檔案 在resources目錄下建立dubbo-consumer.xml檔案 ```xml ``` ### 3. controller ```java package com.md.dubbo.web; import com.md.dubbo.model.User; import com.md.dubbo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * @author MD * @create 2020-08-19 11:11 */ @Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/userDetail") public String userDetail(Model model , Integer id){ // 根據id獲取使用者資訊 User user = userService.queryUserById(id); // 獲取使用者總人數 Integer allUserCount = userService.queryAllUserCount(); model.addAttribute("user",user); model.addAttribute("allUserCount",allUserCount); return "userDetail"; } } ``` ### 4. applicationContext.xml 在resources目錄下建立spring配置檔案 ```xml ``` ### 5. 配置中央排程器 在web.xml中 ```xml dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml,classpath:dubbo-consumer.xml dispatcherServlet / ``` ### 6. 配置Tomcat 此時使用預設的就可以了 ### 7. 配置測試頁面 在webapp下 建立userDetail.jsp ```jsp <%-- Created by IntelliJ IDEA. User: MD Date: 2020/8/19 Time: 11:16 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> Title

hello Dubbo

使用者id:${user.id}

使用者姓名:${user.username}

使用者總數:${allUserCount}

``` ### 8. 測試 1. 首先開服務提供者的Tomcat 2. 然後開服務消費者的Tomcat 3. 然後在位址列輸入,就可以看到了 ![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200823232223440-19641613