第九章 Nacos Config--服務配置


今天咱們接着 上一篇 第八章 SMS–短信服務
繼續寫 SpringCloud Alibaba全家桶 —> 第九章 Nacos Config–服務配置,廢話不多說,開干


9.1 服務配置中心介紹

首先我們來看一下,微服務架構下關於配置文件的一些問題:

  1. 配置文件相對分散。在一個微服務架構下,配置文件會隨着微服務的增多變的越來越多,而且分散在各個微服務中,不好統一配置和管理。
  2. 配置文件無法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發布環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動
    維護,這比較困難。
  3. 配置文件無法實時更新。我們修改了配置文件之后,必須重新啟動微服務才能使配置生效,這對一
    個正在運行的項目來說是非常不友好的。
    基於上面這些問題,我們就需要配置中心的加入來解決這些問題。

配置中心的思路是:

  • 首先把項目中各種配置全部都放到一個集中的地方進行統一管理,並提供一套標准的接口。
  • 當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。
  • 當配置中心中的各種參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。

當加入了服務配置中心之后,我們的系統架構圖會變成下面這樣:

在這里插入圖片描述
在業界常見的服務配置中心,有下面這些:

Apollo

Apollo是由攜程開源的分布式配置中心。特點有很多,比如:配置更新之后可以實時生效,支持灰度發布功能,並且能對所有的配置進行版本管理、操作審計等功能,提供開放平台API。並且資料也寫的很詳細。

  • Disconf

Disconf是由百度開源的分布式配置中心。它是基於Zookeeper來實現配置變更后實時通知和生效的。

  • SpringCloud Config

    這是Spring Cloud中帶的配置中心組件。它和Spring是無縫集成,使用起來非常方便,並且它的配置存儲支持Git。不過它沒有可視化的操作界面,配置的生效也不是實時的,需要重啟或去刷新。

  • Nacos

這是SpingCloud alibaba技術棧中的一個組件,前面我們已經使用它做過服務注冊中心。其實它也集成了服務配置的功能,我們可以直接使用它作為服務配置中心。

9.2 Nacos Config入門

使用nacos作為配置中心,其實就是將nacos當做一個服務端,將各個微服務看成是客戶端,我們將各個微服務的配置文件統一存放在nacos上,然后各個微服務從nacos上拉取配置即可。

接下來我們以商品微服務為例,學習nacos config的使用。

1 搭建nacos環境【使用現有的nacos環境即可(之前講過)】

2 在微服務中引入nacos的依賴

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

3 在微服務中添加nacos config的配置

注意:不能使用原來的application.yml作為配置文件,而是新建一個bootstrap.yml作為配置文件

配置文件優先級(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服務端地址
        file-extension: yaml # 配置文件格式
  profiles:
    active: dev

4 在nacos中添加配置

點擊配置列表,點擊右邊+號,新建配置。在新建配置過程中,要注意下面的細節:
1)Data ID不能隨便寫,要跟配置文件中的對應,對應關系如圖所示
2)配置文件格式要跟配置文件的格式對應,且目前僅僅支持YAML和Properties
3)配置內容按照上面選定的格式書寫

在這里插入圖片描述5 注釋本地的application.yam中的內容, 啟動程序進行測試

如果依舊可以成功訪問程序,說明我們nacos的配置中心功能已經實現

9.3 Nacos Config深入


9.3.1 配置動態刷新

在入門案例中,我們實現了配置的遠程存放,但是此時如果修改了配置,我們的程序是無法讀取到的,因此,我們需要開啟配置的動態刷新功能。
在nacos中的service-product-dev.yaml配置項中添加下面配置:

在nacos中的service-product-dev.yaml配置項中添加下面配置:

config: 
   appName: product

方式一: 硬編碼方式


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NacosConfigController {

    @Autowired
    private ConfigurableApplicationContext applicationContext;
    	
    
    @GetMapping("/nacos-config")
    public 	String nacosConfig() {
     return applicationContext.getEnvironment().getProperty("config.appName");
    }
}

方式二: 注解方式(推薦)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class NacosConfigController {

    @Value("${config.name}")
    public String appName;
    	
    
    @GetMapping("/nacos-config")
    public 	String nacosConfig() {
    	
     return  appName;
    }
}

9.3.2 配置共享

當配置越來越多的時候,我們就發現有很多配置是重復的,這時候就考慮可不可以將公共配置文件提取出來,然后實現共享呢?當然是可以的。接下來我們就來探討如何實現這一功能。
同一個微服務的不同環境之間共享配置
如果想在同一個微服務的不同環境之間實現配置共享,其實很簡單。
只需要提取一個以spring.application.name 命名的配置文件,然后將其所有環境的公共配置放在里面即可。

只需要提取一個以spring.application.name命名的配置文件,然后將其所有環境的公共配置放在里面即可。

1 新建一個名為service-product.yaml配置存放商品微服務的公共配置

在這里插入圖片描述2 新建一個名為service-product-test.yaml配置存放測試環境的配置

在這里插入圖片描述3 新建一個名為consumer-dev.yaml配置存放開發環境的配置

在這里插入圖片描述4 添加測試方法

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class NacosConfigController {

    @Value("${config.env}")
    public String env;
    	
    
    @GetMapping("/nacos-config")
    public 	String nacosConfig() {
    	
     return  env;
    }
}

5 訪問測試

在這里插入圖片描述
6 接下來,修改bootstrap.yml中的配置,將active設置成test,再次訪問,觀察結果

spring:
  profiles:
	active: test # 環境標識

不同微服務中間共享配置

不同為服務之間實現配置共享的原理類似於文件引入,就是定義一個公共配置,然后在當前配置中引入。

1 在nacos中定義一個DataID為all-service.yaml的配置,用於所有微服務共享

spring: 
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: root
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

2 在nacos的中修改service-product.yaml中為下面內容

server:
  port: 8081
config:
    appName: product

3 修改bootstrap.yaml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服務端地址
        file-extension: yaml # 配置文件格式
        shared-dataids: all-service.yaml # 配置要引入的配置
        refreshable-dataids: all-service.yaml # 配置要實現動態配置刷新的配置
  profiles: 
     active: dev # 環境標識

4 啟動商品微服務進行測試

9.4 nacos的幾個概念

命名空間(Namespace)
命名空間可用於進行不同環境的配置隔離。一般一個環境划分到一個命名空間
配置分組(Group)
配置分組用於將不同的服務可以歸類到同一分組。一般將一個項目的配置分到一組
配置集(Data ID)
在系統中,一個配置文件通常就是一個配置集。一般微服務的配置就是一個配置集

在這里插入圖片描述

最近休息了幾天,明天繼續搞第十章 ,謝謝大家能看到這


免責聲明!

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



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