- 什么是Dubbo?
- Dubbo能做什么?
- 在Crystal框架下,如何開發基於Dubbo RPC的服務?
- 在Crystal框架下,如何調用Dubbo RPC服務?
- 相關的文章
什么是Dubbo?
Dubbo[]是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
其核心部分包含:
- 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
- 集群容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
- 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo能做什么?
- 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
- 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
- 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
想了解跟多關於Dubbo的信息,請查看:http://alibaba.github.io/dubbo-doc-static/Home-zh.htm
在Crystal框架下,如何開發基於Dubbo RPC的服務?
第一步:定義接口
- 創建接口Jar項目,如:test-dubbo-service-api;
-
創建接口類和接口方法,和通常的接口定義沒有什么區別,如:
public interface TestService { /** * * @param a * @return */ public String test(String a); }
第二步:實現並發布服務
- 創建服務實現項目,如:test-dubbo-service-impl;
-
引入接口項目(test-dubbo-service-api)、Crystal框架dubbo服務支持包(crystal-remote-server-dubbo),如:
<dependency> <groupId>com.gsoft.test</groupId> <artifactId>test-dubbo-service-api</artifactId> </dependency> <dependency> <groupId>com.gsoft.crystal</groupId> <artifactId>crystal-remote-server-dubbo</artifactId> </dependency>
-
實現服務接口,如:
@Service public class TestServiceImpl implements TestService { @Value("${crystal.application.name}") private String name; /* * (non-Javadoc) * * @see com.gsoft.test.dubbo.TestService#test(java.lang.String) */ @Override public String test(String a) { return "Hello, " + a + "! " + " I'm " + name + " " + System.getenv("LOGONSERVER") + "."; } }
-
在實現類上添加注解@Service,此處Service為dubbo服務的聲明注解com.alibaba.dubbo.config.annotation.Service,到此,基於Dubbo發布的服務已經開發並發布完成。
在Crystal框架下,如何調用Dubbo RPC服務?
第一步:項目中引用Dubbo服務接口包和Crystal框架dubbo客戶端支持包(crystal-remote-client-dubbo),如
<dependency> <groupId>com.gsoft.test</groupId> <artifactId>test-dubbo-service-api</artifactId> </dependency> <dependency> <groupId>com.gsoft.crystal</groupId> <artifactId>crystal-remote-client-dubbo</artifactId> </dependency>
第二步:在需要使用Dubbo RPC服務的類中,添加服務的引用,並添加@Reference注解:(此處Reference為dubbo服務的聲明注解com.alibaba.dubbo.config.annotation.Reference
public class TestCostumer { @Reference private TestService s; private int i = 0; @Value("${crystal.application.name}") private String name; public void hello() { System.out.println(s.test(name + " " + System.getenv("LOGONSERVER") + "-" + ++i)); } }