距離上一次開始使用dubbo已經有一段時間了,這段時間在專案的開發和實踐中,對於dubbo有了更深的瞭解。今天終於決定拋棄原有的netty框架,正式轉戰dubbox
dubbox是在阿里停止對dubbo進行更新之後,由噹噹網維護的一個dubbo版本。在使用上基本完全相容原有的dubbo方式。另外支援了更高版本的spring和FST等高效序列化庫。
另外很重要的一點,dubbox支援restful方式的呼叫,這意味著對APP的http服務也可以統一到這一套框架中,而不需要再部署一個tomcat對APP端提供restful方式的呼叫。
為了這次改動,詳細看了一遍dubbox的demo。並進行了以下修改
###1、使用zookeeper作為註冊中心。
上次的時候就說過要在適當的時候換用zookeeper作為註冊中心,那麼現在顯然就是一個合適的時候了~
zookeeper的安裝其實挺簡單,下載,配置zoo.cfg,只要如下兩行,指定一下資料目錄和日誌目錄
dataDir=/root/zookeeper/data
dataLogDir=/root/zookeeper/log
複製程式碼
然後執行
zookeeper/bin/zkServer.sh start
複製程式碼
就可以簡單的啟動一個例項。
而且因為之前使用了配置檔案,只要簡單的修改配置檔案:
dubbo.registry = zookeeper://192.168.3.9:2181
複製程式碼
重新指定一個註冊中心,就可以愉快的玩耍了。
值得一說的是,dubbo對於redis的支援果然如同文件所說,是不穩定的。很多時候在關閉服務的時候並不能在redis登出此服務。換用zookeeper之後,這個問題也就隨之解決了。
###2、更換啟動方式
原本的啟動器是啟動一個netty服務,然後通過netty服務中啟動spring的例項以執行dubbo。可以說繞了很大一圈。為了在dubbo還不可靠的情況下保障服務可用性。
現在dubbo已經基本穩定了,所以決定換用更為簡潔的啟動方式:
public class Application {
private static Logger logger = LoggerFactory.getLogger(Application.class);
public static String serverName = "";
private static volatile boolean running = true;
public static GenericApplicationContext applicationContext;
public static ChannelFuture future;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void setApplicationContext(GenericApplicationContext applicationContext) {
Application.applicationContext = applicationContext;
}
public static void startup(){
Application.applicationContext.start();
logger.info("service "+serverName+" start");
synchronized (Application.class) {
while (running) {
try {
Application.class.wait();
} catch (Throwable e) {
}
}
}
}
public static void shutdown(){
running = false;
}
}
複製程式碼
看似寫了一大堆,其實啟動的只有一句:
Application.applicationContext.start();
複製程式碼
是一個標準的spring應用啟動方式。下面的迴圈則保證程式不會退出。直到將標誌位置為false。
為保證呼叫的方式相對不變,仍舊另外提供了一個啟動器來進行一些初始化的操作:
public class DubboBootstrap {
public DubboBootstrap(String serverName){
//在初始化啟動器時獲取spring的上下文。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
//將上下文加入到一個全域性的變數中便於使用
Application.setApplicationContext(context);
Application.serverName = serverName;
}
/**
* netty啟動
* @throws Exception
*/
public void run() throws Exception {
Application.startup();
}
}
複製程式碼
至此在每個服務例項的啟動器上就只剩下了一行:
new DubboBootstrap(server_name).run();
複製程式碼
省去了每次啟動手動指定服務,指定服務端ip的麻煩。將一切交給配置檔案和可靠地dubbox吧~
###3、其它
專案搞了一個多月了,主要的工作還是善乏可陳的CRUD業務邏輯。當前端跟不上的時候才有時間去研究一下技術上的問題。
其實專案是個挺操蛋的專案,人手不夠,技術不過關,業務不熟練,基本上所有創業公司的坑都挨個踩著過來的。
然而硬著頭皮上,才是增長知識的最快方式。要說在這個專案中的收穫,很多不是具體的程式碼能描述的,而是一種對於整體的掌控力的提升。一種對於自己程式碼風格的突破吧。
算是第一次嘗試突破在老東家的程式碼風格,學習加入一些自己的理解.
唉,反正整個後臺就我自己一個人,給自己加油吧~