【Lolttery】專案開發日誌 (五)目標dubbox,前進

晦若晨曦發表於2017-12-14

距離上一次開始使用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業務邏輯。當前端跟不上的時候才有時間去研究一下技術上的問題。

其實專案是個挺操蛋的專案,人手不夠,技術不過關,業務不熟練,基本上所有創業公司的坑都挨個踩著過來的。

然而硬著頭皮上,才是增長知識的最快方式。要說在這個專案中的收穫,很多不是具體的程式碼能描述的,而是一種對於整體的掌控力的提升。一種對於自己程式碼風格的突破吧。

算是第一次嘗試突破在老東家的程式碼風格,學習加入一些自己的理解.

唉,反正整個後臺就我自己一個人,給自己加油吧~

相關文章