Spring Cloud Consul 入门指引

1 概述

  • 服务发现——自动注册和注销服务实例的网络位置
  • 健康检查——检测服务实例何时启动并运行
  • 分布式配置——确保所有服务实例使用相同的配置

在本文中,我们将了解如何配置 Spring Boot 应用程序以使用这些功能。

2 前提条件


    org.springframework.cloud
    spring-cloud-starter-consul-all
    3.1.1

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

我们已经在 Consul 中注册了我们的应用程序,但是客户端如何找到服务端点?我们需要一个发现客户端服务来从 Consul 获得正在运行且可用的服务。

Spring 为此提供了一个 DiscoveryClient API ,我们可以使用 @EnableDiscoveryClient 注释来启用它:

@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
    // ...

}

然后,我们可以将 DiscoveryClient bean 注入我们的控制器并访问实例:

@RestController
public class DiscoveryClientController {

    @Autowired
    private DiscoveryClient discoveryClient;

    public Optional 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 myCustomCheck() {
    String message = "Testing my healh check function";
    return new ResponseEntity<>(message, HttpStatus.FORBIDDEN);
}

如果我们访问 Consul 代理站点,我们会看到我们的应用程序失败了。要解决此问题, “/my-health-check” 服务应返回 HTTP 200 OK 状态代码。

5 分布式配置

此功能 允许在所有服务之间同步配置。 Consul 将监视任何配置更改,然后触发所有服务的更新。


    org.springframework.cloud
    spring-cloud-starter-consul-config
    3.1.1

我们还需要将 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” 值。

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

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

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

6 结论

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

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

Original: https://www.cnblogs.com/hunterzhang/p/16753508.html
Author: hunterzhang
Title: Spring Cloud Consul 入门指引

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584746/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java基础点

    1.eclipse什么时候编译java类文件 2.在同一包中的类可以相互引用,无需用import语句 4.if else等语句,什么时候可以不加括号 6.++i和i++的区别 7….

    Java 2023年5月29日
    078
  • 【步骤详解】Docker一键部署微服务详细教程

    Docker部署微服务 场景介绍 我们使用Docker完成一个微服务的搭建过程 整体架构如下 使用多个微服务进行项目部署测试 整体服务说明 我们总共涉及到三个微服务以及两个中间件 …

    Java 2023年6月15日
    079
  • 关于请求和响应数据防篡改的解决方案(SM3)

    一、 请求防篡改 【前端】 1、 前端统一拦截所有ajax请求(如:ajaxhook.js、axios.js) 2、 分别对post请求和get请求的正文用SM3进行计算哈希值(r…

    Java 2023年6月7日
    085
  • 简单易懂讲文件

    注意事项 如果运行代码的时候找不到文件,但是文件的的确确又存在,检查下 idea 的工作路径 路径 Path Path 对象是将一个路径封装成一个对象,然后通过这个对象来执行路径的…

    Java 2023年6月8日
    0108
  • 【校招VIP】[Java][一本][6分]按照真实的技能点进行业务描述

    关注【校招VIP】公众号 ,回复【简历 】,添加校招顾问微信,即可获取简历指导! 本份简历是一位21届一本java同学的简历,简历评分6分。 一、学员简历 二、指导意见 简历版式问…

    Java 2023年6月5日
    086
  • Html转换PDF(Java实用版)

    前言: 在工作当中,遇到了需要把HTML页面转化为PDF文档,有很多中实现,如下进行一个对比,大家个借鉴去进行使用 各实现对比表 于Windows平台进行测试: 此博客仅基于ITe…

    Java 2023年6月8日
    0136
  • cookie、session和token的区别

    cookie、session和token的区别 cookie: · 表示用户身份,一小段文本信息 · 服务端生成,发送客户端保存,正在客户端头信息中,可能被用户篡改。 · 相当于钥…

    Java 2023年5月30日
    074
  • mongodb 数据块的迁移流程介绍

    基本概念 1.1 Chunk(数据块) 表示特定服务器上面, 连续范围的分片键值所包含的一组数据,是一个逻辑概念。 例如,某数据块记录如下: { "_id" :…

    Java 2023年6月6日
    085
  • JNI C反射调用java方法

    ④通过对象调用方法,可以调用空参数方法,也可以调用有参数方法,并且将参数通过调用的方法传入(void (CallVoidMethod)(JNIEnv, jobject, jmeth…

    Java 2023年5月29日
    089
  • 打工四年总结的数据库知识点

    国庆在家无聊,我随手翻了一下家里数据库相关的书籍,这一翻我就看上瘾了,因为大学比较熟悉的一些数据库范式我居然都忘了,怀揣着好奇心我就看了一个小国庆。 看的过程中我也做了一些小笔记,…

    Java 2023年6月9日
    0147
  • JVM学习笔记之类加载机制【八】

    一、类加载时机 1.1 触发类初始化的六个场景: 加载? 1、遇到new、getstatic、putstatic或invokestatic这四条字节码指令时 如果类型没有进行过初始…

    Java 2023年6月5日
    083
  • 《软技能——代码之外的生存指南》十步学习法

    1.了解全局 2.确定范围 3.定义目标 4.寻找资源 5.创建学习计划 6.筛选资源 7.开始学习,浅尝辄止 8.动手操作,边玩边学 9.全面掌握,学以致用 10.乐为人师,融会…

    Java 2023年6月7日
    078
  • mybatis 字段类型映射一览表

    Original: https://www.cnblogs.com/tangzeqi/p/13155854.htmlAuthor: instrTitle: mybatis 字段类型…

    Java 2023年6月6日
    074
  • Spring Boot AOP 扫盲,实现接口访问的统一日志记录

    AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 co…

    Java 2023年6月9日
    092
  • 【数据结构】11.java源码关于TreeMap

    目录 1.TreehMap的内部结构2.TreehMap构造函数3.元素新增策略4.元素删除5.元素修改和查找6.特殊操作7.扩容8.总结 1.TreeMap的内部结构 首先确认一…

    Java 2023年6月5日
    073
  • java 递归实现树形结构的两种实现方式

    1.情景展示 树形结构,和我们平常所触及到的无限级菜单,是同一个道理。 所谓树形结构,我们可以将其理解为:树根或者树冠,都可以无限分叉下去。 现有一张表,需要对表中数据进行分级查询…

    Java 2023年5月29日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球