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