跑偏聊聊??springcloud config配置中心步驟以及踩的坑


一、心路歷程

終於告一段落了,從開始搭建配置中心到現在,經歷了心理和現實的一系列過程。

入職這家公司后,有個公司架構師給了一個基礎的框架,說是用springcloud,里面切切實實是一個架子,springcloud的多個組件都沒有引入(在這里提一下,這個架構是我們投資人的其他公司的技術,不屬於我們公司,只是順便帶一下我們)。

看我之前的文章大家知道,業務開發中基本的springcloud zuul和feign組件是我一步一步搭建起來的。雖說對於大部分人來說很簡單,但對於我來說,由於之前公司使用的是springboot,所以從接觸springcloud至今還沒到一年的時間。搭建起來既屬於了解也屬於摸索的過程。

大家知道springcloud是個全家桶模式,里面是由多個組件構成的。zuul和feign是開發業務必須的,所以早早的搭建了。其他的還在逐步完善中。因為最近在聯調接口,有點時間,想起來config還沒搭建,就起了念頭。

前段時間搜過很多關於config的文章,都沒看下去,后來就上手根據網上的步驟一步一步操作,但是有的步驟操作着操作着就斷了,接下來的步驟也不一樣,慢慢的搭建配置中心的事情擱置了。

最近領導讓我們小組長出一份近月的工作安排,我覺得是時候將配置中心實實在在的安排進去了。接下來我耐心開始搜集相關資料,沒想到當天的配置中心就進行了大概40%的樣子(原諒我需要一些時間進行摸索,哈哈哈)。

到今天,大概步驟是走完了,雛形出現了。不由得感慨一下子。

有的事情需要堅持、需要耐心。記得幾年前?我忘記了,當時和我老公去海南玩,每個女生都想要美美噠,但當時畫眼線是我化妝道路上的一道坎,平時上班懶,加上每次畫眼線就開始流眼淚,導致我一直沒有學會。那次出門旅游,我又帶了眼線筆,以為眼線筆又是陪伴我旅游的伙伴。記得第二天早晨出門之前,我開始洗漱化妝,試着拿出眼線筆,還是流淚,還是不行,但是我心里有個信念,我一定要學會,忍住眼淚,按照網上的步驟,眼線慢慢成形了。雖然我現在上班也不畫眼線,但是我會,這很重要,至少哪天心血來潮,我可以美美的出gai。后來戴美瞳也是相同經歷。其實這就是不放棄和相信的力量。我身上有太多相信的力量,以后有機會可以慢慢講給你們。有點跑偏了。。。。。

 

二、懶惰的可怕

繼續聊偏。。。從某個時刻起,我對生活變得太過知足。舉栗子,假如是經歷了一些常人沒經歷的事情。其實我覺得這種經歷挺害人的,害我從對生活的積極追求,變成對生活的消磨。不是不再熱愛生活,只是沒有沖勁。其實我和我老公對比就能看的出來,因為我倆都是做技術的,而我現在還是個搬運工,他已經稱為工程師了,嗚嗚。。。。好了,話不多說了,開始我們的配置中心步驟及我踩過的坑,有興趣的可以關注我,等以后有機會繼續聊。

 

三、進入正題——開始配置中心config(遇到的坑在步驟中列出,如果你在配置中有問題,參照我的步驟看能不能出坑)

來一波官方介紹:配置管理。springcloud提供服務端和客戶端。服務端存儲后端的默認實現使用git(github或者碼雲)。

白話:為了在不同的環境、不同的分支(lable沒配置,我們項目不需要區分分支配置)獲取不同的配置信息。

步驟開始:

1.springcloud config服務端:

新建一個service-config服務,

三個文件:啟動類的文件configApplication/依賴型文件pom.xml/配置類文件application.yml

1.configApplication.java:加注解@EnableConfigServer

@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigApplication{

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

}

2.pom.xml中引入spring-cloud-config-server

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.application.yml

spring:
  application:
    name: config-service
  cloud:
    config:
      server:
        git:
          uri: git@gitee.com:********.git(放配置文件的碼雲地址,ssh類型的)
          searchPaths: tms-config/{application}(tms-config是文件夾,application是每個服務的名字,自動獲取,你也可以寫死例如bi-service,代表這個服務的所有配置,我這邊是通過{application}來獲取客戶端名稱匹配文件夾.下邊有截圖呼應)
          strict-host-key-checking: false
          ignore-local-ssh-settings: true
          private-key: |
                        -----BEGIN RSA PRIVATE KEY-----
                        MIIJKwIBAAKCAgEA5/4250BoXVUpkLhcePM333ZRxm565XvhnspHOi/PrwjQp0H8
                        .........
                        -----END RSA PRIVATE KEY-----
         #username:
         #password:

server:
  port: 8888


# 配置服務注冊中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka-server:8761/eureka/

坑一:

用戶名密碼方式和公私鑰方式都可以。

如果uri是https形式,那么使用用戶名和密碼方式即可

如果uri是ssh形式,則使用公私鑰形式。

重點說下公私鑰形式的坑:

首先要加上這兩行:

strict-host-key-checking: false
ignore-local-ssh-settings: true

其次:生成公私鑰,私鑰放到項目里,公鑰放到碼雲的對應項目的公鑰配置里(配置中心文件結構,等下有圖)

此時:服務端ok了,如果啟動完注冊中心和配置中心,出現以下問題:

.git.privateKey' is not a valid private key

 

可能的原因一:碼雲不接受以-----BEGIN OPENSSH PRIVATE KEY開頭的私鑰形式,你需要生成以

----BEGIN RSA PRIVATE KEY開頭的形式。如上圖。生成命令

ssh-keygen -m PEM -t rsa -b 4096 -C "****"

可能原因二:這是我搜索出來的,private-key空格后加一個真實的 | 才行

 

 

 

接下來上圖碼雲上的配置文件的結構:4個圖,提示的是每次點進去的內容。注意config上的配置文件是以應用名-dev/-test/-prod.properties結尾的,就是不同環境拉不同配置

 

 

 

好,此時,服務端已經ok了。你可要通過請求試一下

2.客戶端(業務端模塊)處理:

修改三個文件,依賴型文件pom.xml、配置型文件application.yml、業務使用controller

pom.xml引入spring-cloud-starter-config

<!--Spring Cloud Config 客戶端依賴-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Spring Boot Actuator,感應服務端變化(實現熱更新配置使用)-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info
spring:
  application:
    name: bi-service
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server(可用下邊的uri代替)
      profile: dev //環境配置
#      uri: http://localhost:8888(可用service-id: config-server代替)

server:
  port: 8084

 controller:


@RefreshScope
@RequestMapping("/api/bi/biDictionary")
@RestController
public class BiDictionaryController {

    @Value("${common_service_config}")
    private String configInfo;


    @GetMapping("/baseData")
    public String getaaa(){
        System.out.print(configInfo);
}


}

坑二:

啟動完注冊中心、配置中心、在啟動客戶端時,如報錯:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'common_service_config' in value "${common_service_config}"

 

原因是:客戶端的應用名和配置文件的應用名沒有一致

 本客戶端的應用名為:bi-service。在配置文件里應該叫bi-service-dev.properties。如果前面不一致的話,是找不到配置文件的

 

坑三:刷新生效的四步

栗子:如果你修改了bi-service-dev.properties里的common_service_config=devdev,把devdev改成devdev111。如果你啟動客戶端bi-service服務,是可以讀取到新的devdev111.但是啟動客戶端成本較大,我們需要實現熱更新。

解決方法:(上面貼的代碼里已包含)

1.客戶端pom.xml中引入了spring-boot-starter-actuator。2.在controller的類上加了注解@RefreshScope。加這個的目的是為了在修改配置后不啟動客戶端。但此時,修改后,客戶端並沒有拉取到新的值。3.需要在客戶端applicaiton.yml加上

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

此時,在所有服務運行過程中,如果你修改了bi-service-dev.properties,改成devdev111。

4.你需要在postman或者黑屏里執行

curl -X POST http://localhost:8084/actuator/refresh。注意域名和ip是客戶端的。執行后,你在客戶端controller下次獲取到的值就變成devdev111.

完美。此時我最近配置的config步驟和三個坑都說完了。

以上是我總結的springcloud config,以后新增組件和其他內容,還會跟大家分享,大家有什么疑問和我不對的地方,歡迎咨詢和指正


免責聲明!

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



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