Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
访问 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 工程,作为服务注册到注册中心。
添加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工程,作为服务注册到注册中心。
添加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工程,作为服务注册到注册中心。
添加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
修改完成之后,重启服务,在此查看详情页面,终于成功获取到监控信息了。