Spring Cloud Hoxton.SR4 Spring Boot 2.3.0.RELEASE
GitHub:shpunishment/spring-cloud-learning/spring-cloud-consul-test
1. 简介
Spring Cloud Consul 为 SpringBoot 应用提供了 Consul 的支持,Consul既可以作为注册中心使用,也可以作为配置中心使用。
2. 安装
官网下载 Consul,这里使用Windows版测试。
运行,访问http://localhost:8500。默认服务侦听地址只有127.0.0.1可访问,可添加参数-client 0.0.0.0
。
consul agent -dev -node consul-1
3. 使用
先用IDEA创建一个Spring Boot的项目,可以随意引用一个Spring Cloud的组件,之后也会删掉。
创建完,删掉除了pom.xml以外的其他文件,再修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<groupId>com.shpun</groupId>
<artifactId>spring-cloud-consul-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-consul-test</name>
<description>spring cloud consul test</description>
<!--修改打包方式为pom-->
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<modules>
<!--后续添加子模块用-->
</modules>
<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>
</project>
3.1 注册中心
3.1.1 user-service
创建子模块user-service
修改pom继承
<parent>
<groupId>com.shpun</groupId>
<artifactId>spring-cloud-consul-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
再添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
修改application.yml
server:
port: 8101
spring:
application:
name: user-service
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:4306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root
cloud:
consul:
# 将服务注册到consul
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
# 指定主机名,防止主机名出现不规范字符
hostname: localhost
mybatis:
typeAliasesPackage: com.shpun.model
mapper-locations: classpath:mapper/**.xml
Model,Mapper,Service等省略。
UserController 完成对User的CURD接口。
@RequestMapping("/api/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/add")
public ResultVo<?> add(@RequestBody User user) {
userService.insertSelective(user);
return ResultVo.ok();
}
@GetMapping("/delete/{userId}")
public ResultVo<?> delete(@PathVariable("userId") Integer userId) {
userService.deleteByPrimaryKey(userId);
return ResultVo.ok();
}
@PostMapping("/update")
public ResultVo<?> update(@RequestBody User user) {
userService.updateByPrimaryKeySelective(user);
return ResultVo.ok();
}
@GetMapping("/{userId}")
public ResultVo<User> get(@PathVariable("userId") Integer userId) {
User user = userService.selectByPrimaryKey(userId);
return ResultVo.okData(user);
}
}
在启动类上添加@EnableDiscoveryClient
注解表明是一个服务发现的客户端。
3.1.2 ribbon-service
创建子模块ribbon-service,调用user-service模块演示负载均衡的服务。
修改pom继承
<parent>
<groupId>com.shpun</groupId>
<artifactId>spring-cloud-consul-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
再添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
修改application.yml
server:
port: 8200
spring:
application:
name: ribbon-service
cloud:
consul:
# 将服务注册到consul
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
# 指定主机名,防止主机名出现不规范字符
hostname: localhost
service-url:
user-service: http://user-service
# 全局配置
ribbon:
# 服务请求连接超时时间(毫秒)
ConnectTimeout: 1000
# 服务请求处理超时时间(毫秒)
ReadTimeout: 3000
# 对超时请求启用重试机制
OkToRetryOnAllOperations: true
# 切换重试实例的最大个数
MaxAutoRetriesNextServer: 1
# 切换实例后重试最大次数
MaxAutoRetries: 1
# 修改负载均衡算法
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 指定应用进行配置
user-service:
ribbon:
ConnectTimeout: 1000
ReadTimeout: 3000
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 1
MaxAutoRetries: 1
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
@LoadBalanced
赋予RestTemplate负载均衡的能力
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Model等省略。
UserRibbonController 使用RestTemplate调用user-service调用相关接口。
@RequestMapping("/api/user")
@RestController
public class UserRibbonController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.user-service}")
private String userServiceUrl;
@PostMapping("/add")
public ResultVo<?> add(@RequestBody User user) {
return restTemplate.postForObject(userServiceUrl + "/api/user/add", user, ResultVo.class);
}
@GetMapping("/delete/{userId}")
public ResultVo<?> delete(@PathVariable("userId") Integer userId) {
return restTemplate.getForObject(userServiceUrl + "/api/user/delete/{0}", ResultVo.class, userId);
}
@PostMapping("/update")
public ResultVo<?> update(@RequestBody User user) {
return restTemplate.postForObject(userServiceUrl + "/api/user/update", user, ResultVo.class);
}
@GetMapping("/{userId}")
public ResultVo<?> get(@PathVariable("userId") Integer userId) {
return restTemplate.getForObject(userServiceUrl + "/api/user/{0}", ResultVo.class, userId);
}
}
在启动类上添加@EnableDiscoveryClient
注解表明是一个服务发现的客户端。
测试
启动两个user-service,一个ribbon-service。
在Consul完成注册,也实现负载均衡。
3.2 配置中心
创建子模块 config-client
修改pom继承
<parent>
<groupId>com.shpun</groupId>
<artifactId>spring-cloud-consul-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
再添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改application.yml
spring:
profiles:
active: dev
添加bootstrap.yml
server:
port: 8400
spring:
application:
name: config-client
cloud:
consul:
# # 将服务注册到consul
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
# 指定主机名,防止主机名出现不规范字符
hostname: localhost
config:
# 启用配置中心功能
enabled: true
# 配置值的格式
format: yaml
# 配置所在目录
prefix: config
# 配置的分隔符
profile-separator: ':'
# 配置key的名字,由于Consul是K/V存储,配置存储在对应K的V中
data-key: user-service
ConfigClientController
// 用于刷新配置
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${user-service.info}")
private String info;
@GetMapping("/info")
public String getInfo() {
return info;
}
}
在启动类上添加@EnableDiscoveryClient
注解表明是一个服务发现的客户端。
在Consul中添加配置
存储的key为:
config/config-client:dev/user-service
测试
修改配置后,自动刷新
参考:
Spring Cloud Consul 官方文档
Spring Cloud入门-Consul服务注册发现与配置中心(Hoxton版本)