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-configpom.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
}

如果我们运行应用程序,字段 valueproperties 具有来自 Consul 的相同 "Hello World" 值。

5.1 更新配置

在不重启 Spring Boot 应用程序的情况下更新配置怎么办?

如果我们回到 Consul 代理站点并用另一个值更新属性 "/config/myApp/my/prop" ,例如 "New Hello World" ,那么字段 value 不会改变并且字段properties 将按预期更新为 "New Hello World"

这是因为字段 propertiesMyProperties 类具有 @RefreshScope 注释。 所有带有 @RefreshScope 注释的 bean 都将在配置更改后刷新。

在现实生活中,我们不应该直接在 Consul 中拥有这些属性,而是应该将它们持久地存储在某个地方。我们可以使用 Config Server 来做到这一点。

6 结论

在本文中,我们了解了如何设置 Spring Boot 应用程序以与 Consul 一起工作以实现服务发现、自定义健康检查规则并共享分布式配置。

我们还为客户端引入了许多方法来调用这些注册的服务。

像往常一样,可以在 GitHub 上 找到源代码。

Spring Cloud Consul 入门指引的更多相关文章

  1. Spring Cloud Consul入门

    1. Consul介绍 Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用.Consul是HashiCorp( Vagrant的创建者)开发的一个服务发现与配置项目,用G ...

  2. Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

  3. Spring Cloud 快速入门

     Spring Cloud快速入门 代码地址: https://gitee.com/gloryxu/spring-cloud-test EureKa:服务注册中心 添加依赖 <dependenc ...

  4. Spring Cloud Gateway入门

    1.什么是Spring Cloud GatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技 ...

  5. Spring Cloud Consul使用——服务注册与发现(注册中心)

    整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...

  6. Spring Cloud Consul

    1.2.0.RELEASE 该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Consul集成.通过几个简单的注释,您可以快速启用和配置应用 ...

  7. Spring Cloud Consul 之Greenwich版本全攻略

    什么是Consul Consul是HashiCorp公司推出的开源软件,使用GO语言编写,提供了分布式系统的服务注册和发现.配置等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全 ...

  8. 服务注册发现、配置中心集一体的 Spring Cloud Consul

    前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...

  9. Spring Cloud Consul Config 知识点

    Spring Cloud Consul Config 是 Config Server 和 Client的替代方案. 搭建一个配置中心,可以选择的方案: Spring Cloud Config 或者 S ...

随机推荐

  1. [HNOI2009]【一本通提高组合数学】有趣的数列

    [HNOI2009]有趣的数列 题目描述 我们称一个长度为 2 n 2n 2n 的数列是有趣的,当且仅当该数列满足以下三个条件: 它是从 1 ∼ 2 n 1 \sim 2n 1∼2n 共 2 n 2n ...

  2. MySQL基本操作笔记

    一.数值类型 1.常量(1)字符串常量 ASCII字符串常量占一个字节 例如:'Hello Word' Unicode字符串常量占两个字节 例如:N'Hello Word' mysql> sel ...

  3. Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg

    numpy.linalg 模块包含线性代数的函数.使用这个模块,可以计算逆矩阵.求特征值.解线性方程组以及求解行列式等.一.计算逆矩阵 线性代数中,矩阵A与其逆矩阵A ^(-1)相乘后会得到一个单位矩 ...

  4. 论文解读(PPNP)《Predict then Propagate: Graph Neural Networks meet Personalized PageRank》

    论文信息 论文标题:Predict then Propagate: Graph Neural Networks meet Personalized PageRank论文作者:Johannes Gast ...

  5. 迅捷Flutter图片浏览软件

    下载地址: https://github.com/patton88/agile_flutter_picture_show/raw/master/agile_flutter_picture_show_v ...

  6. java学习第一天.day06

    方法 方法的优点 1. 使程序变得更简短而清晰. 2. 有利于程序维护. 3. 可以提高程序开发的效率. 4. 提高了代码的重用性. static的作用 static在方法中如果没有添加就只能用对象调 ...

  7. 逻辑判断与if and while循环结构

    逻辑判断与if and while循环结构 逻辑判断 逻辑运算符在进行逻辑判断时遇到打印输出命令时 and 当碰到一个条件为False时那么整个条件即为False,当碰到第一个为True时如果之后的值 ...

  8. 如何免费申请js.org二级域名

    最近看到很多人都去申请了js.org的域名,我就来写个教程吧! (本教程只注重于申请域名,而不是如何使用Github) 看看成品:https://butterfly.js.org/ 官网是这么写的: ...

  9. [HNOI2011]卡农 (数论计数,DP)

    题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...

  10. 【java】学习路径17-用户注册登录实例(Scanner)

    要学会使用接口.继承.多态.构造方法.包等知识编写出一个用户登录注册的事例.