1. 程式人生 > >spring Boot環境下dubbo+zookeeper的一個基礎講解與示例

spring Boot環境下dubbo+zookeeper的一個基礎講解與示例

一、  Dubbo 概述 1.    為什麼需要Dubbo         網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,Dubbo是一個分散式服務框架,在這種情況下誕生的。現在核心業務抽取出來,作為獨立的服務,使前端應用能更快速和穩定的響應。

2.   Dubbo是什麼       Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。關於註冊中心、協議支援、服務監控等內容

3.   Dubbo能做什麼       當網站變大後,不可避免的需要拆分應用進行服務化(微服務),以提高開發效率,調優效能,節省關鍵競爭資源等。 當服務越來越多時,服務的URL地址資訊就會爆炸式增長,配置管理變得非常困難,F5硬體負載均衡器的單點壓力也越來越大。  當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關係。接著,服務的呼叫量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?等等…… 在遇到這些問題時,都可以用Dubbo來解決。

二、   Dubbo 原理 1.   Dubbo架構圖  

上述圖所描述的呼叫流程關係如下:

   0. 服務容器負責啟動,載入,執行服務提供者,這個圖上沒標識出來,服務端啟動就是0.

   1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。

   2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

   3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。

   4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。

   5. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

三.   Dubbo與zookeeper      Dubbo為什麼要與zookeeper/Consule一起使用?dubbo主要是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的。告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上註冊。zookeeper用來註冊服務和進行負載均衡,哪一個服務由哪一個機器來提供必需讓呼叫者知道,簡單來說就是ip地址和服務名稱的對應關係。zookeeper通過心跳機制可以檢測掛掉的機器並將掛掉機器的ip和服務對應關係從列表中刪除。

      利用zookeeper生成的節點樹,伺服器提供者在啟動的時候,將提供的服務名稱和地址以節點的方式註冊都伺服器zookeeper伺服器配置中心,消費者通過伺服器配置中心獲取需要的服務名稱節點下的服務地址。因為znode有非持久節點的特性,伺服器可以動態的從服務配置中心一處,並且觸發消費者的watcher方法!!!

      消費者只有在第一次呼叫的時候直接本地快取伺服器列表資訊,而不需要重新發起請求到伺服器配置中心區獲取相應 的伺服器列表,直到伺服器地址列表有變化(機器下線或者上線),變更之後消費者watcher進行服務地址的重新查詢。正是因為這種無中心化的結構,使得服務消費者在服務資訊沒變更時候,幾乎不依賴配置中心,解決了負載均衡裝置導致的單點故障的問題,大大減少了服務配置中心的壓力 

四.    Zookeeper的安裝,此處以windows環境下為例。

  在apache的官方網站提供了好多映象下載地址,然後找到對應的版本,目前最新的是3.4.5。

  把下載的zookeeper的檔案解壓到指定目錄

 修改conf下增加一個zoo.cfg

進入到bin目錄,並且啟動zkServer.cmd,這個指令碼中會啟動一個Java程序

這個時候zookeeper已經安裝成功了.

五.   服務提供者 演示工程結構如下:

首先看下咱們的pom檔案,引入Dubbo和Zookeeper的jar包.沒啥好說的。

<dependency>
	<groupId>io.dubbo.springboot</groupId>
	<artifactId>spring-boot-starter-dubbo</artifactId>
	<version>1.0.0</version>
</dependency>		 
<dependency>
    <groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.6</version>			 
</dependency> 
<dependency>
	<groupId>com.github.sgroschupf</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.1</version>
</dependency>

然後我們寫自己的介面與實現,通常分散式設計下介面應該與實現分開,讓介面與bean單獨起工程模組,以便服務提供者與消費者都可以呼叫。如果服務端有自己不暴漏的方法,可單寫介面類,也可中間加層,看業務而定。

介面

public interface UserService {
	/**
	 * 提供分散式業務的測試方法
	 */
	public User createUser(String name,int age);
}

介面實現

import com.alibaba.dubbo.config.annotation.Service; 
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;

@Service  //關鍵註解,表示可註冊的服務  com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
	@Override
	public User createUser(String name, int age) {
		User user = new User(name, age);
		return user;
	}	
}

重點看下我們dobbo配置 ,application.properties 配置:

server.port=8083
#在DubboAdmin管理中心展示的應用名稱
spring.dubbo.application.name=p-provider
#向註冊中心註冊服務
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
spring.dubbo.protocol.name=dubbo
#向外暴露Dubbo埠
spring.dubbo.protocol.port=20888
#掃描介面所在的包
spring.dubbo.scan=com.icss.springbootfuwu.service

   接下來我們啟動服務提供者服務,這裡我們常用的應該是啟動一個java程式,因為我們的工程中並沒有涉及web方面的業務,儘量不適用tomcat 啟動Web容器。服務完成。

六.   服務消費者   我們再建立一個消費者工程專案,結構如下:

Pom檔案與服務者要引用的基本一樣,都是dubbo與zookeeper。

<dependency>
	<groupId>io.dubbo.springboot</groupId>
	<artifactId>spring-boot-starter-dubbo</artifactId>
	<version>1.0.0</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>2.6.0</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.6</version>
	<type>pom</type>
</dependency>

我們原樣拷貝服務端的介面目錄到客戶端,看專案結構圖。

我們編寫一個業務類程式碼,調取介面。

import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;
@Service  //SpringMVC 業務類
public class UserClientService {
	@Reference   //關鍵註解,表示引用服務端介面代理物件
	UserService userService;
	public User getUser(String name,int age) {
		return userService.createUser(name, age);
	}
}

配置我們dubbo配置檔案,讓zookeeper給我們訂閱需要的服務。在application.properties檔案中配置。

server.port=8082
#DubboAdmin管理工具顯示的應用名稱
spring.dubbo.application.name=c-consumer
#訂閱服務
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
#訂閱服務
spring.dubbo.scan=com.icss.springbootfuwu.service

執行客戶端程式,呼叫控制器->業務類,可看到服務端返回的資料結果。