Dubbo框架學習筆記
Dubbo介紹
Dubbo是什麼?
Dubbo 是阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和 Spring 框架無縫整合。
Dubbo是一款高效能、輕量級的開源 Java RPC 框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
RPC是什麼
RPC(Remote Procedure Call)是指遠端過程呼叫,是一種程序間通訊方式,它是一種技術的思想,而不是規範。即允許伺服器A通過網路呼叫伺服器B上的過程或函式
Dubbo架構
Dubbo架構圖(Dubbo官方提供)如下:
節點角色說明:
節點 | 角色名稱 |
---|---|
服務提供者(Provider) | 暴露服務的服務提供方 |
服務消費者(Consumer) | 呼叫遠端服務的服務消費方 |
註冊中心(Registry) | 服務註冊與發現的註冊中心 |
監控中心(Monitor) | 統計服務的呼叫次數和呼叫時間的監控中心 |
容器(Container) | 服務執行容器 |
虛線都是非同步訪問,實線都是同步訪問 藍色虛線:在啟動時完成的功能 紅色虛線(實線)都是程式執行過程中執行的功能
呼叫關係說明
- 服務容器負責啟動,載入,執行服務提供者
- 服務提供者在啟動時,向註冊中心註冊自己提供的服務
- 服務消費者在啟動時,向註冊中心訂閱自己所需的服務
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者
- 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫
- 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心
服務註冊中心Zookeeper
通過前面的Dubbo架構圖可以看到,Registry(服務註冊中心)在其中起著至關重要的作用。Dubbo官
方推薦使用Zookeeper作為服務註冊中心。
Zookeeper的介紹
Zookeeper 是一個分散式的,開放原始碼的分散式應用程式協調服務,是 Google 的 Chubby 一個開源的實現,是 Hadoop 和 Hbase 的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、名字服務、分散式同步、組服務等。
Linux 安裝 Zookeeper
下載地址:http://archive.apache.org/dist/zookeeper/
安裝步驟:
- 第一步:安裝 jdk(略)
- 第二步:把 Zookeeper 的壓縮包(zookeeper-3.4.6.tar.gz)上傳到 linux 系統
- 第三步:解壓縮壓縮包
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
- 第四步:進入zookeeper-3.4.6目錄,建立data目錄
mkdir data
- 第五步:進入conf目錄 ,把 zoo_sample.cfg 改名為 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
- 第六步:開啟zoo.cfg檔案, 修改data屬性:
dataDir=/usr/local/zookeeper 3.4.6/data
Dubbo快速入門
服務提供方開發
- 建立maven工程(打包方式為war)dubbo_provider,在 pom.xml 檔案中匯入如下座標
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相關 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定埠 -->
<port>8081</port>
<!-- 請求路徑 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
- 配置 web.xml 檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbo-provider.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
- 建立服務介面
public interface TestService {
String hello(String name);
}
- 建立服務實現類
@Service
public class TestServiceImpl implements TestService {
@Override
public String hello(String name) {
return "Hello," + name;
}
}
注意:服務實現類上使用的Service註解是Dubbo提供的,用於對外發布服務
- 在 src/main/resources 下建立 dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
<dubbo:application name="dubbo_provider" />
<!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 掃描指定包,加入@Service註解的類會被髮布為服務 -->
<dubbo:annotation package="com.fgba.service.impl" />
<!-- 註冊 協議和port -->
<dubbo:protocol name="dubbo" port="20880" />
</beans>
-
啟動服務
tomcat7:run
服務消費方開發
-
建立 maven 工程(打包方式為 war)dubbo_consumer,pom.xml 配置和上面服務提供者相同,只需要將 Tomcat 外掛的埠號改為8082即可
-
配置web.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定載入的配置檔案 ,通過引數contextConfigLocation載入 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbo-consumer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
-
將服務提供者工程中的 TestService 介面複製到當前工程
-
編寫 Controller
@Controller
@RequestMapping("/test")
public class TestController {
@Reference
private TestService testService;
@RequestMapping("/hello")
@ResponseBody
public String getName(String name){
//遠端呼叫
String result = testService.hello(name);
System.out.println(result);
return result;
}
}
注意:Controller中注入TestService使用的是Dubbo提供的@Reference註解
- 在 src/main/resources 下建立 dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
<dubbo:application name="dubbo-consumer" />
<!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 掃描的方式暴露介面 -->
<dubbo:annotation package="com.fgba.controller" />
<!-- 掃描@Controller註解 -->
<context:component-scan base-package="com.fgba.controller" />
</beans>
-
執行測試
tomcat7:run 啟動
在瀏覽器輸入http://localhost:8082/test/hello?name=Jack,檢視瀏覽器輸出結果
Dubbo管理控制檯
我們在開發時,需要知道Zookeeper註冊中心都註冊了哪些服務,有哪些消費者來消費這些服務。我們 可以通過部署一個管理中心來實現。其實管理中心就是一個web應用,部署到tomcat即可
安裝步驟
-
將 dubbo-admin-2.6.0.war 檔案複製到 tomcat 的 webapps 目錄下
-
啟動 tomcat,此 war 檔案會自動解壓
-
修改 WEB-INF 下的 dubbo.properties 檔案,注意 dubbo.registry.address 對應的值需要對應當前使用的 Zookeeper 的 ip 地址和埠號
dubbo.registry.address=zookeeper://localhost:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
-
重啟tomcat
使用步驟
- 訪問 http://localhost:8080/dubbo-admin-2.6.0/ ,輸入使用者名稱(root)和密碼(root)
- 啟動服務提供者工程和服務消費者工程,可以在檢視到對應的資訊
總結
Dubbo 是一個服務框架,其作用是將不同伺服器上的服務進行整合,所以一般應用於分散式環境下。它在分散式環境下通過網路完成各個模組之間的呼叫,通過註冊中心來管理服務提供方和服務消費方。