這幾天又學到了新知識:dubbo框架 此框架很好的解決了我之前的Netty微服務框架中遇到的服務註冊、管理的問題。於是拿來學學 官網地址:dubbo.io/ ##1、服務端的配置: dubbo可以與spring良好的結合,所以服務端的配置就比較簡潔:
<dubbo:application name="match-provider" />
<dubbo:protocol name="dubbo" serialization="fastjson" charset="utf-8"/>
<dubbo:registry address="redis://${ds.redis.url}:6379" />
<dubbo:annotation package="com.xinou.lolttery.server.dubbo" />
複製程式碼
在這裡使用了dubbo協議,fastjson做序列化。預設也是使用netty作為伺服器。
註冊中心用redis,單純是因為現在有一個redis服務。官方並不推薦使用。以後會考慮換用zookeeper
在具體的實現類中的註解如下:
@Service(version="1.0",interfaceClass = MatchService.class)
public class MatchServiceImpl implements MatchService {
複製程式碼
MatchService介面放在common專案下,被生產者和消費者共同依賴。
要注意這個Service註解並不是spring的註解,而是dubbo包下的註解。version也很重要,最開始的時候遇到了雙方版本號不一致(1.0.0與1.0)導致找不到服務的情況。
如此想來依賴版本號對於未來的版本管理也是甚好的。
剩下的程式碼就和正常的服務入口程式碼一樣了。
##2、客戶端
客戶端的問題在於不一定使用spring框架。
於是仿照官網的api呼叫,自己寫了一個客戶端工具,每次需要服務的時候只要如main函式中呼叫即可。省去了自己滿世界找服務地址的麻煩。
/**
* dubbo分散式服務客戶端
* Created by shizhida on 16/4/1.
*/
public class DubboClient {
public static void main(String[] args) {
MatchService matchService = DubboClient.getInstance().getService(MatchService.class);
System.out.println(matchService.listMatchByTime(1,1));
}
static class inner{
public static DubboClient client = new DubboClient();
}
public static DubboClient getInstance(){
return inner.client;
}
//連線快取
private Map<Class,ReferenceConfig> configpool = new ConcurrentHashMap<>();
//服務快取
private Map<Class,Object> servicepool = new ConcurrentHashMap<>();
private ApplicationConfig application;
private RegistryConfig registry;
public <T> T getService(Class<T> clazz){
//直接從服務快取池中取出
if(servicepool.containsKey(clazz)){
return (T) servicepool.get(clazz);
}
//若是服務快取池中沒有,檢查連線快取池並生成一個新的服務
else if(configpool.containsKey(clazz)){
ReferenceConfig<T> referenceConfig = configpool.get(clazz);
return referenceConfig.get();
}
//若連線快取池中也沒有,則生成一個新的連線並生成新的服務
else {
ReferenceConfig<T> referenceConfig = genReferenceConfig(clazz);
T service = referenceConfig.get();
servicepool.put(clazz,service);
return service;
}
}
private <T> ReferenceConfig<T> genReferenceConfig(Class<T> clazz) {
ReferenceConfig<T> reference = new ReferenceConfig<>(); // 此例項很重,封裝了與註冊中心的連線以及與提供者的連線,請自行快取,否則可能造成記憶體和連線洩漏
reference.setApplication(application);
reference.setRegistry(registry); // 多個註冊中心可以用setRegistries()
reference.setInterface(clazz);
reference.setVersion("1.0");
configpool.put(clazz,reference);
return reference;
}
private DubboClient(){
application = new ApplicationConfig();
application.setName("common-client");
// 連線註冊中心配置
registry = new RegistryConfig();
registry.setAddress("redis://192.168.3.9:6379");
}
}
複製程式碼