SpringCloud Alibaba Nacos服務注冊與配置管理


Nacos

SpringCloud Alibaba Nacos是一個狗抑郁構建雲原生應用的動態服務發現、配置管理和服務管理平台。

Nacos:Dynamic Naming and Configuration Service

Nacos是注冊中心+配置中心=Eureka+Bus+Config

Nacos安裝並運行

本地環境必須有Java8以上版本和maven環境,先從官網上下載Nacos,然后解壓安裝包,直接在bin目錄下的startup.cmd,運行成功后直接訪問http://localhost:8848/nacos。用戶名密碼都是nacos,然后登陸到控制台。

image-20201204202856985

服務注冊與發現

如果要在您的項目中使用 Nacos 來實現服務注冊/發現,使用 group ID 為 com.alibaba.cloud 和 artifact ID 為 spring-cloud-starter-alibaba-nacos-discovery的 starter。


<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

如果不想使用 Nacos 作為您的服務注冊與發現,可以將 spring.cloud.nacos.discovery 設置為 false。一般使用時設置成true。
application.yml

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'

之后輸入localhost:8848/nacos進入web端nacos管理平台,然后可以在服務列表中看到注冊成功的實例名稱。

注冊到Nacos中有服務提供者和服務消費者。消費者調用提供者的方式要稍微復雜一些。
因為Nacos的依賴中默認引入了Ribbon服務調用和負載均衡工具,因為在 Consumer 端需要去調用 Provider 端提供的REST 服務。例子中我們使用最原始的一種方式, 即顯示的使用 LoadBalanceClient 和 RestTemplate 結合的方式來訪問。

服務提供方Controller

@RestController
public class PayController {
    
    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
        return "9001 nacos payment" + string;
    }
}

服務提供方配置

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'

消費方的pomxml和提供者的一樣,這里不再顯示。
消費者的配置文件

server:
  port: 83
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: nacos-order83-consumer

management:
  endpoints:
    web:
      exposure:
        include: '*'
# 消費者將要訪問的微服務名稱(服務提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

消費方的配置類

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

消費者的controller

@RestController
public class OrderController {
    @Resource
    private RestTemplate restTemplate;
    @Value("{service-url.nacos-user-service}")
    private String SERVICE_URL;

    @GetMapping(value = "/consumer/echo/{string}")
    public String echo(@PathVariable String string) {
        return restTemplate.getForObject("http://nacos-payment-provider/echo/" + string,String.class);
    }

}

啟動兩個服務,然后訪問消費者的localhost:83/consumer/echo/參數
輸出“9002 nacos payment,參數”

服務注冊中心對比

image-20201204212219087

C:是所有節點在同一時間看到的數據是一致的;A:是所有的請求都會得到響應。

一般倆說如果不需要存儲服務級別的信息且服務實例是通過nacos-client注冊,並能夠保持心跳上報,那么可以選擇AP模式,當前主流的服務如Spring cloud和Dubbo服務,都適用於AP模式,AP模式是為了服務的可能性減弱了一致性,因此AP模式下只支持注冊臨時實例。

如果需要在服務級別編輯或者存儲配置信息,那么CP是必要的,K8s服務和DNS服務適用於CP模式。CP模式下則支持持久化實例,此時則是以Raft協議偽集群運行模式,該模式下注冊實例之前還必須先注冊服務,如果服務不存在,則會返回錯誤。

Nacos引入中,默認包含有Ribbon相關依賴,因此負載均衡算法包含輪詢,隨機,加權等。

Nacos Config

使用Spring Cloud Alibaba Nacos Config,可基於SpringCloud的編程模式快速接入Nacos配置管理功能。

Nacos同SpringCloud-Config一樣,在項目初始化時,要保證先從配置中心進行配置拉取,拉取配置后,才能保證項目的正常啟動。

SpringBoot中配置文件是存在優先級順序的,bootstrap優先級高於application。

引入相關依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置文件

application.yml

spring:
  profiles:
    active: dev # 表示開發環境
    #active: test # 表示測試環境
    #active: info

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務注冊中心地址
      config:
        server-addr: localhost:8848 #Nacos作為配置中心地址
        file-extension: yaml #指定yaml格式的配置
        

動態獲取配置

在自定義的屬性值所在的類上添加@RefreshScope:動態獲取並刷新配置

@Value("${配置項的名}"):獲取配置文件中指定配置項的值
controller

@RestController
@RefreshScope //動態刷新
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("config/info")
    public String getConfigInfo(){
        //將nacos控制平台上的配置信息返回
        return configInfo;
    }
}

啟動nacos,主啟動類啟動。

進入localhost:8848/nacos/,登錄nacos后,點擊配置列表,選擇添加配置。

這里需要注意的是,配置文件名的命名規范。

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

image-20201205161218121

image-20201205161233859

image-20201205161300587

將這三個屬性值合並起來就是配置中心新建的配置文件的DataIdnacos-config-client-dev.yaml。只有這樣動態刷新配置時才能識別。

image-20201205161619436

image-20201205161810284

這時配置好config.info的值后,訪問controller指定路徑。結果如下。

image-20201205161840465

將配置文件中的版本改成2后重新訪問。

image-20201205161923310
如果配置中心和當前應用的配置文件中配置了相同的項,優先使用配置中心的配置。

image-20200929182608276

image-20200929182622410

{"msg":"success","empname":"zhangsan","code":0,"age":24}

Nacos的名稱空間

類似於Java里面的包名和類名,最外層的namespace是可以用於區分部署環境的,GroupID和DataID用於區分不同的對象。

Nacos默認名稱空間是public,Namespace主要用來實現隔離。

比如說現在有三個環境:開發,測試和生產環境,我們可以創建三個NameSpace,不同的Namespace之間是相互隔離的。

Service是微服務,一個Service可以包含多個集群,Nacos默認幾圈是DEFAULT,集群Cluster是對指定微服務的一個虛擬划分。

將Service微服務分別部署在杭州機房和北京機房。

最后是Instance是微服務的實例。

指定spring.profile.active和配置文件的DataID 來使不同的環境下讀取不同的配置

默認空間+默認分組+新建dev+test兩個DataID。

通過`spring.profile.active屬性就能進行火哥環境下配置文件的讀取。

image-20201205164817246

image-20201205164833043

image-20201205164851946


免責聲明!

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



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