spring boot config 集成rabbitmq實現總線bus實時刷新配置
git地址:
https://github.com/a18792721831/studySpringCloud.git
1. rabbitmq安裝
1.1 選擇docker 鏡像
因爲使用docker 進行啓動rabbitmq,那麼一個合適的鏡像是我們的基礎,如果選擇的鏡像不合適,那麼就相當於大樓的地基錯誤。
看到這個是不是很興奮,so easy!
但是千萬不要用這個鏡像,我們繼續往下翻。
發現如果要使用rabbitmq的管理界面,那麼需要使用集成了插件的鏡像,而不是latest的鏡像。
這個就比較坑,否則無法訪問界面。
1.2 k8s 命名空間創建
rabbitmq-namespace.yaml
apiVersion : v1
kind : Namespace
metadata :
name : rabbitmq
labels :
app : rabbitmq
執行kubectl apply -f rabbitmq-namespace.yaml
驗證
1.3 k8s 服務創建
創建k8s服務主要是統一對外開放,但是本次只是各個獨立的rabbitmq,未統一化集羣部署。
所以這部可有可無。
但是統一了服務,後續對rabbitmq集羣化後,使用到rabbitmq的地方是不需要做任何修改的。
開放端口,需要開放兩個端口(其餘的我未開放)
5762:消費者,生產者的端口
15762:管理界面的端口。
注意,這裏說的是rabbitmq默認的端口,也就是容器內的端口(可以自定義配置)
因爲我們主要是學習,測試的rabbitmq,所以未做目錄的掛載,意味着,當容器或者說pod重新啓動或者調度後,rabbitmq所有的信息將會丟失(主要就是裏面的路由和消息)
rabbitmq-service.yaml
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-service-node
namespace: rabbitmq
labels:
name: rabbitmq-service
spec:
selector:
rabbitmq: template
type: NodePort
ports:
- name: rabbitmq-service-15672
protocol: TCP
port: 15672
targetPort: 15672
nodePort: 31672
- name: rabbitmq-service-5672
protocol: TCP
port: 5672
targetPort: 5672
nodePort: 30672
端口映射關係:
容器內 | node | 對外 |
---|---|---|
5672 | 5672 | 30672 |
15672 | 15672 | 31672 |
1.4 k8s daemonset 的 deployment
因爲k8s集羣只有兩個節點(窮),所以採集deamonset就行,保證node節點必須有一個。
rabbitmq-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rabbitmq-deployment-daemonset
namespace: rabbitmq
labels:
rabbitmq: deployment-daemonset
spec:
#replicas: 2
selector:
matchLabels:
rabbitmq: template
#strategy:
updateStrategy:
rollingUpdate:
#maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
rabbitmq: template
spec:
#hostNetwork: true
containers:
- name: rabbitmq-pod
image: rabbitmq:3-management
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 5672
initialDelaySeconds: 180
timeoutSeconds: 30
periodSeconds: 600
resources:
limits:
cpu: 4000m
memory: 4096Mi
requests:
cpu: 1000m
memory: 2048Mi
ports:
- name: rabbitmq-15672
containerPort: 15672
hostPort: 15672
protocol: TCP
- name: rabbitmq-5672
containerPort: 5672
hostPort: 5672
protocol: TCP
執行kubectl apply -f rabbitmq-daemonset.yaml
等待k8s調度,然後在節點上pull鏡像。
可能需要鏡像加速。
pull完後,就會啓動。
1.5 驗證
這個名字就是啓動的pod的名字
2. spring boot config bus server 集成
2.1 創建項目
2.2 配置
application.yml
server:
port: 8011
logging:
level:
org:
springframework:
web:
servlet:
mvc:
method:
annotation:
RequestMappingHandlerMapping: trace
spring:
freemarker:
template-loader-path: classpath:/templates/
prefer-file-system-access: false
application:
name: config-eureka-server
# profiles:
# active: native
# cloud:
# config:
# server:
# native:
# search-locations: classpath:/portconfig/
profiles:
active: git
cloud:
config:
server:
git:
uri: https://github.com/a18792721831/studySpringCloud # 倉庫跟地址
search-paths: springbootconfigserver/src/main/resources/portconfig # 以studySpringCloud爲根路徑進行搜索的文件夾地址
username: a18792721831 # 用戶名
password: # 公有倉庫可以不寫密碼
timeout: 60
label: master # 指定分支
rabbitmq:
host: 10.0.228.93
port: 30672
username: guest
password: guest
eureka:
client:
# register-with-eureka: false
# fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
management:
security:
enabled: false
endpoints:
web:
exposure:
include: '*'
這裏有個坑:
management.endpoints.web.exposure.include必須配置,可以配置其他字符。
management.security.enabled=false表示rabbitmq訪問時,不進行安全驗證。
2.3 註解
2.4 遠程配置
遠程配置需要註釋掉port配置,因爲我們需要多實例啓動。
2.5 啓動
2.6 驗證實時刷新
當springbootconfigbusserver啓動後,使用postMan發送請求;
這裏有個坑,好多書本上資料上寫的是http://[ip]:[port]/bus/refresh
且是發送給client。
可能是舊版本支持吧。
或者舊版本資料上說請求http://[ip]:[port]/bus-refresh
新版本請求是http://[ip]:[port]/actuator/bus-refresh
日誌如下
這是遠程沒有修改時刷新的日誌。
接下來我們遠程修改後,在次刷新。
刷新
有了,更新了一個文件。
2. spring boot config bus client 集成
2.1 創建項目
2.2 配置
這個配置文件是springbootconfigeurekaclient中拷貝即可。
management.security.enabled=false表示rabbitmq訪問時,不進行安全驗證。
2.4 啓動
2.5 修改遠程配置
2.6 post 刷新觸發
config client從config server得到了配置。
而且實現了實時刷新,未重啓服務,但是配置信息已經發生修改。