Dubbo基礎(一)- 第一個例子 HelloDubbo

今天開始,一起研究Dubbo,從最基本的Hello World開始,經過源碼一步步學習架構。

Dubbo

Dubbo 是一款高性能Java RPC 框架,由阿里巴巴捐給Apache ,經過長時間孵化,Dubbo正式畢業。稱爲Apache 家庭的頂級項目。
在國內有衆多公司使用Dubbo。當然中途有一段事件阿里巴巴並沒有對其維護,但是國內很多公司都基於Dubbo 進行功能擴展。例如噹噹基於dubbo2.x擴展版本dubbox。

RPC 即爲 Remote Procedure Call :遠程調用。

由這個名字,可以衍生出服務提供者(Provider),服務消費者(Consumer)。當然Provider和 Consumer不在同一臺機器,所以用什麼來知道Provder的狀態呢?如果這個Provder宕機了,而Consumer不知道,而仍然調用,那麼當然會報錯。
如果就以一個簡單的例子,實現起來就很簡單。

所以此處引入了註冊中心(Register Center),通過註冊中心,Consumer就能知道,哪些Provder是存活,反過來說,註冊中心會與Provder維持一個消息,可以是心跳,從而知道Provder的狀態。

下面引用Dubbo 官網一張圖來說明這個基本架構:
在這裏插入圖片描述

最後,如果需要管理Consumer以及Provder,即引入了Monitor。

Hello Dubbo

經過上面一段話的簡單介紹,相信大家已經對RPC,以及Dubbo有了一個大概的輪廓,下面就開始來一個簡單的Hello world來進入Dubbo的世界。

下面以Api調用的例子來走進Dubbo的世界,這裏使用API方式介紹Dubbo的使用,由於Spring 的IOC將Bean統一管理起來,提升了效率,而Spring Boot 約定大於配置方式,我認爲其實對普通開發者瞭解內部機制並沒有任何幫助。當然換一句話說,這就是進步,就像Java Web不可能永遠停留在JSP階段一樣。

Register Center

本文例子以Zookeeper作爲註冊中心,所以首先要啓動Zookeeper,具體可以參考:ZooKeeper僞集羣搭建

Pom

首先給出Pom文件,目前Dubbo 最新版本是2.7.3

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.3</version>
            <type>pom</type>
        </dependency>

Provider

接下來是服務提供者,在服務提供者中,需要對外暴露 API,從而讓Consumer可以調用到服務。

public class ProviderApplication {
    public static void main(String[] args) throws IOException {
        // 服務配置
        ServiceConfig<HelloService> service = new ServiceConfig<>();
        // 設置服務名
        service.setApplication(new ApplicationConfig("dubbo-provider"));
        // 設置註冊中心
        service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        // 設置服務對應接口
        service.setInterface(HelloService.class);
        // 設置服務對應實現
        service.setRef(new HelloServiceImpl());
        // 暴露服務
        service.export();
        System.out.println("first-dubbo-provider is running.");
        System.in.read();
    }
}

而此時,需要一個接口HelloService,以及一個實現這個接口的實現類HelloServiceImpl,從而當程序啓動時,會將該HelloServiceImpl以HelloService服務形式暴露出來。

public interface HelloService {
    String hello(String name);
}

public class HelloServiceImpl implements HelloService {

    @Override
    public String hello(String name) {
        return "hello" + name;
    }
}

Consumer

當服務提供者暴露了服務之後,服務消費者可以通過訂閱註冊中心,從而獲取提供者,從而調用服務。
下面看看Consumer的服務:

public class ConsumerApplication {

    public static void main(String[] args) {
    	// 聲明引用配置 
        ReferenceConfig<HelloService> reference = new ReferenceConfig<>();
        // 設置應用名字
        reference.setApplication(new ApplicationConfig("dubbo-consumer"));
        // 設置註冊中心,從而可以監聽服務
        reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        // 設置服務名,即服務提供者鎖暴露的名字
        reference.setInterface(HelloService.class);
        // 獲取一個代理實例
        HelloService service = reference.get();
        // 調用實例,執行方法
        String message = service.hello("dubbo I am anla7856");
        System.out.println(message);
    }
}

最終在Consumer將會輸出:hellodubbo I am anla7856

第一個例子Dubbo就結束了。

什麼?就結束了?如果我要用Dubbo,要這麼複雜?我調用10000個實例,我要寫10000個這樣的獲取過程??

當然不是,別激動,博主當然不會這樣坑大家,Dubbo 提供了 註解,xml 方式來暴露以及管理服務,所以不用每次調用都這樣寫。

後文中博主會全部交公滴。

具體本文小例子,可以從 pureapi 獲取。

預告

下一篇文章,將從第這個API開始,一步一步看Dubbo在這個過程中做了啥事

參考:

  1. https://github.com/apache/dubbo
  2. https://github.com/apache/dubbo-samples

關注博主公衆號,Dubbo小吃街不迷路:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章