乐趣区

关于后端:Spring-Cloud-Consul-入门指引

1 概述

Spring Cloud Consul 我的项目为 Spring Boot 应用程序提供了与 Consul 的轻松集成。

Consul 是一个工具,它提供组件来解决微服务架构中一些最常见的挑战:

  • 服务发现——主动注册和登记服务实例的网络地位
  • 健康检查——检测服务实例何时启动并运行
  • 分布式配置——确保所有服务实例应用雷同的配置

在本文中,咱们将理解如何配置 Spring Boot 应用程序以应用这些性能。

2 前提条件

首先,倡议疾速浏览 Consul 及其所有性能。

在本文中,咱们将应用在 localhost:8500 上运行的 Consul 代理。无关如何装置 Consul 和运行代理的更多详细信息,请参阅此 链接。

首先,咱们须要增加 spring-cloud-starter-consul-all 的 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
}

如果咱们运行应用程序,字段 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 上 找到源代码。

退出移动版