網上關於 Nacos 的使用介紹已經很多了,又是國產確實也好用。關於 Consul 的也很多,不過都是與 Spring Boot 整合的。此文講講 Consul 與 Solon 整合與簡單使用(是用起來很簡單的意思)。
說起 Consul 的部署,用 docker-compose 最是方便。非常適合小專案使用:
version: '3'
services:
consul:
image: library/consul
container_name: consul
volumes:
- "./data:/consul/data"
- "./config:/consul/config"
ports:
- 8300:8300
- 8301:8301
- 8301:8301/udp
- 8302:8302
- 8302:8302/udp
- 8400:8400
- 8500:8500
- 153:53/udp
command: "agent -server -bind=0.0.0.0 -client=0.0.0.0 -node=consul_Server1 -bootstrap-expect=1 -ui"
啟動後用 “http://localhost:8500” 開啟(賬號:admin;密碼:public),就進入管理後臺了。
1、認識 Solon
Solon 一個高效的應用開發框架:更快、更小、更簡單,也是個新起的 Java 生態。
啟動快 5 ~ 10 倍;qps 高 2~ 3 倍;執行時記憶體節省 1/3 ~ 1/2;打包可以縮到 1/2 ~ 1/10;同時支援 jdk8, jdk11, jdk17, jdk19。
Solon 專案官網:https://solon.noear.org
2、認識 Solon Cloud Config
Solon Cloud 是一套分散式(或微服務)開發的介面與配置規範。其中 Solon Cloud Config 為雲端配置服務,主要提供分散式配置服務的介面並與相關的中介軟體客戶端進行適配:
- 透過 CloudConfigService 介面與中介軟體進行適配
- 使用 CloudClient.config() 獲取適配例項,可支援手動操作
- 一般透過透過配置和 @CloudConfig 註解進行使用
其中 consul-solon-cloud-plugin,是 consul 關於 solon cloud config 的適配。也是本文的主角。
3、專案整合
3.1、在 Consul 管理後臺準備兩個配置
安裝好 consul 後,需要準備下配置資料。consul 沒有名稱空間或組的概念,但 consul-solon-cloud-plugin 還是支援組的,用“/”隔開。新建個“demo/demoapp.yml” 配置(這個配置,用於匯入到應用屬性):
demo.user.name: "1"
再準備 “demo/demo-ds” 配置(這個配置,將直接使用):
demo.ds:
url: ""
username: ""
password: ""
3.2、建立專案,完成配置
藉助 Solon Initializr( https://solon.noear.org/start/ ) 生成一個 maven + java 的模板專案(這樣方便些)。用開發工具開啟專案(用 IDEA 不錯,他們公司還為開源作者提供免費工具用。是好公司!)。在 pom.xml 裡面新增依賴:
<dependencies>
<dependency>
<groupId>org.noear</groupId>
<artifactId>consul-solon-cloud-plugin</artifactId>
</dependency>
</dependencies>
然後,在應用屬性配置檔案“app.yml”,新增 consul 的連線資訊:
solon.app:
name: "demoapp"
group: "demo"
solon.cloud.consul:
server: "127.0.0.1" #consul 服務地址
config:
load: "demoapp.yml" #載入配置到應用屬性(多個以","隔開)
“...config.load” 會匯入配置到應用屬性。之後可用“@Inject”注入,也可用“Solon.cfg().get(...)”獲取。
3.3、程式碼應用
模板專案裡,在 “App.java” 邊上,新增 "Config.java" 類:
@Configuration
public class Config {
//注入使用者名稱 //來自 config.load 匯入到應用屬性的
@Inject("${demo.user.name}")
String userName;
//注入並轉為資料來源 //直接來自 "demo/demo-ds"
@Bean
public DataSource ds(@CloudConfig("demo-ds") HikariDataSource ds){
return ds;
}
}
直接獲取 consul 配置,可以透過"@CloudConfig"註解,或者 "CloudClient.config().pull(group, name)" 手動獲取。
4、多馬甲專案的應用
很多情況下,公司會有相同的程式碼,但是不同的運營專案。這個場景下,自然是希望程式碼都不用改。可以透過 "solon.app.group" 配置進行切換,不支援名稱空間,只能借用虛擬的組了。
4.1、新增新的配置
在 consul 裡,新增 “demo2/demoapp.yml” 和 "demo2/demo-ds"。然後把剛才的配置複製一份。
4.2、修改專案應用配置
- 透過 app.yml 修改配置
solon.app:
name: "demoapp"
group: "demo2"
solon.cloud.consul:
server: "127.0.0.1" #consul 服務地址
config:
load: "demoapp.yml" #載入配置到應用屬性(多個以","隔開)
- 透過啟動時指定(方式二)
java -Dsolon.app.group=demo2 -jar demoapp.jar
- 透過容器映象的環境變數指定 (方式三)
services:
demoapp:
image: demo/demoapp:1.0.0
container_name: demoapp
environment:
- solon.app.group=demo2
- TZ=Asia/Shanghai
ports:
- 8080:8080
方式二、方式三。什麼都不用改,只需要在部署執行時指定一下,推薦!