Spring Boot + Spring Cloud 實現許可權管理系統 後端篇(十八):服務註冊和發現(Consul)
什麼是 Consul
Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 儲存、多資料中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。使用起來也較為簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支援Linux、windows和Mac OS X);安裝包僅包含一個可執行檔案,方便部署,與 Docker 等輕量級容器可無縫配合。
Consul 安裝
訪問 Consul 官網 ,根據作業系統型別,選擇下載 Consul 的最新版本。我這裡選擇windows版本。
下載下來是一個zip壓縮包,解壓之後,是一個exe可執行檔案。
開啟CMD終端,進入consul.exe所在目錄,執行如下命令啟動Consul服務。
cd C:\consul_1.3.0_windows_amd64 # 進入consul.exe所在目錄 consul agent -dev # 啟動服務, -dev 表示開發模式執行,另外還有 -server 表示服務模式執行
啟動過程資訊如下圖所示。
啟動成功之後,訪問 http://localhost:8500 , 可以檢視 Consul 管理介面。
kitty-monitor改造
改造 kitty-monitor 工程,作為服務註冊到註冊中心。
新增依賴
新增Spring Cloud依賴檔案,Consul註冊中心依賴。
pom.xml
<!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
<!--srping cloud--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置檔案
修改配置檔案,新增服務註冊配置。
application.yml
server: port: 8000 spring: application: name: kitty-monitor cloud: consul: host: localhost port: 8500 discovery: serviceName: ${spring.application.name} # 註冊到consul的服務名稱
啟動類
修改啟動類,新增 @EnableDiscoveryClient 註解,開啟服務發現支援。
KittyMonitorApplication.java
package com.louis.kitty.monitor; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import de.codecentric.boot.admin.server.config.EnableAdminServer; /** * 啟動器 * @author Louis * @date Oct 29, 2018 */ @EnableAdminServer @EnableDiscoveryClient @SpringBootApplication public class KittyMonitorApplication { public static void main(String[] args) { SpringApplication.run(KittyMonitorApplication.class, args); } }
測試效果
kitty-backup改造
改造 kitty-backup工程,作為服務註冊到註冊中心。
新增依賴
新增Spring Cloud依賴檔案,Consul註冊中心依賴。
pom.xml
<!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
<!--srping cloud--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置檔案
修改配置檔案,新增服務註冊配置,健康檢查介面開放配置。
application.yml
# tomcat server: port: 8002 # spring boot admin spring: application: name: kitty-backup boot: admin: client: url: "http://localhost:8000" cloud: consul: host: localhost port: 8500 discovery: serviceName: ${spring.application.name} # 註冊到consul的服務名稱 # 開放健康檢查介面 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS # backup datasource kitty: backup: datasource: host: localhost userName: root password: 123456 database: kitty
啟動類
修改啟動類,新增 @EnableDiscoveryClient 註解,開啟服務發現支援。
KittyBackupApplication.java
package com.louis.kitty.backup; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 啟動器 * @author Louis * @date Oct 29, 2018 */ @EnableDiscoveryClient @SpringBootApplication(scanBasePackages={"com.louis.kitty"}) public class KittyBackupApplication { public static void main(String[] args) { SpringApplication.run(KittyBackupApplication.class, args); } }
測試效果
點選服務,進入詳情頁面,可以看到服務相關的各種指標資訊,比如程序、執行緒、記憶體使用、垃圾回收等等。
kitty-admin改造
同理,改造 kitty-admin工程,作為服務註冊到註冊中心。
新增依賴
新增Spring Cloud依賴檔案,Consul註冊中心依賴。
pom.xml
<!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
<!--srping cloud--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置檔案
修改配置檔案,新增服務註冊配置,健康檢查介面開放配置。
application.yml
server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 port: 8001 #context-path: /kitty-admin # DataSource spring: datasource: name: druidDataSource type: com.alibaba.druid.pool.DruidDataSource druid: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/kitty?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8 username: root password: 123456 filters: stat,wall,log4j,config max-active: 100 initial-size: 1 max-wait: 60000 min-idle: 1 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: select 'x' test-while-idle: true test-on-borrow: false test-on-return: false pool-prepared-statements: true max-open-prepared-statements: 50 max-pool-prepared-statement-per-connection-size: 20 # spring boot admin application: name: kitty-admin cloud: consul: host: localhost port: 8500 discovery: serviceName: ${spring.application.name} # 註冊到consul的服務名稱 boot: admin: client: url: "http://localhost:8000" # 開放健康檢查介面 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS # pagehelper pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
啟動類
修改啟動類,新增 @EnableDiscoveryClient 註解,開啟服務發現支援。
KittyAdminApplication.java
package com.louis.kitty.admin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 啟動器 * @author Louis * @date Oct 29, 2018 */ @EnableDiscoveryClient @SpringBootApplication(scanBasePackages={"com.louis.kitty"}) public class KittyAdminApplication { public static void main(String[] args) { SpringApplication.run(KittyAdminApplication.class, args); } }
測試效果
但是點選進入詳情頁,發現並沒有展示上面備份服務一樣的資訊,而是顯示“invalid token”資訊。
那是監控伺服器到客戶端獲取健康資訊失敗了,因為獲取資訊的介面被我們的Shiro給攔截了。
修改Shiro配置,使監控資訊獲取介面無需進行登入認證,新增如下圖所示內容。
ShiroConfig.java
修改完成之後,重啟服務,在此檢視詳情頁面,終於成功獲取到監控資訊了。