SpringCloud(Alibaba版)Nacos注冊中心


一、Nacos Discovery簡介

為什么叫Nacos?

  前四個字母分別為 Naming 和 Configuration 的前兩個字母,最后的 s 為 Service。所以組成 N A C O S

是什么?

  Nacos 是一個易於構建雲原生應用的動態服務發現,配置管理和服務管理平台。使用 Spring Cloud Alibaba Nacos Discovery,你可以基於 Spring Cloud 的編程模型快速訪問 Nacos 服務注冊功能。

  • Nacos:Dynamic Naming and Configuration Service。

  • Nacos:其實就是 Eureka 服務注冊中心 + Config 服務配置中心 + Bus消息總線的組合。

 

二、安裝並運行Nacos

去哪下載?

  先訪問 Nacos 的 GitHub 地址:https://github.com/alibaba/Nacos,找到 http://nacos.io 鏈接進入 Nacos 官網:

進入 Nacos 官網后,然后單擊 Release Note of V1.2.0 版本:

最后進入到 1.2.0 下載頁面:https://github.com/alibaba/nacos/releases/tag/1.2.0,在 Assets 菜單下有個 nacos-server-1.2.0.zip 下載就 OK 了(tar.gz 是linux版本,zip 是windows版本)。

運行Nacos:

  解壓 Nacos 安裝包成功后,找到自己下載 Nacos 服務的 bin 目錄,有個 startup.cmd 命令,鼠標雙擊啟動即可運行:

此時,一個標准的單機模式 Nacos 服務就啟動成功了,Nacos 默認 Tomcat 端口號為 8848。看到 8848 這個數字,不由自主的讓我想起很早以前打廣告牛逼的 8848 鈦金手機,吐槽一波!!!

如何驗證是否運行成功呢?

  很簡單,命令運行成功后直接訪問http://localhost:8848/nacos/,進入到 Nacos 網站首頁管理界面,看到有 Nacos Logo 這個界面之后,就代表你的 Nacos 服務沒有任何問題了,這樣界面有點類似於平時我們做項目的后台管理頁面。

我使用的是 1.2.0 版本,不需要進入 Nacos 登錄頁面就可以進行使用。這時不管點哪個菜單都沒有數據顯示!

 

三、基於Nacos的服務提供者

1)build.gradle項目依賴

創建gradle模塊provider-nacos並添加web、actuator監控與alibaba-nacos-discovery依賴

dependencies {
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'

   compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

   compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE'
}

2)application.yaml配置文件

server:
  port: 8081
spring:
  application:
    name: provider-nacos
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #指定Nacos服務地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
View Code

注意:如果不想使用 Nacos 服務注冊和發現功能,則 properties 配置文件中設置 spring.cloud.nacos.discoveryfalse或者使用 yaml 格式:

spring:
  cloud:
    nacos:
      discovery: false
View Code

3)啟動類ProviderNacosApplication.java

啟動類添加@EnableDiscoveryClient注解,將Spring Boot應用程序注冊服務至 Nacos。

package org.wesson.cloudalibaba.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderNacosApplication {

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

}
View Code

4)Controller

package org.wesson.cloudalibaba.nacos.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/client")
public class ProviderNacosController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/info")
    public String info() {
        return "hello, nacos registry center serverPort:" + serverPort;
    }

}
View Code

5)測試

Step1:上述已經成功啟動 Nacos 服務了

Step2:直接運行 provider-nacos 啟動類,端口為8081

Step3:先訪問http://localhost:8081/client/info,輸出結果如下:

  • hello, nacos registry center serverPort:8081

Step4:然后訪問http://localhost:8848/nacos,找到服務管理下的服務列表,就能夠看到一個服務名為 provider-nacos 的應用程序注冊至 Nacos 服務管理頁面了:

此時,Nacos 服務注冊中心 + 服務提供者構建成功了。

 

四、基於Nacos的服務消費者

1)build.gradle項目依賴

創建gradle模塊consumer-nacos並添加web、actuator監控與alibaba-nacos-discovery依賴

dependencies {
   compile group: 'org.springframework.boot', name: 'spring-boot-starter-web'

   compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'

   compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE'
}

2)application.yaml配置文件

server:
  port: 8000
spring:
  application:
    name: consumer-nacos
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #指定Nacos服務地址
management:
  endpoints:
    web:
      exposure:
        include: '*'
service-url:
  provider-nacos: http://provider-nacos #消費者將要去訪問的微服務名稱(注冊進Nacos的微服務提供者)
View Code

3)啟動類ConsumerNacosApplication.java

通過 Spring Cloud 原生注解 @EnableDiscoveryClient 開啟服務注冊發現功能。給 RestTemplate 實例添加 @LoadBalanced 注解,開啟 @LoadBalanced 與 Ribbon 的集成:

package org.wesson.cloudalibaba.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerNacosApplication {

    // 實例化一個RestTemplate Bean
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

}
View Code

4)Controller

package org.wesson.cloudalibaba.nacos.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/client")
public class ConsumerNacosController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerNacosController.class);

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${service-url.provider-nacos}")
    private String consumerServiceUrl;

    @GetMapping("/info")
    public String info() {
        // getForObject方法
        return restTemplate.getForObject(consumerServiceUrl + "/client/info", String.class);
    }

    @GetMapping("/log-info-instance")
    public void logInfo() {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-nacos");
        // 打印當前選擇的是哪個節點
        ConsumerNacosController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(),
                serviceInstance.getHost(), serviceInstance.getPort());
    }

}
View Code

5)測試

Step1:上述已經成功啟動 Nacos 服務了

Step2:運行 provider-nacos 啟動類2個實例,端口為8081、8082

Step3:運行 consumer-nacos 啟動類,端口為8000

Step4:多次訪問http://localhost:8000/client/info,返回結果如下:

  • hello, nacos registry center serverPort:8081

Step5:多次訪問http://localhost:8000/client/log-info-instance,控制台會打印如下日志信息:

Step6:最后回到訪問http://localhost:8848/nacos管理平台,我們能夠看到服務提供者有兩個實例數,而服務消費者有一個實例數,都注冊至 Nacos 服務管理頁面了:

6)為什么Nacos支持負載均衡?

  因為阿里后面技術整合的非常好,Spring Cloud Alibaba 技術會吸收前面 Spring Cloud Netflix 技術的優點,所以天生默認自帶負載均衡功能。我們打開 IDEA 找到最右側 Gradle 依賴:

只要是使用過 Netflix Ribbon 都清楚,第一支持負載均衡(Load Balance),第二可以調用 RestTemplate,進行REST風格遠程調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM