分散式中臺實踐-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
<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的入門之作,希望能夠幫到大家。 參考文獻: |