這幾天又學到了新知識:dubbo框架java
此框架很好的解決了我以前的Netty微服務框架中遇到的服務註冊、管理的問題。因而拿來學學redis
官網地址:http://dubbo.io/spring
一、服務端的配置:json
dubbo能夠與spring良好的結合,因此服務端的配置就比較簡潔:api
<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做爲服務器。緩存
其實最開始使用的是默認的協議和序列化。可是會出現Class not found的錯誤。緣由在於原來爲了便於管理json,返回數據使用各類實體bean組合,在默認的序列化狀況下包含了java類的信息,會致使客戶端找不到此實體類。服務器
爲了和原代碼保持一致,因而決定使用fastjson。app
註冊中心用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)致使找不到服務的狀況。
如此想來依賴版本號對於將來的版本管理也是甚好的。
剩下的代碼就和正常的服務入口代碼同樣了。
二、客戶端
客戶端的問題在於不必定使用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"); } }