1. 程式人生 > >分散式中臺實踐-Dubbo學習之架構講述

分散式中臺實踐-Dubbo學習之架構講述

Dubbo作為阿里巴巴的一個開源架構,其目標是完成傳統程式的分散式部署,為大資料併發提供技術支撐。

1、系統架構

 

消費者:負責訂閱註冊中心的服務和接收註冊中心的通知。另外,消費者能夠根據本身的服務記錄直接呼叫生產者的服務。

生產者:對外提供服務和向註冊中心註冊服務。

註冊中心:註冊訂閱服務和主動發現服務狀態並通知。

監控中心:負責監控消費者和生產者的服務呼叫次數

在消費者、生產者和註冊中心維持者長連線,因此註冊中心能夠及時的瞭解生產的服務狀態,並將其通知到消費者。在生產者和消費者之間的核心因素為通訊協議,Dubbo支援的通訊協議包括Dubbo、RMI、Hessian、Http、webService、memcached和Redis,其呼叫都通過代理方式實現。

2、Maven配置

Dubbo專案的版本維護採用Maven,因此在開發之前需要首先配置Maven的依賴關係,配置資訊如下:

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.7</version>

</dependency>

3、最佳實踐

Dubbo的實現可以採用配置檔案和註解,其官方建議採用XML的配置方式實現。

3.1採用組播技術註冊生產者

作為一個快速實現的案例,我們定義一個簡單的介面和簡單的實現,如下:

public interface GreetingsService {

String sayHi(String name);

}

public class GreetingsServiceImpl implements GreetingsService {

@Override

public String sayHi(String name) {

return "hi, " + name;

}

}

消費者為了進行遠端呼叫,必須與服務方公用服務呼叫介面。另外,服務方必須依託於服務容器,此案例採用Spring+Tomcat作為容器方。

3.2服務實現後需要將其註冊到祖冊服務中心:

<dubbo:application

 name="demo-provider" version="1.0"/>

<dubbo:protocol name="dubbo" port="20880"/>

<bean id="greetingsService" class="com.baeldung.dubbo.remote.GreetingsServiceImpl"/>

<dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService"

ref="greetingsService"/>

具體引數解析:

註冊協議採用dubbo,介面採用20880

另,將生產服務介面和實現也通過服務實現。

3.3服務消費者註冊

<dubbo:application name="demo-consumer" version="1.0"/>

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService"/>

3.4 啟動服務

public class MulticastRegistryTest {

@Before

public void initRemote() {

ClassPathXmlApplicationContext remoteContext

= new ClassPathXmlApplicationContext("multicast/provider-app.xml");

remoteContext.start();

}

@Test

public void givenProvider_whenConsumerSaysHi_thenGotResponse(){

ClassPathXmlApplicationContext localContext

= new ClassPathXmlApplicationContext("multicast/consumer-app.xml");

localContext.start();

GreetingsService greetingsService

= (GreetingsService) localContext.getBean("greetingsService");

String hiMessage = greetingsService.sayHi("baeldung");

assertNotNull(hiMessage);

assertEquals("hi, baeldung", hiMessage);

}

}

當生產者啟動時,Dubbo自動將服務註冊到服務中心,本機為組播註冊。消費者向註冊中心訂閱,並建立服務代理呼叫服務方的服務。此外,消費者也可以直接向服務方發起服務,

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

4、簡單註冊服務

組播註冊服務適用於服務方和消費方在同一區域網的情景,如果在公網上建議採用單獨的註冊服務。如果在測試環境,則可以通過簡單的註冊服務實現;如果在生產環境,建議採用zookeeper實現服務註冊於發現。

4.1啟動簡單註冊服務

<dubbo:application name="simple-registry" />

<dubbo:protocol port="9090" />

<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService"

ref="registryService" registry="N/A" ondisconnect="disconnect">

<dubbo:method name="subscribe">

<dubbo:argument index="1" callback="true" />

</dubbo:method>

<dubbo:method name="unsubscribe">

<dubbo:argument index="1" callback="true" />

</dubbo:method>

</dubbo:service>

<bean class="com.alibaba.dubbo.registry.simple.SimpleRegistryService"

id="registryService" />

服務方服務註冊替換為:

<dubbo:registry address="127.0.0.1:9090"/>

5、叢集服務配置

5.1可以通過Zookeeper實現註冊服務叢集的配置管理,配置如下

另外,在Maven依賴中,需要做如下配置:

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.11</version>

</dependency>

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

5.2Dubbo支援服務叢集的另一個特性是在前端支援負載均衡,配置如下:

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService" loadbalance="roundrobin" />

通過以上的特性,Dubbo能夠實現註冊服務的叢集化和服務的叢集化,從而能夠使得服務實現橫向的擴充套件,最終完成大規模叢集的應用。

5.3為了保證服務叢集的穩定,Dubbo還實現了服務的容災處理,包括:

失敗重連、失敗安全、快速重啟、失敗回覆等技術,保證服務的穩定可靠,其配置方式如下:

<dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService"

ref="greetingsService" cluster="failover"/>

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService" retries="2" timeout="2000" />

通過以上講述,我們能夠看到Dbubbo作為中颱的廣闊應用前景。當然,此處也會是作為架構的管中窺豹,向服務的協議、服務的呼叫

遠端代理模式、註冊服務、監控等服務還沒有深入的講述,本篇文章僅僅作為Dubbo的入門之作,希望能夠幫到大家。

參考文獻: