Spring Alibaba Nacos替換dubbo zookeeper

大佛拈花發表於2018-12-16

阿里巴巴不得不說在開源方面是國內做的最好的,沒有之一吧。先是druid資料庫連線池。筆者有幸在學習之處就使用到它,它是在2012年開源的,但是大規模的使用卻是在2015年。後來又推出了dubbo RPC框架。這個在2012年開源的,但是後續沒有人維護,再到後來攜程pull了一個分支自己去維護,也就是dubbox。直到2017年dubbo開始復活,並且每個月釋出新的版本。在國內dubbo的使用還是比較多的。然後就是接觸到了RocketMQ。有個訊息中介軟體,和dubbo一樣,同樣是apache基金會頂級專案。這三款開源產品現在是比較流行的。今年Spring Cloud預設的註冊中心Eureka現在是閉源啦,然後就是Hytrix這個服務隔離也閉源啦。因此阿里巴巴開源團隊以及國內的一些開源大神開始用nacos準備替換Eureka,還有一個功能是可以作為配置中心,之前攜程的Apollo也是作為配置中心的。好了,話不多說,下面的例項工程是我使用nacos作為zookeeper的替代者作為註冊中心。需要說明的是nacos現在的版本是0.6.1。因此它暫時還是不能用在生產上,但是預計2019年會正式的開源使用。

先下載nacos伺服器,筆者在windows下操作的,當然linux或者是mac的具體安裝可以見官網:https://nacos.io 。

 

上圖是下載後的nacos的目錄結構。點選bin進去之後直接執行startup.cmd即可啟動nacos服務。下面表示啟動成功。

                                              

上圖是我構建的dubbo服務的工程結構。API是一個公共介面。Provider是服務的提供者,Consumer是服務的消費者。很簡單的入門demo.

API介面程式碼如下:

/**
 * @author gosaint
 */
public interface DemoService {
    String sayHello(String name);
}

      然後我們搭建Provider,服務的提供者。首先要加nacos的jar包。還有要說明一點,必須加上log4j-core這個jar包。否則會報錯。這是nacos的一個bug。我還有點小小的激動,剛才我問了下nacos開源組織大神小馬哥,小馬哥說這確實是一個bug,然我解決,我希望可以成為我nacos的一個commiter。下面的依賴涉及Spring、Dubbo的依賴我不展示了,只展示nacos的依賴以及log4j-core。就是一個單純的dubbo工程,只不過加上這兩個jar即可。

       <!-- Dubbo Nacos registry dependency -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>0.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.10.0</version>
        </dependency>

 

然後是dubbo的配置檔案。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--應用名稱-->
    <dubbo:application name="demo-dubbo"/>
    <!--註冊中心 這裡使用Zookeeper-->
   <!-- <dubbo:registry address="zookeeper://127.0.0.1:2182"/>-->
    <!--使用nacos作為註冊中心-->
    <dubbo:registry address="nacos://127.0.0.1:8848" />
    <!--用dubbo協議在20880埠暴露服務-->
    <dubbo:protocol name="dubbo" port="20885"/>
    <!--介面以及實現類-->
    <dubbo:service interface="com.cmos.interfaces.DemoService" ref="demoService" />
    <bean id="demoService" class="com.cmos.service.DemoServiceImpl"/>
</beans>

    需要說明的是nacos的預設埠是8848.然後我們寫介面的實現以及Dubbo的啟動類:

/**
 * @author gosaint 
 */
public class DemoServiceImpl implements DemoService {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

下面是dubbo的啟動類:

/**
 * @author gosaint
 */
public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] {"META-INF/spring/dubbo-demo-provider.xml"});
        context.start();
        System.out.println("服務啟動!");
        System.in.read();
    }
}

執行方法,啟動成功!

下面繼續搭建Consumer。pom依賴基本一致,我就不貼程式碼啦。然後就是配置檔案和服務dubbo消費者的啟動。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--應用名稱-->
    <dubbo:application name="demo-dubbo"/>
    <!--註冊中心 這裡使用Zookeeper-->
   <!-- <dubbo:registry address="zookeeper://127.0.0.1:2182"/>-->
    <dubbo:registry address="nacos://127.0.0.1:8848"/>
    <dubbo:reference id="demoService" interface="com.cmos.interfaces.DemoService"/>

</beans>

 

啟動類如下:

/**
 * @author gosaint
 */
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
                (new String[] {"META-INF/spring/dubbo-demo-consumer.xml"});
        context.start();
        // 獲取遠端服務代理
        DemoService demoService = (DemoService)context.getBean("demoService");
        // 執行遠端方法
        String hello = demoService.sayHello("world");
        // 顯示呼叫結果
        System.out.println( hello );
        System.in.read();
    }
}

最後的執行結果:Hello World。是不是和zookeeper基本一致呢。關於nacos的基本實現我還沒有了解過,因此無從比較優劣。最後nacos提供了一個管理頁面,可以直接訪問http://127.0.0.1:8848/nacos/index.html 。如下是我的管理介面:

 

相關文章