Spring Cloud Consul 入门指引
1 概述
Spring Cloud Consul 项目为 Spring Boot 应用程序提供了与 Consul 的轻松集成。
Consul 是一个工具,它提供组件来解决微服务架构中一些最常见的挑战:
- 服务发现——自动注册和注销服务实例的网络位置
- 健康检查——检测服务实例何时启动并运行
- 分布式配置——确保所有服务实例使用相同的配置
在本文中,我们将了解如何配置 Spring Boot 应用程序以使用这些功能。
2 前提条件
首先,建议快速浏览 Consul 及其所有功能。
在本文中,我们将使用在 localhost:8500 上运行的 Consul 代理。有关如何安装 Consul 和运行代理的更多详细信息,请参阅此 链接。
首先,我们需要添加 [spring-cloud-starter-consul-all](https://search.maven.org/classic/#search|ga|1|a%3A"spring-cloud-starter- consul-all%22) 的 pom.xml 的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
<version>3.1.1</version>
</dependency>
3 服务发现
让我们编写我们的第一个 Spring Boot 应用程序并连接正在运行的 Consul 代理:
@SpringBootApplication
public class ServiceDiscoveryApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ServiceDiscoveryApplication.class)
.web(true).run(args);
}
}
默认情况下,Spring Boot 将尝试连接到 localhost:8500 的 Consul 代理。 要使用其他设置,我们需要更新 application.yml 文件:
spring:
cloud:
consul:
host: localhost
port: 8500
然后,如果我们在浏览器中访问 Consul 代理的站点 http://localhost:8500 ,我们将看到我们的应用程序已在 Consul 中正确注册,标识符来自 "${spring.application.name}: ${用逗号分隔的配置文件}{server.port}".
要自定义此标识符,我们需要使用另一个表达式更新属性 spring.cloud.discovery.instanceId:
spring:
application:
name: myApp
cloud:
consul:
discovery:
instanceId: ${spring.application.name}:${random.value}
如果我们再次运行该应用程序,我们将看到它是使用标识符 "MyApp" 加上一个随机值注册的。我们需要它来在本地机器上运行应用程序的多个实例。
最后,要禁用服务发现,我们需要将属性 spring.cloud.consul.discovery.enabled 设置为 false。
3.1 查找服务
我们已经在 Consul 中注册了我们的应用程序,但是客户端如何找到服务端点?我们需要一个发现客户端服务来从 Consul 获得正在运行且可用的服务。
**Spring 为此提供了一个 DiscoveryClient API **,我们可以使用 @EnableDiscoveryClient 注释来启用它:
@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
// ...
}
然后,我们可以将 DiscoveryClient bean 注入我们的控制器并访问实例:
@RestController
public class DiscoveryClientController {
@Autowired
private DiscoveryClient discoveryClient;
public Optional<URI> serviceUrl() {
return discoveryClient.getInstances("myApp")
.stream()
.findFirst()
.map(si -> si.getUri());
}
}
最后,我们将定义我们的应用程序端点:
@GetMapping("/discoveryClient")
public String discoveryPing() throws RestClientException,
ServiceUnavailableException {
URI service = serviceUrl()
.map(s -> s.resolve("/ping"))
.orElseThrow(ServiceUnavailableException::new);
return restTemplate.getForEntity(service, String.class)
.getBody();
}
@GetMapping("/ping")
public String ping() {
return "pong";
}
"myApp/ping" 路径是带有服务端点的 Spring 应用程序名称。 Consul 将提供所有可用的名为 "myApp". 的应用程序
4 健康检查
Consul 会定期检查服务端点的健康状况。
默认情况下,**Spring 实现健康端点以在应用程序启动时返回 200 OK **。如果我们想自定义端点,我们必须更新 application.yml:
spring:
cloud:
consul:
discovery:
healthCheckPath: /my-health-check
healthCheckInterval: 20s
因此,Consul 将每 20 秒轮询一次 "/my-health-check" 端点。
让我们定义我们的自定义健康检查服务以返回 FORBIDDEN 状态:
@GetMapping("/my-health-check")
public ResponseEntity<String> myCustomCheck() {
String message = "Testing my healh check function";
return new ResponseEntity<>(message, HttpStatus.FORBIDDEN);
}
如果我们访问 Consul 代理站点,我们会看到我们的应用程序失败了。要解决此问题,"/my-health-check" 服务应返回 HTTP 200 OK 状态代码。
5 分布式配置
此功能允许在所有服务之间同步配置。 Consul 将监视任何配置更改,然后触发所有服务的更新。
首先,我们需要添加spring-cloud-starter-consul-config 的 pom.xml 的依赖:
<dependence>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
<version>3.1.1</version>
</dependence>
我们还需要将 Consul 和 Spring 应用程序名称的设置从 application.yml 文件移动到 Spring 首先加载的 bootstrap.yml 文件中。
然后,我们需要启用 Spring Cloud Consul Config:
spring:
application:
name: myApp
cloud:
consul:
host: localhost
port: 8500
config:
enabled: true
Spring Cloud Consul Config 将在 Consul 中的 "/config/myApp" 中查找属性。因此,如果我们有一个名为 "my.prop" 的属性,我们需要在 Consul 代理站点中创建此属性。
我们可以通过转到 "KEY/VALUE" 部分来创建属性,然后在 "Create Key" 表单中输入 "/config/myApp/my/prop" 和 "Hello World" 作为值.最后,单击“创建” 按钮。
请记住,如果我们使用 Spring 配置文件,我们需要将配置文件附加到 Spring 应用程序名称旁边。例如,如果我们使用 dev 配置文件,Consul 中的最终路径将是 "/config/myApp,dev".
现在,让我们看看带有注入属性的控制器是什么样子的:
@RestController
public class DistributedPropertiesController {
@Value("${my.prop}")
String value;
@Autowired
private MyProperties properties;
@GetMapping("/getConfigFromValue")
public String getConfigFromValue() {
return value;
}
@GetMapping("/getConfigFromProperty")
public String getConfigFromProperty() {
return properties.getProp();
}
}
和 MyProperties 类:
@RefreshScope
@Configuration
@ConfigurationProperties("my")
public class MyProperties {
private String prop;
// standard getter, setter
}
如果我们运行应用程序,字段 value 和 properties 具有来自 Consul 的相同 "Hello World" 值。
5.1 更新配置
在不重启 Spring Boot 应用程序的情况下更新配置怎么办?
如果我们回到 Consul 代理站点并用另一个值更新属性 "/config/myApp/my/prop" ,例如 "New Hello World" ,那么字段 value 不会改变并且字段properties 将按预期更新为 "New Hello World"。
这是因为字段 properties 是 MyProperties 类具有 @RefreshScope 注释。 所有带有 @RefreshScope 注释的 bean 都将在配置更改后刷新。
在现实生活中,我们不应该直接在 Consul 中拥有这些属性,而是应该将它们持久地存储在某个地方。我们可以使用 Config Server 来做到这一点。
6 结论
在本文中,我们了解了如何设置 Spring Boot 应用程序以与 Consul 一起工作以实现服务发现、自定义健康检查规则并共享分布式配置。
我们还为客户端引入了许多方法来调用这些注册的服务。
像往常一样,可以在 GitHub 上 找到源代码。
Spring Cloud Consul 入门指引的更多相关文章
- Spring Cloud Consul入门
1. Consul介绍 Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用.Consul是HashiCorp( Vagrant的创建者)开发的一个服务发现与配置项目,用G ...
- Spring Cloud Consul 实现服务注册和发现
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...
- Spring Cloud 快速入门
Spring Cloud快速入门 代码地址: https://gitee.com/gloryxu/spring-cloud-test EureKa:服务注册中心 添加依赖 <dependenc ...
- Spring Cloud Gateway入门
1.什么是Spring Cloud GatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技 ...
- Spring Cloud Consul使用——服务注册与发现(注册中心)
整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...
- Spring Cloud Consul
1.2.0.RELEASE 该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Consul集成.通过几个简单的注释,您可以快速启用和配置应用 ...
- Spring Cloud Consul 之Greenwich版本全攻略
什么是Consul Consul是HashiCorp公司推出的开源软件,使用GO语言编写,提供了分布式系统的服务注册和发现.配置等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全 ...
- 服务注册发现、配置中心集一体的 Spring Cloud Consul
前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...
- Spring Cloud Consul Config 知识点
Spring Cloud Consul Config 是 Config Server 和 Client的替代方案. 搭建一个配置中心,可以选择的方案: Spring Cloud Config 或者 S ...
随机推荐
- 【AcWing】周赛
A.糖果 题目链接 链接 题目描述 给定三个正整数 a,b,c. 请计算 ⌊a+b+c2⌋,即 a,b,c 相加的和除以 2 再下取整的结果. 输入格式 第一行包含整数 T,表示共有 T 组测试数据. ...
- 【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)
文章有点长,耐心看完应该可以懂实际原理到底是啥子. 这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期. 当然,这个其实也算是NoSQL ...
- 第九天python3 闭包、nonlocal、默认值的作用域
闭包 自由变量:未在本地作用域中定义的变量,例如定义在内存函数外的外层函数的作用域中的变量: 闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包: 示例1: # -*- c ...
- js实现全屏弹框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Docker 容器虚拟化
Docker 容器虚拟化 1.虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络栈信息.不管是虚拟机 ...
- 高效能团队的Java研发规范(进阶版)
目前大部分团队是使用的阿里巴巴Java开发规范,不过在日常开发中难免遇到覆盖不到的场景,本文在阿里巴巴Java开发规范基础上,补充一些常用的规范,用于提升代码质量及增强代码可读性. 编程规约 1.基础 ...
- Digester解析xml原理
Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象. digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,事件驱动主要是在解析 ...
- Java Script的认识
JavaScript的诞生 1.Java Script诞生于1995年.由Netscape(网景公司)的程序员Brendan Eich(布兰登)与Sun公司联手开发一门脚本语言, 最初名字叫做Mo ...
- Excel 运算符(二):比较运算符
比较运算符用于对两个数据进行比较运算,其结果为 TRUE(真)或 FALSE(假). 运算符 含义 实例 结果 = 等于 =2=3 FALSE < 小于 =5<2 FALSE > 大 ...
- 使用MindSpore计算旋转矩阵
技术背景 坐标变换.旋转矩阵,是在线性空间常用的操作,在分子动力学模拟领域有非常广泛的应用.比如在一个体系中切换坐标,或者对整体分子进行旋转平移等.如果直接使用Numpy,是很容易可以实现的,只要把相 ...