1. 程式人生 > >Spring Boot + Spring Cloud 實現許可權管理系統 後端篇(十八):服務註冊和發現(Consul)

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

修改完成之後,重啟服務,在此檢視詳情頁面,終於成功獲取到監控資訊了。 

原始碼下載