Dubbo直連方式改造
阿新 • • 發佈:2020-08-24
[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