Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現

程式猿DD發表於2019-01-18

自Spring Cloud Alibaba釋出第一個Release以來,就備受國內開發者的高度關注。雖然Spring Cloud Alibaba還沒能納入Spring Cloud的主版本管理中,但是憑藉阿里中介軟體團隊的背景,還是得到不少團隊的支援;同時,由於Spring Cloud Alibaba中的幾項主要功能都直指Netflix OSS中的重要元件,而後者最近頻繁宣佈各元件不在更新新特性,這使得Spring Cloud Alibaba關注度不斷飆升,不少開發者或團隊也開始小範圍試水。筆者對此也進行了一段時間的調研與試水,接下來計劃以《Spring Cloud Alibaba基礎教程》為主題,為大家完成一套快速入門的免費內容,以支援開源社群的發展! ^_^

更多關於Spring Cloud Alibaba的介紹可見:《Spring Cloud 加盟重量級成員Spring Cloud Alibaba,打造更符合中國國情的微服務體系》

什麼是Nacos

Nacos致力於幫助您發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務後設資料及流量管理。Nacos幫助您更敏捷和容易地構建、交付和管理微服務平臺。Nacos是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。

在接下里的教程中,將使用Nacos作為微服務架構中的註冊中心(替代:eurekba、consul等傳統方案)以及配置中心(spring cloud config)來使用。

安裝Nacos

下載地址:https://github.com/alibaba/nacos/releases
本文版本:0.7.0

下載完成之後,解壓。根據不同平臺,執行不同命令,啟動單機版Nacos服務:

  • Linux/Unix/Mac:sh startup.sh -m standalone
  • Windows:cmd startup.cmd -m standalone

startup.sh指令碼位於Nacos解壓後的bin目錄下。這裡主要介紹Spring Cloud與Nacos的整合使用,對於Nacos的高階配置,後續再補充。所以,持續關注我的部落格或者公眾號吧!

啟動完成之後,訪問:http://127.0.0.1:8848/nacos/,可以進入Nacos的服務管理頁面,具體如下;

Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現

在完成了Nacos服務的安裝和啟動之後,下面我們就可以編寫兩個應用(服務提供者與服務消費者)來驗證服務的註冊與發現了。

服務提供者

第一步:建立一個Spring Boot應用,可以命名為:alibaba-nacos-discovery-server。如果您還不會或者不瞭解Spring Boot應用,建議先學習《Spring Boot基礎教程》

第二步:編輯pom.xml,加入必要的依賴配置,比如:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
        <optional>true</optional>
    </dependency>
</dependencies>

上述內容主要三部分:

  • parent:定義spring boot的版本
  • dependencyManagement:spring cloud的版本以及spring cloud alibaba的版本,由於spring cloud alibaba還未納入spring cloud的主版本管理中,所以需要自己加入
  • dependencies:當前應用要使用的依賴內容。這裡主要新加入了Nacos的服務註冊與發現模組:spring-cloud-starter-alibaba-nacos-discovery。由於在dependencyManagement中已經引入了版本,所以這裡就不用指定具體版本了。

第三步:建立應用主類,並實現一個HTTP介面:

@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Slf4j
    @RestController
    static class TestController {
        @GetMapping("/hello")
        public String hello(@RequestParam String name) {
            log.info("invoked name = " + name);
            return "hello " + name;
        }
    }
}

內容非常簡單,@SpringBootApplication定義是個Spring Boot應用;@EnableDiscoveryClient開啟Spring Cloud的服務註冊與發現,由於這裡引入了spring-cloud-starter-alibaba-nacos-discovery模組,所以Spring Cloud Common中定義的那些與服務治理相關的介面將使用Nacos的實現。這點不論我們使用Eureka、Consul還是其他Spring Cloud整合的註冊中心都一樣,這也是Spring Cloud做了封裝的好處所在,如果對Eureka、Consul這些註冊中心的整合還不熟悉的可以看看以前的這篇:Spring Cloud構建微服務架構:服務註冊與發現(Eureka、Consul)

第四步:配置服務名稱和Nacos地址

spring.application.name=alibaba-nacos-discovery-server
server.port=8001

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第五步:啟動上面建立的應用。可以在啟動時候增加-Dserver.port=8001的形式在本機的不同埠上啟動多個例項。

在應用啟動好之後,我們可以在控制檯或日誌中看到如下內容,代表已經註冊成功:

INFO 10476 --- [           main] o.s.c.a.n.registry.NacosServiceRegistry  : nacos registry, alibaba-nacos-discovery-server 10.123.18.216:8001 register finished

在啟動都ok之後,我們可以訪問Nacos的管理頁面http://127.0.0.1:8848/nacos/來檢視服務列表,此時可以看到如下內容:

Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現

這裡會顯示當前註冊的所有服務,以及每個服務的叢集數目、例項數、健康例項數。點選詳情,我們還能看到每個服務具體的例項資訊,如下圖所示:

Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現

服務消費者

接下來,實現一個應用來消費上面已經註冊到Nacos的服務。

第一步:建立一個Spring Boot應用,命名為:alibaba-nacos-discovery-client-common

第二步:編輯pom.xml中的依賴內容,與上面服務提供者的一樣即可。

第三步:建立應用主類,並實現一個HTTP介面,在該介面中呼叫服務提供方的介面。

@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Slf4j
    @RestController
    static class TestController {

        @Autowired
        LoadBalancerClient loadBalancerClient;

        @GetMapping("/test")
        public String test() {
            // 通過spring cloud common中的負載均衡介面選取服務提供節點實現介面呼叫
            ServiceInstance serviceInstance = loadBalancerClient.choose("alibaba-nacos-discovery-server");
            String url = serviceInstance.getUri() + "/hello?name=" + "didi";
            RestTemplate restTemplate = new RestTemplate();
            String result = restTemplate.getForObject(url, String.class);
            return "Invoke : " + url + ", return : " + result;
        }
    }
}

這裡使用了Spring Cloud Common中的LoadBalancerClient介面來挑選服務例項資訊。然後從挑選出的例項資訊中獲取可訪問的URI,拼接上服務提供方的介面規則來發起呼叫。

第四步:配置服務名稱和Nacos地址,讓服務消費者可以發現上面已經註冊到Nacos的服務。

spring.application.name=alibaba-nacos-discovery-client-common
server.port=9000

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

第五步:啟動服務消費者,然後通過curl或者postman等工具發起訪問,下面以curl為例:

$ curl localhost:9000/test
Invoke : http://10.123.18.216:8001/hello?name=didi, return : hello didi
$ curl localhost:9000/test
Invoke : http://10.123.18.216:8002/hello?name=didi, return : hello didi

可以看到,兩次不同請求的時候,真正實際呼叫的服務提供者例項是不同的,也就是說,通過LoadBalancerClient介面在獲取服務例項的時候,已經實現了對服務提供方例項的負載均衡。但是很明顯,這樣的實現還是比較繁瑣,預告下後面的幾篇,關於服務消費的幾種不同姿勢。

參考資料

程式碼示例

本文示例讀者可以通過檢視下面倉庫的中的alibaba-nacos-discovery-serveralibaba-nacos-discovery-client-common專案:

如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支援!

以下專題教程也許您會有興趣

本文首發於:http://blog.didispace.com/spring-cloud-alibaba-1/

相關文章