Dubbo使用Apollo作為配置中心實戰

dbqb007發表於2019-03-17

一.Dubbo支援Apollo的介紹

Apollo是攜程開源的一款配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。

Dubbo目前的最新版本2.7.0將過去單一的註冊中心拆分成了註冊中心、後設資料中心和配置中心。其中配置中心起到的作用之一,就是將配置外部化,也就是將配置從應用內部剝離出去,可以在一個地方統一管理配置,也可以在程式啟動之後從配置中心修改配置,再動態重新整理到應用(前提是應用自身支援在啟動之後切換該配置)。

目前Dubbo已經支援Zookeeper、Nacos、Apollo作為配置中心。本文就將介紹將Apollo作為配置中心的使用方式。

二.Apollo的安裝與使用。

本部分不贅述,請參考官方文件:https://github.com/ctripcorp/apollo/wiki/Apollo%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97

三.Apollo配置Dubbo屬性:

開啟本地安裝的Apollo首頁並登陸:

新建一個應用dubbo-demo-provider,

新建一個namespace,名為dubbo,目前dubbo預設支援的名稱空間為dubbo。

注意不要勾選部門字首,同時設定為public。當設定為private時,只有相同的app.id的應用才可以獲取此配置。而public可以被所有應用獲取。

新增兩條配置:

新增屬性之後,點選“釋出”。

四.Dubbo應用搭建

1.下載Dubbo 2.7.0的原始碼。Dubbo原始碼中自帶了一個demo模組,可以直接執行。本文就通過修改它的配置,來使用Apollo配置中心。

2.開啟dubbo-demo-xml-provider模組下的dubbo-provider.xml配置檔案,註釋掉

<dubbo:registry address="multicast://224.5.6.7:1234" />

新增下面的配置:

<dubbo:config-center app-name="dubbo-demo-provider" protocol="apollo" address="127.0.0.1:8080"/>

3.開啟dubbo-demo-xml-consumer作同樣的配置。

4.demo程式碼講解:

首先是定義了一個介面:

public interface DemoService {

    String sayHello(String name);

}

在provider端實現這一介面:

public class DemoServiceImpl implements DemoService {
    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }

}

服務端啟動類:

public class Application {
    /**
     * In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before
     * launch the application
     */
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
        context.start();
        System.in.read();
    }
}

消費者啟動類:

public class Application {
    /**
     * In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before
     * launch the application
     */
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");
        context.start();
        DemoService demoService = context.getBean("demoService", DemoService.class);
        String hello = demoService.sayHello("world");
        System.out.println("result: " + hello);
    }
}

五.下載zookeeper並啟動

因為demo中需要使用zookeeper作為註冊中心,所以需下載zookeeper並啟動。具體方式請自行搜尋。

六.啟動應用

首先啟動provider,輸出日誌:

可以看到,因為沒有設定app.id,所以只能讀取public的配置

再啟動consumer,啟動日誌:

說明consumer呼叫provider成功

七.總結

Dubbo目前對支援Apollo作為配置中心做了一個初步的實現,目前所有的配置都是放到一個key下面(即value的一行是一個dubbo自身的配置)dubbo拿到這個配置後,自己解析為自身的多個配置。後續可能會修改為支援apollo上有多個key。

通過引入配置中心,可以在應用中減少配置,將配置放到配置中心統一管理。並且配置中心可以在不重啟應用的情況下修改配置並推送給應用。當然前提是應用的配置本身支援在啟動後改變並生效(某些配置可能在啟動時生效,但啟動後不能修改)。

相關文章