大家好,最近公司新項目采用SpingCloud全家桶進行開發,原先對SpringCloud僅僅只是停留在了解的初級層面,此次借助新項目的契機可以深入實踐下SpringCloud,甚是Happy。大學畢業剛入職的時候就有想寫技術文章的想法,蹉跎蹉跎都那么些年過去了,期間所遇到的問題都圖方便隨手保存在了有道雲筆記這個狹小的空間中,記了這么多也要見見光了,后續有機會都遷移出來,大家互相學習,提升技術,修煉內功。話不多說,那我們現在就開始SpringCloud之旅吧!
項目版本
spring-boot-version:2.2.5.RELEASE
spring-cloud.version:Hoxton.SR3
ConfigServer服務端
先構建SpringCloud Config服務端
打開https://start.spring.io/
勾選Config Server,下載導入IDE即可

部分pom信息
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
application.properties
# 應用服務名稱
spring.application.name=config-server
# 應用服務端口號
server.port=9001
# Git遠程庫檢索相對地址
spring.cloud.config.server.git.search-paths=/springCloudAProject/**
# Git遠程庫http訪問項目地址
spring.cloud.config.server.git.uri=https://github.com/niuniu9631/SpringCloudConfig
# Git遠程庫http訪問驗證用戶名
spring.cloud.config.server.git.username=自己Git賬號
# Git遠程庫http訪問驗證密碼
spring.cloud.config.server.git.password=自己Git賬號密碼
ConfigServerApplication.java
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
至此服務端相關代碼配置都已OK,讓我們一起Run起來吧。
通過瀏覽器訪問下服務,http://localhost:9001/

因未對外開放任何訪問接口,所以出現404就是對的啦,只要項目沒有啟動出錯就說明配置這塊沒啥問題了,不放心當然可以構建個客戶端訪問拉取下數據。這邊我提供下我這邊發現的一個小技巧,啟動沒報錯后,可去系統的臨時文件查看是否有新建的以config-repo-xxxxx開頭的目錄,有的話說明服務端Git配置這塊沒有問題。
Windows默認臨時目錄:C:\Users\wyb\AppData\Local\Temp
Linux默認臨時目錄:/tmp
該配置項可根據該配置項進行調整
spring.cloud.config.server.git.basedir=指定目錄
我這邊未配置指定目錄,臨時目錄文件如下

ConfigClient客戶端
還是老樣子,打開https://start.spring.io/,
勾選Config Client,Spring Web,下載導入IDE即可。

部分pom信息
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.properties
# 客戶端服務應用名稱
spring.application.name=config-client
# 客戶端端口號
server.port=9002
bootstrap.properties
# 應用服務名稱
spring.cloud.config.name=config-client
# 對應git上分支名稱
spring.cloud.config.label=master
# 對應配置文件上profiles參數項
spring.cloud.config.profile=dev
# 配置服務端請求地址
spring.cloud.config.uri=http://localhost:9001/
ConfigClientApplication.java
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
ConfigClientWebController.java
用於訪問配置項進行驗證
@RestController
public class ConfigClientWebController {
@Value("${app.env.name}")
private String appEnvName;
@RequestMapping("/getEnv")
public String getEnv() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+",envName:"+appEnvName;
}
}
至此客戶端相關代碼配置都已OK,讓我們一起Run起來吧。
通過瀏覽器訪問下服務,http://localhost:9002/getEnv

成功獲取到Git遠程倉庫中的配置項信息。遠程倉庫目錄如下圖

注意事項
到此為止,已基本完成配置中心服務端和客戶端的構建及配置,接下來說下本人在構建搭建過程中遇到的問題。
問題1:spring.cloud.config.server.git.search-paths配置問題
剛開始我這邊該配置參數如下
spring.cloud.config.server.git.search-paths=/springCloudAProject/**
Config Server端啟動正常,Config Client端啟動報如下錯誤
java.lang.IllegalArgumentException: Could not resolve placeholder
后來自己折騰來折騰去,漸漸發現了問題所在,原來這個/**
存在一定的對應關系,不能亂用,調整目錄結構后正常訪問了


問題2
公司項目Git采用阿里雲Code進行管理,服務端配置后老是提示沒有權限訪問
排查了下項目權限也是master,賬號和密碼都是對的,怎么會沒有權限訪問呢。折騰了許久都沒有進展,后來查看Spring Cloud Config 配置項得知還可以配置SSH訪問,那就試試吧,調整服務端配置如下
spring.cloud.config.server.git.uri = git@code.aliyun.com:XXX/XProjectConfig.git
spring.cloud.config.server.git.ignore-local-ssh-settings=true
spring.cloud.config.server.git.private-key=XXX
在這里也遇到了另外一個問題,網上該配置都是基於yml配置的,心想應該都兼容的吧,將私鑰復制過來,發現不對貌似都不能正常識別該配置,后通過百度得知如下
私鑰開頭和結尾前一行需要\n,中間行需要 \ 連接;要保證秘鑰內容是綠色有效值文本
具體如下
spring.cloud.config.server.git.private-key=-----BEGIN RSA PRIVATE KEY-----\n\
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\
XXXXXXXXXXXXXXXXXXXXXXXXX\
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\
XXXXXXXXXXXXXXXXXXXXXXX\n\
-----END RSA PRIVATE KEY-----

本文由博客群發一文多發等運營工具平台 OpenWrite 發布
