欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

【译文】服务注册中心-consul
(last modified Jun 26, 2023, 12:31 PM )
by
侧边栏壁纸
  • 累计撰写 176 篇文章
  • 累计创建 61 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

【译文】服务注册中心-consul

橙序员
2022-12-31 / 0 评论 / 0 点赞 / 465 阅读 / 6,501 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习语,为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释,您可以快速启用和配置应用程序中的通用模式,并使用基于 Consul 的组件构建大型分布式系统。提供的模式包括服务发现、控制总线和配置。通

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习语,为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释,您可以快速启用和配置应用程序中的通用模式,并使用基于 Consul 的组件构建大型分布式系统。提供的模式包括服务发现、控制总线和配置。通过与其他 Spring Cloud 项目集成提供智能路由和客户端负载平衡、断路器。

1. 快速入门

本快速入门介绍了如何使用 Spring Cloud Consul 进行服务发现和分布式配置。

首先,在你的机器上运行 Consul Agent。然后您可以访问它并将其用作 Spring Cloud Consul 的服务注册表和配置源。

1.1. 使用consul发现客户端

要在应用程序中使用这些功能,您可以将其构建为依赖于spring-cloud-consul-core. 添加依赖项最方便的方法是使用 Spring Boot starter org.springframework.cloud:spring-cloud-starter-consul-discovery:。我们建议使用依赖管理和spring-boot-starter-parent. 以下示例显示了典型的 Maven 配置:

pom.xml

<project>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>{spring-boot-version}</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

以下示例显示了典型的 Gradle 设置:

build.gradle

plugins {
  id 'org.springframework.boot' version ${spring-boot-version}
  id 'io.spring.dependency-management' version ${spring-dependency-management-version}
  id 'java'
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}

现在您可以创建一个标准的 Spring Boot 应用程序,例如以下 HTTP 服务器:

@SpringBootApplication 
@RestController 
public class Application { 

    @GetMapping("/") 
    public String home() { 
        return "Hello World!"; 
    } 

    public static void main(String[] args) { 
        SpringApplication.run(Application.class, args); 
    } 

}

当此 HTTP 服务器运行时,它会连接到在默认本地 8500 端口上运行的 Consul Agent。要修改启动行为,您可以使用 更改 Consul Agent 的位置application.properties,如以下示例所示:

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

您现在可以使用DiscoveryClient@LoadBalanced RestTemplate@LoadBalanced WebClient.Builder从 Consul 检索服务和实例数据,如以下示例所示:

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri().toString();
    }
    return null;
}

1.2. 使用分布式配置

要在应用程序中使用这些功能,您可以将其构建为依赖于spring-cloud-consul-core和的 Spring Boot 应用程序spring-cloud-consul-config。添加依赖项最方便的方法是使用 Spring Boot starter org.springframework.cloud:spring-cloud-starter-consul-config:。我们建议使用依赖管理和spring-boot-starter-parent. 以下示例显示了典型的 Maven 配置:

pom.xml

<project>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>{spring-boot-version}</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-consul-config</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

以下示例显示了典型的 Gradle 设置:

build.gradle

plugins {
  id 'org.springframework.boot' version ${spring-boot-version}
  id 'io.spring.dependency-management' version ${spring-dependency-management-version}
  id 'java'
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.cloud:spring-cloud-starter-consul-config'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}

现在您可以创建一个标准的 Spring Boot 应用程序,例如以下 HTTP 服务器:

@SpringBootApplication 
@RestController 
public class Application { 

    @GetMapping("/") 
    public String home() { 
        return "Hello World!"; 
    } 

    public static void main(String[] args) { 
        SpringApplication.run(Application.class, args); 
    } 

}

应用程序从 Consul 检索配置数据。

如果您使用 Spring Cloud Consul Config,则需要设置该spring.config.import属性才能绑定到 Consul。您可以在Spring Boot 配置数据导入部分阅读更多相关信息。

2. 安装Consul

有关如何安装 Consul 的说明,请参阅安装文档。

3. Consul代理

Consul Agent 客户端必须对所有 Spring Cloud Consul 应用程序可用。默认情况下,代理客户端应位于localhost:8500. 有关如何启动代理客户端以及如何连接到 Consul 代理服务器集群的详细信息,请参阅代理文档。对于开发,在你安装了 consul 之后,你可以使用以下命令启动一个 Consul Agent:

./src/main/bash/local_run_consul.sh

这将在端口 8500 上以服务器模式启动代理,用户界面位于localhost:8500

4. 使用 Consul 进行服务发现

服务发现是基于微服务的架构的关键原则之一。尝试手动配置每个客户端或某种形式的约定可能非常困难,而且可能非常脆弱。Consul 通过HTTP APIDNS提供服务发现服务。Spring Cloud Consul 利用 HTTP API 进行服务注册和发现。这不会阻止非 Spring Cloud 应用程序利用 DNS 接口。Consul Agents 服务器运行在一个集群中,该集群通过八卦协议进行通信并使用Raft 共识协议

4.1. 如何激活

要激活 Consul Service Discovery,请使用带有 grouporg.springframework.cloud和 artifact id的 starter spring-cloud-starter-consul-discovery。有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅Spring Cloud 项目页面。

4.2. 注册Consul

当客户端向 Consul 注册时,它会提供有关自身的元数据,例如主机和端口、ID、名称和标签。默认情况下会创建一个HTTP 检查,Consul/actuator/health每 10 秒访问一次端点。如果健康检查失败,服务实例将被标记为关键。

示例Consul客户端:

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

(即完全正常的 Spring Boot 应用程序)。如果 Consul 客户端位于 以外的其他位置localhost:8500,则需要配置来定位客户端。例子:

application.yml

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

如果你使用Spring Cloud Consul Config,并且你设置了spring.cloud.bootstrap.enabled=trueorspring.config.use-legacy-processing=true或 use spring-cloud-starter-bootstrap,那么上面的值将需要放在bootstrap.yml而不是application.yml.
默认服务名称、实例 ID 和端口取自Environment${spring.application.name}、 Spring Context ID 和${server.port}

要禁用 Consul Discovery Client,您可以设置spring.cloud.consul.discovery.enabledfalse. spring.cloud.discovery.enabled当设置为时,Consul Discovery Client 也将被禁用false

要禁用服务注册,您可以设置spring.cloud.consul.discovery.registerfalse

4.2.1. 将管理服务作为单独的服务注册

当管理服务器端口设置为与应用程序端口不同的端口时,通过设置management.server.port属性,管理服务将被注册为与应用程序服务不同的单独服务。例如:

application.yml

spring:
  application:
    name: myApp
management:
  server:
    port: 4452

以上配置将注册以下 2 个服务:

  • 申请服务:
ID: myApp
Name: myApp
  • 管理服务:
ID: myApp-management
Name: myApp-management

管理服务将继承它instanceIdserviceName来自应用程序的服务。例如:

application.yml

spring:
  application:
    name: myApp
management:
  server:
    port: 4452
spring:
  cloud:
    consul:
      discovery:
        instance-id: custom-service-id
        serviceName: myprefix-${spring.application.name}

以上配置将注册以下 2 个服务:

  • 申请服务:
ID: custom-service-id
Name: myprefix-myApp
  • 管理服务:
ID: custom-service-id-management
Name: myprefix-myApp-management

可以通过以下属性进一步定制:

/** 注册管理服务的端口(默认为管理端口)*/ 
spring.cloud.consul.discovery.management-port 

/** 注册管理服务时使用的后缀(默认为“management” */ 
spring.cloud.consul.discovery.management-suffix 

/** 注册管理服务时使用的标签(默认为“management” */ 
spring.cloud.consul.discovery.management-tags

4.2.2. HTTP 健康检查

Consul 实例的健康检查默认为“/actuator/health”,这是 Spring Boot Actuator 应用程序中健康端点的默认位置。如果您使用非默认上下文路径或 servlet 路径(例如server.servletPath=/foo)或管理端点路径(例如management.server.servlet.context-path=/admin),您需要更改此设置,即使对于 Actuator 应用程序也是如此。

还可以配置 Consul 用于检查健康端点的时间间隔。“10s”和“1m”分别代表10秒和1分钟。

此示例说明了上述内容(有关更多选项,请参阅附录页面spring.cloud.consul.discovery.health-check-*中的属性)。

application.yml

spring:
  cloud:
    consul:
      discovery:
        healthCheckPath: ${management.server.servlet.context-path}/actuator/health
        healthCheckInterval: 15s	

您可以通过设置完全禁用 HTTP 健康检查spring.cloud.consul.discovery.register-health-check=false

http请求头应用

标头可以应用于健康检查请求。例如,如果您尝试注册一个使用Vault Backend的Spring Cloud Config服务器:

application.yml

spring:
  cloud:
    consul:
      discovery:
        health-check-headers:
          X-Config-Token: 6442e58b-d1ea-182e-cfa5-cf9cddef0722

根据 HTTP 标准,每个标头可以有多个值,在这种情况下,可以提供一个数组:

application.yml

spring: 
  cloud: 
    consul: 
      discovery: 
        health-check-headers: 
          X-Config-Token: 
            - “6442e58b-d1ea-182e-cfa5-cf9cddef0722” 
            - “其他一些值”

4.2.3. TTL 健康检查

可以使用Consul TTL Check代替默认配置的 HTTP 检查。主要区别在于应用程序向 Consul 代理发送心跳信号,而不是 Consul 代理向应用程序发送请求。

应用程序用来发送 ping 的时间间隔也可以配置。“10s”和“1m”分别代表10秒和1分钟。默认值为 30 秒。

此示例说明了上述内容(有关更多选项,请参阅附录页面spring.cloud.consul.discovery.heartbeat.*中的属性)。

application.yml

spring:
  cloud:
    consul:
      discovery:
        health-check-headers:
          X-Config-Token: 6442e58b-d1ea-182e-cfa5-cf9cddef0722
TTL申请状态

对于 Spring Boot Actuator 应用程序,状态由其可用的运行状况端点确定。当健康端点不可用时(禁用或不是 Spring Boot Actuator 应用程序),它假定应用程序运行状况良好。

查询健康端点时,默认使用根健康组。可以通过设置以下属性来使用不同的健康组:

application.yml

spring: 
  cloud: 
    consul: 
      discovery: 
        heartbeat: 
          actuator-health-group: <your-custom-group-goes-here>

您可以通过设置以下属性来完全禁用健康端点:

application.yml

spring:
  cloud:
    consul:
      discovery:
        heartbeat:
          use-actuator-health: false
自定义 TTL 应用程序状态

如果想配置自己的应用状态机制,只需要实现ApplicationStatusProvider接口即可

MyCustomApplicationStatusProvider.java

@Bean
public class MyCustomApplicationStatusProvider implements ApplicationStatusProvider {
    public CheckStatus currentStatus() {
        return yourMethodToDetermineAppStatusGoesHere();
    }
}

并使其可用于应用程序上下文:

@Bean 
public CustomApplicationStatusProvider customAppStatusProvider() {
     返回新的 MyCustomApplicationStatusProvider(); 
}

4.2.4. 执行器健康指标

如果服务实例是 Spring Boot Actuator 应用程序,则可能会提供以下 Actuator 健康指标。

DiscoveryClientHealthIndicator

当 Consul Service Discovery 处于活动状态时,将配置DiscoverClientHealthIndicator并使其可用于 Actuator 健康端点。有关配置选项,请参见此处

Consul健康指标

配置了一个指示器来验证ConsulClient.

默认情况下,它会检索 Consul 领导节点状态和所有已注册的服务。在具有许多已注册服务的部署中,在每次运行状况检查时检索所有服务的成本可能很高。跳过服务检索,只检查领导节点状态集spring.cloud.consul.health-indicator.include-services-query=false

禁用指标集management.health.consul.enabled=false

当应用程序以引导上下文模式(默认)运行时,此指示器将加载到引导上下文中,并且不可用于执行器运行状况端点。

4.2.5. 元数据

Consul 支持服务元数据。Spring CloudServiceInstance有一个Map<String, String> metadata由服务字段填充的meta字段。填充meta字段spring.cloud.consul.discovery.metadataspring.cloud.consul.discovery.management-metadata属性的设置值。

application.yml

spring:
  cloud:
    consul:
      discovery:
        metadata:
          myfield: myvalue
          anotherfield: anothervalue

上面的配置将导致服务的元字段包含myfield→myvalueanotherfield→anothervalue

生成的元数据

Consul Auto Registration 会自动生成一些条目。

key Value
group 属性spring.cloud.consul.discovery.instance-group。此值仅在instance-group不为空时生成。
secure 如果属性spring.cloud.consul.discovery.scheme等于“https”,则为真,否则为假。
属性spring.cloud.consul.discovery.default-zone-metadata-name,默认为“区域” 物业spring.cloud.consul.discovery.instance-zone。此值仅在instance-zone不为空时生成。

旧版本的 Spring Cloud ConsulServiceInstance.getMetadata()通过解析spring.cloud.consul.discovery.tags属性填充了 Spring Cloud Commons 中的方法。这不再受支持,请迁移到使用spring.cloud.consul.discovery.metadata地图。

4.2.6. 唯一 Consul 实例 ID 生成

默认情况下,consul 实例使用与其 Spring Application Context ID 相同的 ID 注册。默认情况下,Spring 应用程序上下文 ID 是${spring.application.name}:comma,separated,profiles:${server.port}. 在大多数情况下,这将允许一个服务的多个实例在一台机器上运行。如果需要进一步的唯一性,使用 Spring Cloud,您可以通过在spring.cloud.consul.discovery.instanceId. 例如:

application.yml

spring:
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

有了这个元数据,并在本地主机上部署了多个服务实例,随机值就会在那里发挥作用,使实例独一无二。在 Cloudfoundry 中,vcap.application.instance_id将在 Spring Boot 应用程序中自动填充,因此不需要随机值。

4.3. 查找服务

4.3.1. 使用负载均衡器

Spring Cloud 支持Feign(一个 REST 客户端构建器),也支持SpringRestTemplate 使用逻辑服务名称/id 而不是物理 URL 来查找服务。Feign 和发现感知的 RestTemplate 都使用Spring Cloud LoadBalancer进行客户端负载平衡。

如果您想使用 RestTemplate 访问服务 STORES,只需声明:

@LoadBalanced 
@Bean 
public RestTemplate loadbalancedRestTemplate() {
     返回新的 RestTemplate(); 
}

并像这样使用它(注意我们如何使用来自 Consul 的 STORES 服务名称/ID 而不是完全限定的域名):

@Autowired
RestTemplate restTemplate;

public String getFirstProduct() {
   return this.restTemplate.getForObject("https://STORES/products/1", String.class);
}

如果您在多个数据中心拥有 Consul 集群,并且您想要访问另一个数据中心的服务,仅靠服务名称/ID 是不够的。在这种情况下,您使用属性spring.cloud.consul.discovery.datacenters.STORES=dc-westwhereSTORES是服务名称/id,dc-west是 STORES 服务所在的数据中心。

Spring Cloud 现在还提供对 Spring Cloud LoadBalancer的支持。

4.3.2. 使用发现客户端

您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient它为不特定于 Netflix 的发现客户端提供简单的 API,例如

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri();
    }
    return null;
}

4.4. Consul catalog watch

Consul Catalog Watch 利用了 consul监视服务的能力。Catalog Watch 进行阻塞式 Consul HTTP API 调用以确定是否有任何服务已更改。如果有新的服务数据,则发布心跳事件。

更改调用 Config Watch 时的频率 change spring.cloud.consul.config.discovery.catalog-services-watch-delay。默认值为 1000,以毫秒为单位。延迟是上一次调用结束和下一次调用开始之间的时间量。

禁用 Catalog Watch 集spring.cloud.consul.discovery.catalogServicesWatch.enabled=false

监控使用 SpringTaskScheduler来安排对 consul 的调用。默认情况下,ThreadPoolTaskSchedulerpoolSize为 1。要更改TaskScheduler,请创建一个以常量ConsulDiscoveryClientConfiguration.CATALOG_WATCH_TASK_SCHEDULER_NAME命名的TaskScheduler类型的 bean。

5. Consul分布式配置

Consul 提供了一个Key/Value Store用于存储配置和其他元数据。Spring Cloud Consul Config 是Config Server 和 Client的替代品。配置在特殊的“引导”阶段加载到 Spring 环境中。/config默认情况下,配置存储在该文件夹中。PropertySource根据应用程序的名称和模拟 Spring Cloud Config 解析属性顺序的活动配置文件创建多个实例。例如,名称为“testApp”且配置文件为“dev”的应用程序将创建以下属性源:

config/testApp,dev/ 
config/testApp/ 
config/application,dev/ 
config/application/

最具体的属性源在顶部,最不具体的在底部。该文件夹下的属性config/application适用于所有使用consul进行配置的应用。文件夹中的属性config/testApp仅可用于名为“testApp”的服务实例。

当前在应用程序启动时读取配置。发送 HTTP POST 到/refresh将导致重新加载配置。Config Watch还将自动检测更改并重新加载应用程序上下文。

5.1. 如何激活

要开始使用 Consul 配置,请使用带有 grouporg.springframework.cloud和 artifact id的 starter spring-cloud-starter-consul-config。有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅Spring Cloud 项目页面。

5.2. Spring Boot 配置数据导入

spring.config.importSpring Boot 2.4 引入了一种通过属性导入配置数据的新方法。这是现在从 Consul 获取配置的默认方式。

要有选择地连接到 Consul,请在 application.properties 中设置以下内容:

application.properties

spring.config.import=optional:consul:

这将在默认位置“http://localhost:8500”连接到 Consul Agent。optional:如果无法连接到 Consul,删除前缀将导致 Consul Config 失败。要更改 Consul Config 的连接属性,请设置spring.cloud.consul.hostspring.cloud.consul.port将主机/端口对添加到spring.config.import语句中,例如spring.config.import=optional:consul:myhost:8500. 导入属性中的位置优先于主机和端口属性。

Consul Config 将尝试从四个基于spring.cloud.consul.config.name(默认为spring.application.name属性值)和spring.cloud.consul.config.default-context(默认为application)的自动上下文中加载值。如果您想指定上下文而不是使用计算的上下文,您可以将该信息添加到spring.config.import语句中。

application.properties

spring.config.import=optional:consul:myhost:8500/contextone;/context/two

这将选择性地仅从/contextone和加载配置/context/two

Spring Boot配置**数据导入方法不需要 文件bootstrap(属性或 yaml)。 spring.config.import

5.3. 客制化

可以使用以下属性自定义 Consul Config:

spring:
  cloud:
    consul:
      config:
        enabled: true
        prefix: configuration
        defaultContext: apps
        profileSeparator: '::'

如果您设置了spring.cloud.bootstrap.enabled=trueorspring.config.use-legacy-processing=true或 included spring-cloud-starter-bootstrap,则需要将上述值放在bootstrap.yml而不是 中application.yml

  • enabled将此值设置为“false”会禁用 Consul Config
  • prefix为配置值设置基本文件夹
  • defaultContext设置所有应用程序使用的文件夹名称
  • profileSeparator设置分隔符的值,用于将属性源中的配置文件名称与配置文件分开

5.4. 配置watch模块

Consul Config Watch 利用了 consul监视键前缀的能力。Config Watch 进行阻塞式 Consul HTTP API 调用,以确定当前应用程序的任何相关配置数据是否已更改。如果有新的配置数据,则会发布刷新事件。这相当于调用/refresh执行器端点。

更改调用 Config Watch 时的频率 change spring.cloud.consul.config.watch.delay。默认值为 1000,以毫秒为单位。延迟是上一次调用结束和下一次调用开始之间的时间量。

禁用 Config Watch 集spring.cloud.consul.config.watch.enabled=false

手表使用 SpringTaskScheduler来安排对 consul 的调用。默认情况下,它是 aThreadPoolTaskScheduler的 apoolSize为 1。要更改TaskScheduler,请创建一个以常量TaskScheduler命名的类型的 bean。ConsulConfigAutoConfiguration.CONFIG_WATCH_TASK_SCHEDULER_NAME

5.5. YAML 或properties配置

与单独的键/值对相比,以 YAML 或 Properties 格式存储一组属性可能更方便。将spring.cloud.consul.config.format属性设置为YAMLPROPERTIES。例如使用 YAML:

spring:
  cloud:
    consul:
      config:
        format: YAML

如果您设置了spring.cloud.bootstrap.enabled=trueorspring.config.use-legacy-processing=true或 included spring-cloud-starter-bootstrap,则需要将上述值放在bootstrap.yml而不是 中application.yml
YAML 必须data在 consul 的适当密钥中设置。使用键上方的默认值如下所示:

config/testApp,dev/data 
config/testApp/data 
config/application,dev/data 
config/application/data

您可以将 YAML 文档存储在上面列出的任何键中。

您可以使用更改数据键spring.cloud.consul.config.data-key

5.6. git2consul配置

git2consul 是一个 Consul 社区项目,它将文件从 git 存储库加载到单独的密钥到 Consul 中。默认情况下,密钥的名称是文件的名称。分别支持文件扩展名为.yml和的 YAML 和属性文件.properties。将spring.cloud.consul.config.format属性设置为FILES。例如:

bootstrap.yml

spring:
  cloud:
    consul:
      config:
        format: FILES

给定/config中的以下键,配置文件development和应用程序foo

.gitignore 
application.yml 
bar.properties 
foo-development.properties 
foo-production.yml 
foo.properties 
master.ref

将创建以下属性源:

config/foo-development.properties
config/foo.properties
config/application.yml

每个键的值都需要是格式正确的 YAML 或属性文件。

5.7. 快速失败

在某些情况下(如本地开发或某些测试场景),如果 consul 不可用于配置,则不会失败可能很方便。设置spring.cloud.consul.config.fail-fast=false将导致配置模块记录警告而不是抛出异常。这将允许应用程序继续正常启动。

如果您设置了spring.cloud.bootstrap.enabled=trueorspring.config.use-legacy-processing=true或 included spring-cloud-starter-bootstrap,则需要将上述值放在bootstrap.yml而不是 中application.yml

6.Consul重试

如果您预计 consul agent 在您的应用程序启动时可能偶尔不可用,您可以要求它在失败后继续尝试。您需要将 spring-retry和添加spring-boot-starter-aop到您的类路径。默认行为是重试 6 次,初始退避间隔为 1000 毫秒,后续退避的指数乘数为 1.1。您可以使用配置属性配置这些(和其他)spring.cloud.consul.retry.*属性。这适用于 Spring Cloud Consul Config 和 Discovery 注册。

要完全控制重试,请添加一个ID 为“consulRetryInterceptor”@Bean的类型 。RetryOperationsInterceptorSpring Retry 有一个RetryInterceptorBuilder可以很容易地创建一个。

7. 带Consul的Spring Cloud Bus

7.1. 如何激活

要开始使用 Consul Bus,请使用带有 grouporg.springframework.cloud和 artifact id的 starter spring-cloud-starter-consul-bus。有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅Spring Cloud 项目页面。

有关可用的执行器端点以及如何发送自定义消息,请参阅Spring Cloud Bus文档。

8. Hystrix 断路器

应用程序可以通过在项目 pom.xml 中包含此启动器来使用 Spring Cloud Netflix 项目提供的 Hystrix 断路器:spring-cloud-starter-hystrix。Hystrix 不依赖于 Netflix Discovery Client。@EnableHystrix注释应该放在配置类(通常是主类)上。然后可以将方法注释@HystrixCommand为由断路器保护。有关详细信息,请参阅文档。

9. 使用 Turbine 和 Consul 进行 Hystrix 指标聚合

Turbine(由 Spring Cloud Netflix 项目提供)聚合多个实例的 Hystrix 指标流,因此仪表板可以显示聚合视图。Turbine 使用DiscoveryClient接口查找相关实例。要将 Turbine 与 Spring Cloud Consul 一起使用,请以类似于以下示例的方式配置 Turbine 应用程序:

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

请注意,Turbine 依赖项不是启动器。涡轮启动器包括对 Netflix Eureka 的支持。

application.yml

spring.application.name: turbine
applications: consulhystrixclient
turbine:
  aggregator:
    clusterConfig: ${applications}
  appConfig: ${applications}

clusterConfigappConfig部分必须匹配,因此将逗号分隔的服务 ID 列表放入单独的配置属性中很有用。

Turbine.java

@EnableTurbine 
@SpringBootApplication 
public class Turbine { 
    public static void main(String[] args) { 
        SpringApplication.run(DemoturbinecommonsApplication.class, args); 
    } 
}

10. 配置属性

要查看所有 Consul 相关配置属性的列表,请查看附录页面

0

评论区