• 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.cloudgroupId>
        <artifactId>spring-cloud-starter-consul-allartifactId>
        <version>3.1.1version>
    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 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 将监视任何配置更改,然后触发所有服务的更新。

    首先,我们需要添加spring-cloud-starter-consul-configpom.xml 的依赖:

    <dependence>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-consul-configartifactId>
        <version>3.1.1version>
    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 上 找到源代码。

  • 相关阅读:
    厂商征集 | 2023年中国RPA市场洞察研究报告正式启动
    计算机毕业设计选题推荐-校园失物招领微信小程序/安卓APP-项目实战
    第十六章 品质保证:发布覆盖率测试报告
    SpringBoot-13-mvc配置原理
    【0100】 using recovery command file “recovery.conf“ is not supported
    Docker 最常用的镜像命令和容器命令
    基础MySQL的语法练习
    linux配置IP、子网掩码、网关
    使用.NET设计一个Epub电子书生成工具
    水果店圈子:水果店水果都去哪进货,水果店进货怎么找货源
  • 原文地址:https://www.cnblogs.com/hunterzhang/p/16753508.html