分布式RPC框架Apache Dubbo服務
- 一、 Apache Dubbo概述
- 1.1、Dubbo簡介
- 1.2、什么是RPC?
- 1.3、什么是服務發現?
- 1.3、Dubbo架構
- 二、服務注冊中心Zookeeper
- 2.1、Zookeeper介紹
- 2.2、安裝Zookeeper
- 2.3、啟動、停止Zookeeper
- 三、Dubbo快速入門
- 3.1、服務提供方開發(dubbodemo_provider)
- 3.1.1、創建maven webapp工程(打包方式為war)dubbodemo_provider
- 3.1.2、在pom.xml檔案中匯入如下坐標
- 3.1.3、配置web.xml檔案
- 3.1.4、創建服務介面
- 3.1.5、創建服務的實作類
- 3.1.6、在src/main/resources下創建applicationContext-service.xml
- 3.1.7、啟動提供方的服務
- 3.2、服務消費方開發(dubbodemo_consumer)
- 3.2.1、創建maven工程(打包方式為war)dubbodemo_consumer
- 3.2.2、pom.xml配置和上面服務提供者相同,只需要將Tomcat插件的埠號改為8082即可(否則與服務者的埠號會沖突)
- 3.2.3、配置web.xml檔案
- 3.2.3、將服務提供者工程中的HelloService介面復制到當前工程即可,無需實作類
- 3.2.4、撰寫Controller層
- 3.2.5、在src/main/resources下創建applicationContext-web.xml
- 3.2.6、運行測驗
- 四、Dubbo管理控制臺
- 4.1、第一種`war包形式`的安裝步驟
- 4.1.2、使用方式
- 4.2、第二種`jar包形式`的安裝步驟
- 4.2.1、jar包方式的使用方式
一、 Apache Dubbo概述
1.1、Dubbo簡介
-
Apache Dubbo是一款微服務開發框架,它提供了
RPC通信與微服務治理兩大關鍵能力,這意味著,使用Dubbo開發的微服務,將具備相互之間的遠程發現與通信能力,同時利用Dubbo提供的豐富服務治理能力,可以實作諸如服務實作、負載均衡、流量調度等服務治理訴求,同時Dubbo是高度可擴展的用戶幾乎可以在任意功能點去定制自己的實作,以改變框架的默認行為來滿足自己的業務需求, -
Apache Dubbo是一開高性能的、輕量級的Java RPC框架,其前身是阿里巴巴公司開源的一個框架,可以和Spring框架無縫繼承,
-
Dubbo官網地址:http://dubbo.apache.org
Dubbo提供了三大核心能力:
- 面向介面的遠程方法呼叫;
- 智能容錯和負載均衡;
- 服務自動注冊和發現,
1.2、什么是RPC?
-
RPC全稱是remote procedure call,即遠程程序呼叫,開啟兩臺服務器A和B,A服務器上部署一個應用,B服務器上部署一個應用,A服務器上的應用想呼叫B服務器上的應用提供的方法,由于兩個應用不在一個記憶體空間,不能直接呼叫,所以需要通過網路來表達通用的語意和傳達呼叫的資料,
需要注意的是,RPC并不是一個具體的技術,而是指整個網路遠程呼叫程序,
-
RPC是一個泛化的概念,嚴格來說一切遠程呼叫手段都屬于RPC范疇,各種開發語言都有自己的RPC框架,Java中的RPC框架比較多,廣泛使用的有RMI、Hessian、Dubbo等,
1.3、什么是服務發現?
- 服務發現即消費端自動發現服務地址串列的能力,是微服務框架需要具備的關鍵能力,借助于自動化的服務發現,微服務之間可以在無感知對端部署位置與IP地址的情況下實作通信,
- 實作服務發現的方式有很多,Dubbo提供的是一種Client-Based的服務機制,通常還需要部署額外的第三方注冊中心組件來協調服務發現程序,如常用的Nacos、Consul、Zookeeper等,Dubbo自身也提供了對多種注冊中心組件的對接,用戶可以靈活選擇,
1.3、Dubbo架構
Dubbo架構圖,Dubbo基于消費端的自動服務發現能力,其作業原理如下圖(官方提供):

服務發現的一個核心組件就是注冊中心,Provider注冊地址到注冊中心,Consumer從注冊中心讀取和訂閱Provider地址串列,因此要啟用服務發現,需要為Dubbo增加注冊中心配置,
上圖的節點說明:
| 節點 | 角色名稱 |
|---|---|
| Provider | 暴露服務的服務提供方 |
| Consumer | 呼叫遠程服務的服務消費方 |
| Registry | 服務注冊與發現的注冊中心 |
| Monitor | 統計服務的呼叫次數和呼叫時間的監控中心 |
| Container | 服務運行容器 |
- 虛線都是一步訪問,實作都是同步訪問;
- 藍色虛線是在啟動時完成的功能;
- 紅色虛線(實線)都是程式運行程序中執行的功能
呼叫說明關系:
- 服務容器負責啟動,加載,運行服務提供者;
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務;
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務;
- 注冊中心回傳服務提供者地址串列給消費者,如果有變更,注冊中心將基于長連接推送變更資料給消費者;
- 服務消費者,從提供者地址串列中,基于軟負載均衡演算法,選一臺服務者進行呼叫,如果呼叫失敗,再選另一臺呼叫;
- 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘發送一次統計資料到監控中心,
二、服務注冊中心Zookeeper
通過前面介紹的Dubbo架構如可以看出,Registry(服務注冊中心)在其中起著至關重要的作用,Dubbo官方推薦使用Zookeeper作為服務注冊中心,
2.1、Zookeeper介紹
-
Zookeeper是Apache Hadoop的子專案,是一個樹型的目錄服務,支持變更推送,適合作為Dubbo服務的注冊中心,工業強度較高,可用于生產環境,并推薦使用,
-
為了便于理解Zookeeper的樹型目錄服務,我們先來看一下我們電腦的檔案系統(也是一個屬性目錄結構):

-
我的電腦可以分為多個盤符(例如C、D、E等),每個盤符下可以創建多個目錄,每個目錄下可以創建檔案,也可以創建子目錄,最終構成了一個樹型結構,通過這種樹型結構的目錄,我們可以將檔案憤懣別類的進行存放,方便我們后期查找,而且磁盤上的每個檔案都有一個唯一的訪問路徑,例如:D:\Windows\file\hello.txt,
Zookeeper樹型目錄服務:

- 服務提供者(Provider)啟動時:向
/dubbo/com/foo.BarService/providers目錄下寫入自己的URL地址; - 服務消費者(Consumer)啟動時:訂閱
/dubbo/com.foo.BarService/providers目錄下的提供者URL地址,并向/dubbo/com.foo.BarService/consumers目錄下寫入自己的URL地址; - 監控中心(Monitor)啟動時:訂閱
/dubbo/com.foo.BarService目錄下的所有服務提供者和消費者URL地址,
2.2、安裝Zookeeper
下載地址:http://archive.apache.org/dist/zookeeper/
本文使用的Zookeeper版本為3.4.6,下載完成后可以獲得名稱為zookeeper-3.4.6.tar.gz(是linux版本),當然也有zookeeper-3.4.6.zip(windows版本)的壓縮檔案,但是我們推薦使用linux版本,使用虛擬機模擬遠程終端,更符合開發程序中的真實環境,
安裝步驟:
- 第一步:安裝jdk-1.8或者jdk-1.9都可以
- 第二步:把zookeeper的壓縮包檔案
zookeeper-3.4.6.tar.gz上傳至linux系統下的/usr/local目錄下(我使用的是Xftp 7檔案上傳工具);

- 第三步:解壓壓縮包(我使用的是Xshell可視化遠程連接可視化工具):
使用解壓命令tar -zxvf zookeeper-3.4.5.tar.gz[root@localhost local]# tar -zxvf zookeeper-3.4.6.tar.gz - 第四步:進入
zookeeper-3.4.6目錄中,創建data目錄
使用命令創建data目錄:mkdir data - 第五步:進入conf目錄,把
zoo_sample.cfg復制一份,命名為zoo.cfgcd conf #進入conf目錄中 cp zoo_sample.cfg zoo,cfg #復制一份,改名為zoo.cfg - 第六步:打開
zoo.cfg檔案,修改dataDir屬性dataDir=/usr/local/zookeeper-3.4.6/data #這是絕對路徑 dataDir=../data #相對路徑(推薦使用) - 第七步:關閉防火墻,開放埠號(zookeeper默認埠為2181)
firewall-cmd --zone=public --add-port=2181/tcp --permanent #永久開放2181埠號 firewall-cmd --reload #重新加載,立即生效
2.3、啟動、停止Zookeeper
- 進入zookeeper的bin目錄,啟動服務命令(此處開啟)
cd /usr/local/zookeeper-3.4.6/bin #進入bin目錄中 ./zkServer.sh start #開啟zookeeper - 停止服務命令
./zkServer.sh stop #停止zookeeper - 查看服務狀態
./zkServer.sh status #查看狀態
三、Dubbo快速入門
Dubbo作為一個RPC框架,其最核心的功能就是要實作跨網路的遠程呼叫,本小結就是要創建兩個應用,一個作為服務的提供方,一個作為服務的消費方,通過Dubbo來實作服務消費方呼叫服務提供方的方法,
3.1、服務提供方開發(dubbodemo_provider)
3.1.1、創建maven webapp工程(打包方式為war)dubbodemo_provider


建好專案后,新建java和resource兩個包:

3.1.2、在pom.xml檔案中匯入如下坐標
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--如果你的本地JDK是9就指定1.9;是8就指定1.8-->
<maven.compiler.source>1.9</maven.compiler.source>
<maven.compiler.target>1.9</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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--這是插件部分-->
<build>
<!--使用tomcat插件即可運行專案-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<!--如果你的本地JDK是9就指定1.9;是8就指定1.8-->
<source>1.9</source>
<target>1.9</target>
</configuration>
</plugin>
<!--引進tomcat7插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!--指定版本號-->
<version>2.2</version>
<configuration>
<!-- 指定埠 -->
<port>8081</port>
<!-- 請求路徑 -->
<path>/</path>
</configuration>
</plugin>
</build>
注意:
上述tomcat插件不要建在pluginManagement,否則在插件部分找不到,
3.1.3、配置web.xml檔案
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置容器啟動默認加載背景關系-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<!--配置監聽器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3.1.4、創建服務介面
package com.ebuy.service;
//服務介面
public interface HelloService {
//提供服務的方法
String sayHello(String name);
}
3.1.5、創建服務的實作類
package com.ebuy.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.ebuy.service.HelloService;
/**
* 此實作類就是被發布為provider服務
*/
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "hello:" + name;
}
}
注意此處!!!
匯入
@Service注解,一定要是alibaba下的dubbo提供的,com.alibaba.dubbo.config.annotation.Service,主要用于對外提供服務,
3.1.6、在src/main/resources下創建applicationContext-service.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="dubbodemo_provider_1"/>
<!--連接服務注冊中心zookeeper ip地址為zookeeper所在服務器的ip地址 此處的port就是zookeeper的默認埠號-->
<!--<dubbo:registry address="zookeeper://172.16.30.114:2181"/>-->
<dubbo:registry address="172.16.30.114:2181" protocol="zookeeper"/>
<!--此處是由從本地連接注冊中心,注冊協議是dubbo和port埠號默認是20880-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--掃描指定包,加入@service注解的類會被發布為服務-->
<dubbo:annotation package="com.ebuy.service.impl"/>
</beans>
注意!!!
上述dubbo:registry,是用于連接注冊中心zookeeper的,后面的address地址就是zookeeper注冊中心所在服務器的ip地址,我們可以在本地Windows開啟注冊中心,但是下一般情況下我們是把zookeeper部署在linux的遠程終端,因為在實際的開發環境中注冊中心會記錄服務提供者和服務消費者的所有的url,所以不可能是在自己電腦上部署zookeeper,而我們使用linux就是為了模擬遠程終端服務器,
3.1.7、啟動提供方的服務
運行tomcat

3.2、服務消費方開發(dubbodemo_consumer)
3.2.1、創建maven工程(打包方式為war)dubbodemo_consumer

建好專案后,同樣新建java和resource兩個包:

3.2.2、pom.xml配置和上面服務提供者相同,只需要將Tomcat插件的埠號改為8082即可(否則與服務者的埠號會沖突)
3.2.3、配置web.xml檔案
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<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:applicationContext-web.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.2.3、將服務提供者工程中的HelloService介面復制到當前工程即可,無需實作類
package com.ebuy.service;
public interface HelloService {
public String sayHello(String name);
}
3.2.4、撰寫Controller層
package com.ebuy.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.ebuy.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/demo")
public class HelloController {
@Reference
HelloService helloService;
@RequestMapping("/hello")
@ResponseBody
public String getName(String name){
//遠程呼叫
String result = helloService.sayHello(name);
System.out.println(result);
return result;
}
}
注意:Controller中注入HelloService使用的是Dubbo提供的@Reference注解,是為了加載注入遠程服務提供方所提供的服務方法介面物件,
3.2.5、在src/main/resources下創建applicationContext-web.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="dubbodemo_consumer_1" />
<!-- 連接服務注冊中心zookeeper ip為zookeeper所在服務器的ip地址-->
<!--<dubbo:registry address="zookeeper://192.168.3.123:2181"/>-->
<dubbo:registry address="172.16.30.114:2181" protocol="zookeeper"/>
<!-- 掃描的方式暴露介面 -->
<dubbo:annotation package="com.ebuy.controller" />
</beans>
3.2.6、運行測驗
tomcat7:run啟動
在瀏覽器輸入http://localhost:8082/demo/hello.do?name=Jack,查看瀏覽器輸出結果

四、Dubbo管理控制臺
我們在開發時,需要知道Zookeeper注冊中心都注冊了哪些服務,有哪些消費者來消費提供者所提供的服務,我們可以通過部署一個管理中心來實作,其實管理中心就是一個web應用(用來管理注冊中心的可視化界面應用),部署到tomcat即可,
啟動Dubbo管理控制臺有兩種方法:
- 第一種是
war包的形式,需要部署到tomcat服務器; - 第二種是
jar包的形式,內置與spring集成(內置服務器),無需額外配置服務器,
4.1、第一種war包形式的安裝步驟
注意:此種方式的可視化界面,必須在JDK1.8的環境下執行,否則訪問不到,
-
1、將
dubbo-admin-2.6.0.war檔案復制到tomcat(tomcat8系列就可以)的webapps目錄下; -
2、啟動
tomcat,此war包檔案會自動解壓;


-
3、修改
WEB-INF目錄下的dubbo.properties檔案,注意dubbo.registry.address對應的值需要對應當前zookeeper啟動所在服務器的ip地址和埠號為zookeeper自身的埠號;


dubbo.registry.address=zookeeper://192.168.3.123:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest如果你的zookeeper是在windows版本的,上述ip地址就直接可以寫成
localhost或127.0.0.1;因為我們上述是在linux中部署的zookeeper注冊中心服務,所以上述的組態檔中的ip地址應填寫當前linux系統下的ip地址, -
4、再次啟動tomcat,
注意:啟動Dubbo管理控制臺可視化界面的前提是zookeeper服務一定要先啟動,否則可視化界面會報錯,因為連接不到注冊中心,

4.1.2、使用方式
tomcat啟動成功后,通過地址欄訪問http://localhost:9090/dubbo-admin-2.6.0,9090為tomcat的埠號:

因為在上述服務者和消費者都已經啟動了,所以我們在Dubbo可視化界面中點擊應用直接可以看到哪些提供者將服務注冊到了Registry,哪些消費者向Registry訂閱了服務,


4.2、第二種jar包形式的安裝步驟
小貼士:此種方式可以解決上述war包檔案不兼容JDK的問題,
- 1、將
dubbo-admin-master-0.2.0檔案復制到一個沒有中文的路徑下; - 2、進入
dubbo-admin-master-0.2.0\dubbo-admin\src\main\resources目錄下,編輯application.properties檔案;

- 3、在
dubbo-admin-master-0.2.0\dubbo-admin目錄下執行命令mvn clean package,j將其打成jar包



- 4、在DOS視窗中進入該jar包所在路徑,執行命令
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar


4.2.1、jar包方式的使用方式
直接在地址欄訪問地址localhost:7001即可


那就先到這吧,順便撒個花!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294900.html
標籤:其他
下一篇:HDFS的HA高可用機制
