Dubbo直連方式
阿新 • • 發佈:2020-08-22
[TOC]
## 一、dubbo概述
Apache Dubbo 是一款高效能、輕量級的開源 Java RPC 框架,它提供了三大核心能力:
- 面向介面的遠端方法呼叫,
- 智慧容錯和負載均衡,
- 服務自動註冊和發現。
Dubbo 是一個分散式服務框架,致力於提供高效能和透明化的 RPC 遠端服務呼叫方案、 服務治理方案。
官網:
**特性:**
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231332620-1627733466.png)
`面向介面代理:`
呼叫介面的方法,在 A 伺服器呼叫 B 伺服器的方法,由 dubbo 實現對 B 的呼叫,無需關心實現的細節,就像 MyBatis 訪問 Dao 的介面,可以操作資料庫一樣。不用關心 Dao 介面方法的實現
### 1. 基本架構
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231338035-1761068831.png)
**服務提供者(Provider)**:暴露服務的服務提供方,服務提供者在啟動時,向註冊中心註冊自己提供的服務。
**服務消費者(Consumer )**: 呼叫遠端服務的服務消費方,服務消費者在啟動時,向註冊中心訂閱自己所需的服務,服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
**註冊中心(Registry)** :註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者
**監控中心(Monitor)** :服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心
`呼叫關係說明`
1. 服務容器負責啟動,載入,執行服務提供者
2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務
3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務
4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者
5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫
6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心
### 2. dubbo 支援的協議
支援多種協議:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。dubbo 官方推薦使用 dubbo 協議。dubbo 協議預設埠 20880
使用 dubbo 協議,spring 配置檔案加入:
` `
## 二、直連方法
點對點的直連專案:消費者直接訪問服務提供者,沒有註冊中心。消費者必須指定服務提供者的訪問地址(url)
消費者直接通過 url 地址訪問固定的服務提供者。這個 url 地址是不變的。
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231349482-1478822148.png)
## 三、建立服務提供者
### 1. 思路
1. 建立一個maven web工程:服務的提供者
2. 建立一個實體bean查詢的結果,實現Serializable介面
3. 提供一個服務介面:xxxx
4. 實現這個服務介面:xxxxImpl
5. 配置dubbo服務提供者的核心配置檔案
- 宣告dubbo服務提供者的名稱:保證唯一
- 宣告dubbo使用的協議和埠號
- 暴露服務,使用直連方式
6. 新增監聽器
### 1. 建立maven web
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231359166-101954944.png)
並新增對應的目錄
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231405651-1047125032.png)
### 2. pom.xml
添加了dubbo依賴
```xml
4.0.0
com.md
01-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
src/main/java
**/*.properties
**/*.xml
false
```
### 3. 建立實體
```java
package com.md.dubbo.model;
import java.io.Serializable;
/**
* @author MD
* @create 2020-08-16 21:30
*/
// model實現序列化
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
```
### 4. 建立服務介面並實現
```java
package com.md.dubbo.service;
import com.md.dubbo.model.User;
/**
* @author MD
* @create 2020-08-16 21:35
*/
public interface UserService {
/**
* 根據使用者標識獲取使用者資訊
* @param id
* @return
*/
User queryUserById(Integer id);
}
//---------------------------------------
package com.md.dubbo.service.impl;
import com.md.dubbo.model.User;
import com.md.dubbo.service.UserService;
/**
* @author MD
* @create 2020-08-16 21:38
*/
public class UserServiceImpl implements UserService {
@Override
public User queryUserById(Integer id) {
// 模擬
User user = new User();
user.setId(id);
user.setUsername("pony");
user.setAge(20);
return user;
}
}
```
### 5. 配置服務提供者的核心配置檔案
在resources目錄下建立dubbo-userservice-provider.xml檔案
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231421055-751456521.png)
**這裡注意:選擇apache的這個**
```xml
```
### 6. 新增監聽器
在web.xml中
```xml
contextConfigLocation
classpath:dubbo-userservice-provider.xml
org.springframework.web.context.ContextLoaderListener
```
### 7. 配置Tomcat
**埠號注意修改一下:**
HTTP port :8081
JMX port:1098
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231432845-240837699.png)
### 8. 安裝本地jar到maven倉庫
服務介面中的方法要給消費者使用,消費者專案需要知道介面名稱和介面中的方法名稱、引數等。這些資訊服務提供者才知道。需要把介面的 class 檔案打包為 jar .
服務介面專案的類檔案打包為 jar, 安裝到 maven 倉庫,倉庫中的提供者 jar 可以被消費者使用。
`使用 idea 的 maven 視窗執行 install`
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231439108-690020212.png)
## 四、建立服務消費者
### 1. 思路
1. 建立一個maven web工程:服務的消費者
2. 配置pom檔案:新增需要的依賴(spring,dubbo)
3. 設定dubbo的核心配置檔案
4. 編寫controller
5. 配置中央排程器(就是一個servlet:DispatcherServlet)
基本和服務提供者一樣,這裡就說一些主要的
### 1. pom.xml
還是maven web專案
`注意:添加了服務提供者的依賴`
```xml
4.0.0
com.md
02-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
01-link-userservice-provider
1.0.0
src/main/java
**/*.properties
**/*.xml
false
```
### 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 9:00
*/
@Controller
public class UserController {
// 自動注入
@Autowired
private UserService userService;
@RequestMapping(value = "/user")
public String userDetail(Model model , Integer id){
User user = userService.queryUserById(id);
model.addAttribute("user",user);
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
和上面一樣,只不過不用修改埠號了
![](https://img2020.cnblogs.com/blog/1212924/202008/1212924-20200821231512594-77540775.png)
### 7. 配置測試頁面
在webapp下 建立userDetail.jsp
```jsp
<%--
Created by IntelliJ IDEA.
User: MD
Date: 2020/8/19
Time: 9:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
使用者詳情