天天看點

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

文章目錄

    • 一、config是什麼?
    • 二、怎麼使用config?
    • 三、用戶端從config上擷取配置
    • 四、spring cloud config 高可用

一、config是什麼?

我們既然要做項目, 那麼就少不了配置,傳統的項目還好,但是我們微服務項目, 每個微服務就要做獨立的配置, 這樣難免有點複雜, 是以, config項目出來了,它就是為了解決這個問題: 把你所有的微服務配置通過某個平台:

比如 github, gitlib 或者其他的git倉庫 進行集中化管理(當然,也可以放在本地)。

可能這樣講有點抽象,我們來看一張圖:大概是這樣一個關系

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

二、怎麼使用config?

剛剛講完理論, 那麼我們來實踐一下, 怎麼配置這個confi呢? 我們剛剛說過 由一個config server 來管理所有的配置檔案, 那麼我們現在建立一個config server 項目 然後引入依賴:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
           

spring-cloud 的依賴我們就不提了,然後啟動類上面加入注解EnableConfigServer:

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class AppConfigServer {

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

           

yml配置:

server:
  port: 8080

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:3000/eureka/  #eureka服務端提供的注冊位址 參考服務端配置的這個路徑
  instance:
    instance-id: config-1 #此執行個體注冊到eureka服務端的唯一的執行個體ID
    prefer-ip-address: true #是否顯示IP位址
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 3

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/405990230/server-demo.git #配置檔案在github上的位址
          username: 1111  #連接配接git的使用者名。
          password: 1111 #連接配接git的使用者名密碼。
          #Configserver會在 Git倉庫根目錄、 config-file子目錄,以及所有以 bar開始的子目錄中查找配置檔案。
          search-paths: config-file,bar*
          #啟動時就clone倉庫到本地,預設是在配置被首次請求時,config server才會clone git倉庫
          clone-on-start: true
          #配置為true表示如果本地副本是髒的,将使Spring Cloud Config Server強制從遠端存儲庫拉取配置。
          force-pull: true
          
           

配置好以後,我們先試試通過config server來讀取配置

這裡我在github上有一些配置檔案:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

我們來看看test-config的内容:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

那麼如何通過config server來通路呢?

啟動項目後, 我們可以通過名字來讀取裡面的配置資訊:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

那我們要擷取dev環境/或者test環境下的配置呢? 通過-隔開即可。

我們現在來通路 test-config-dev:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

同理 如果要通路test環境下的配置, 改為test即可

其實,config通路配置檔案,是需要一個具體的通路規則的, 那麼這個通路規則到底是什麼呢? 我們可以在官網找到:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
           

application就是配置檔案的名字, profile就是對應的環境 label就是不同的分支 由這個規則可見, 我們使用的是第二種規則, 剩下的規則, 同學們可以自己去試試 , 對于yml 和properties類型config可以完美轉換, 也就是說你存的是yml 但是可以讀取為properties類型的反過來也是如此:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

三、用戶端從config上擷取配置

剛剛給大家簡單示範了一下config 以及怎麼讀取配置, 不過實際開發中,更多的不是我們人為去擷取,而是由微服務從config上加載配置, 那麼, 怎麼來加載呢?

首先,我們需要在我們的微服務加入一個依賴聲明他是config的用戶端:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        
           

需要注意的是,這個依賴不包括spring -boot依賴, 也就是說, 假設你這個項目要當作spring boot來啟動的話,還得依賴spring boot

啟動類不需要做改動, 标準的spring boot啟動類即可,需要注意的是yml檔案

以前我們對于spring boot的配置 是在application.yml裡面配置的,現在從config上讀取配置的話,還得需要一個bootstrap.yml配置檔案。

解釋一下這個bootstrap.yml:

spring cloud有一個“引導上下文"的概念,這是主應用程式的父上下文。引導上下文負責從配置伺服器加載配置屬性,以及解密外部配置檔案中的屬性。和主應用程式加載application.(yml或 properties)中的屬性不同,引導上下文加載(bootstrap.)中的屬性。配置在 bootstrap.*中的屬性有更高的優先級,是以預設情況下它們不能被本地配置。

那麼我們application.yml配置檔案裡面 隻需要做一些簡單的配置就可以了:

這裡我是通過注冊中心擷取資訊從server-config服務擷取配置資訊

spring:
  application:
    name: client-user
    
           

重點在于bootstrap.yml:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心
spring:
  cloud:
    config:
      name: application-user #這是我們要讀取的配置檔案名 對應擷取規則的{application}
      #profile: dev   #這個是要擷取的環境 對應的便是{profile}
      label: master #這個就是擷取的節點 對應的是{label}
      discovery:
        enabled: true   #是否通過注冊中心服務
        service-id: config  #注冊中心配置服務的名詞
        #uri : http://localhost:8080/ #這就是我們config server的一個位址


eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:3000/eureka/
      
           

啟動時從server-config服務讀取配置

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

遠端配置application-user.yml的内容:

server:
  port: 5000
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:3000/eureka/ #eureka服務端提供的注冊位址 參考服務端配置的這個路徑
  instance:
    instance-id: user-1 #此執行個體注冊到eureka服務端的唯一的執行個體ID
    prefer-ip-address: true #是否顯示IP位址
    leaseRenewalIntervalInSeconds: 10 #eureka客戶需要多長時間發送心跳給eureka伺服器,表明它仍然活着,預設為30 秒 (與下面配置的機關都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka伺服器在接收到執行個體的最後一次發出的心跳後,需要等待多久才可以将此執行個體删除,預設為90秒

spring:
  application:
    name: client-user #此執行個體注冊到eureka服務端的name

feign:
  hystrix:
    enabled: true

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 20000  #預設逾時時間
      circuitBreaker:
        requestVolumeThreshold: 20
        sleepWindowInMilliseconds : 5000

management:
  server:
    port: 5008  #自定義actuator請求接口,不配置預設就是服務端口
  endpoints:
    web:
      exposure:
        include: "*"
    health:
      show-details: always
      
           

我們來測試一下 看看他會不會使用這個5000端口啟動:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

這裡 我們檢視啟動資訊,能發現他現在使用的是我們從config server上讀取到的配置。

然後就可以正常通路了!

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

四、spring cloud config 高可用

config 高可用可以通過很多種方式, 比如說搭建一個nginx:

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心

方式二:

或者config server注冊到eureka上,client端也注冊到eureka上,則已經實作高可用

如何注冊就不提了,需要注意的點就是當config server都注冊完之後 client的配置檔案進行以下改動:

啟動兩個server-config服務,進行服務注冊

微服務架構專題十:Spring-Cloud 之 config 分布式配置中心
spring:
  cloud:
    config:
      name: application-user #這是我們要讀取的配置檔案名 對應擷取規則的{application}
      #profile: dev   #這個是要擷取的環境 對應的便是{profile}
      label: master #這個就是擷取的節點 對應的是{label}
      discovery:
        enabled: true
        service-id: config
        #uri : http://localhost:5088/ #這就是我們config server的一個位址


eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:3000/eureka/
      
           

這樣當其中一個配置服務出問題時,會自動去另外一個服務擷取配置。

以上均為魯班學院學習資料,歡迎大家報班學習,真心推薦!

繼續閱讀