今天開始,一起研究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在這個過程中做了啥事
參考:
關注博主公衆號,Dubbo小吃街不迷路: