Spring Cloud Zookeeper

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring Boot 应用程序提供 Zookeeper 集成。通过一些注释,您可以快速启用和配置应用程序内的常见模式,并使用基于 Zookeeper 的组件构建大型分布式系统。提供的模式包括服务发现和配置。该项目还通过与 Spring Cloud LoadBalancer 集成提供客户端负载均衡。

1. 快速入门

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

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

1.1. 发现客户端使用情况

spring-cloud-zookeeper-core要在应用程序中使用这些功能,您可以将其构建为依赖于和 的Spring Boot 应用程序spring-cloud-zookeeper-discovery。添加依赖项最方便的方法是使用 Spring Boot 启动器:org.springframework.cloud:spring-cloud-starter-zookeeper-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-zookeeper-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 设置:

构建.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-zookeeper-discovery'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}
根据您使用的版本,您可能需要调整项目中使用的 Apache Zookeeper 版本。您可以在安装 Zookeeper 部分阅读更多相关信息。

现在您可以创建一个标准的 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 服务器运行时,它会连接到在默认本地端口 (2181) 上运行的 Zookeeper。要修改启动行为,您可以使用 更改 Zookeeper 的位置application.properties,如下例所示:

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181

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

@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-zookeeper-core要在应用程序中使用这些功能,您可以将其构建为依赖于和 的Spring Boot 应用程序spring-cloud-zookeeper-config。添加依赖项最方便的方法是使用 Spring Boot 启动器:org.springframework.cloud:spring-cloud-starter-zookeeper-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-zookeeper-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 设置:

构建.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-zookeeper-config'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}
根据您使用的版本,您可能需要调整项目中使用的 Apache Zookeeper 版本。您可以在安装 Zookeeper 部分阅读更多相关信息。

现在您可以创建一个标准的 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);
    }

}

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

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

2.安装Zookeeper

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

Spring Cloud Zookeeper 在幕后使用 Apache Curator。虽然 Zookeeper 3.5.x 仍被 Zookeeper 开发团队视为“测试版”,但实际情况是它已被许多用户用于生产。不过,Zookeeper 3.4.x 也用于生产中。在 Apache Curator 4.0 之前,两个版本的 Zookeeper 通过两个版本的 Apache Curator 获得支持。从 Curator 4.0 开始,通过相同的 Curator 库支持两个版本的 Zookeeper。

如果您要与 3.4 版集成,您需要更改 附带的 Zookeeper 依赖项curator,因此spring-cloud-zookeeper. 为此,只需排除该依赖项并添加 3.4.x 版本,如下所示。

行家
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.12</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>
梯度
compile('org.springframework.cloud:spring-cloud-starter-zookeeper-all') {
  exclude group: 'org.apache.zookeeper', module: 'zookeeper'
}
compile('org.apache.zookeeper:zookeeper:3.4.12') {
  exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

3. 使用 Zookeeper 进行服务发现

服务发现是基于微服务的架构的关键原则之一。尝试手动配置每个客户端或某种形式的约定可能很难做到,而且可能很脆弱。Curator(Zookeeper 的 Java 库)通过服务发现扩展提供服务发现。Spring Cloud Zookeeper 使用此扩展进行服务注册和发现。

3.1. 激活

包括对启用自动配置的依赖 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery,以设置 Spring Cloud Zookeeper Discovery。

对于 Web 功能,您仍然需要包含 org.springframework.boot:spring-boot-starter-web.
使用 Zookeeper 3.4 版时,您需要更改包含依赖项的方式,如此处所述

3.2. 向 Zookeeper 注册

当客户端向 Zookeeper 注册时,它会提供有关自身的元数据(例如主机和端口、ID 和名称)。

以下示例显示了 Zookeeper 客户端:

@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 应用程序。

如果 Zookeeper 位于 以外的位置localhost:2181,则配置必须提供服务器的位置,如以下示例所示:

应用程序.yml
spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181
如果您使用Spring Cloud Zookeeper Config,则上例中显示的值需要为 inbootstrap.yml而不是 application.yml

默认服务名称、实例 ID 和端口(取自Environment)分别是 ${spring.application.name}、Spring 上下文 ID 和${server.port}

位于spring-cloud-starter-zookeeper-discovery类路径上使应用程序既成为 Zookeeper“服务”(即它自己注册)又成为“客户端”(即它可以查询 Zookeeper 以查找其他服务)。

如果您想禁用 Zookeeper Discovery Client,可以设置 spring.cloud.zookeeper.discovery.enabledfalse

3.3. 使用 DiscoveryClient

Spring Cloud 支持 Feign (REST 客户端构建器)、 Spring RestTemplateSpring WebFlux,使用逻辑服务名称而不是物理 URL。

您还可以使用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().toString();
    }
    return null;
}

4. 将 Spring Cloud Zookeeper 与 Spring Cloud 组件结合使用

Feign、Spring Cloud Gateway 和 Spring Cloud LoadBalancer 都与 Spring Cloud Zookeeper 配合使用。

4.1. Spring Cloud LoadBalancer 与 Zookeeper

Spring Cloud Zookeeper 提供了 Spring Cloud LoadBalancer 的实现ServiceInstanceListSupplier。当您使用 时 ,Spring Cloud LoadBalancer 会自动配置为默认spring-cloud-starter-zookeeper-discovery使用 。ZookeeperServiceInstanceListSupplier

如果您之前在 Zookeeper 中使用了 StickyRule,则当前堆栈中的 StickyRule 替换为SameInstancePreferenceServiceInstanceListSupplierSC LoadBalancer 中的。您可以在Spring Cloud Commons 文档中了解如何设置它。

5.Spring Cloud Zookeeper和服务注册中心

Spring Cloud Zookeeper实现了该ServiceRegistry接口,允许开发人员以编程方式注册任意服务。

该类ServiceInstanceRegistration提供了一种builder()方法来创建 Registration可由 所使用的对象ServiceRegistry,如以下示例所示:

@Autowired
private ZookeeperServiceRegistry serviceRegistry;

public void registerThings() {
    ZookeeperRegistration registration = ServiceInstanceRegistration.builder()
            .defaultUriSpec()
            .address("anyUrl")
            .port(10)
            .name("/a/b/c/d/anotherservice")
            .build();
    this.serviceRegistry.register(registration);
}

5.1. 实例状态

OUT_OF_SERVICENetflix Eureka 支持在服务器上注册实例。这些实例不会作为活动服务实例返回。这对于蓝/绿部署等行为很有用。(请注意,Curator Service Discovery 配方不支持此行为。)利用灵活的负载,Spring Cloud Zookeeper 通过OUT_OF_SERVICE更新一些特定的元数据,然后在 Spring Cloud LoadBalancer 中过滤该元数据来实现ZookeeperServiceInstanceListSupplier。过滤ZookeeperServiceInstanceListSupplier掉所有不等于 的非空实例状态UP。如果实例状态字段为空,则认为是UP为了向后兼容。要更改实例的状态,请对实例状态执行器端点进行POSTwith操作 ,如下例所示:OUT_OF_SERVICEServiceRegistry

$ http POST http://localhost:8081/service-registry status=OUT_OF_SERVICE
前面的示例使用httpie.orghttp中的命令。

6. Zookeeper 依赖项

以下主题介绍如何使用 Spring Cloud Zookeeper 依赖项:

6.1. 使用 Zookeeper 依赖项

Spring Cloud Zookeeper 使您可以将应用程序的依赖项作为属性提供。作为依赖项,您可以了解在 Zookeeper 中注册的其他应用程序以及您希望通过 Feign (REST 客户端构建器)、 Spring RestTemplateSpring WebFlux调用的其他应用程序。

您还可以使用 Zookeeper 依赖项观察程序功能来控制和监视依赖项的状态。

6.2. 激活 Zookeeper 依赖项

包括对启用自动配置的依赖项 org.springframework.cloud:spring-cloud-starter-zookeeper-discovery,以设置 Spring Cloud Zookeeper 依赖项。即使您在属性中提供了依赖项,您也可以关闭依赖项。为此,请将该 spring.cloud.zookeeper.dependency.enabled属性设置为 false(默认为true)。

6.3. 设置 Zookeeper 依赖项

考虑以下依赖关系表示的示例:

应用程序.yml
spring.application.name: yourServiceName
spring.cloud.zookeeper:
  dependencies:
    newsletter:
      path: /path/where/newsletter/has/registered/in/zookeeper
      loadBalancerType: ROUND_ROBIN
      contentTypeTemplate: application/vnd.newsletter.$version+json
      version: v1
      headers:
        header1:
            - value1
        header2:
            - value2
      required: false
      stubs: org.springframework:foo:stubs
    mailing:
      path: /path/where/mailing/has/registered/in/zookeeper
      loadBalancerType: ROUND_ROBIN
      contentTypeTemplate: application/vnd.mailing.$version+json
      version: v1
      required: true

接下来的几节将一一介绍依赖项的每个部分。根属性名称是spring.cloud.zookeeper.dependencies.

6.3.1. 别名

在根属性下面,您必须将每个依赖项表示为别名。这是由于 Spring Cloud LoadBalancer 的限制,它要求将应用程序 ID 放在 URL 中。因此,您不能传递任何复杂的路径,例如 /myApp/myRoute/name)。serviceId别名是您用来代替for DiscoveryClientFeign或 的 名称RestTemplate

在前面的示例中,别名是newslettermailing。以下示例显示了带newsletter别名的 Feign 用法:

@FeignClient("newsletter")
public interface NewsletterService {
        @RequestMapping(method = RequestMethod.GET, value = "/newsletter")
        String getNewsletters();
}

6.3.2. 小路

该路径由 YAML 属性表示path,并且是在 Zookeeper 下注册依赖项的路径。如上一 所述,Spring Cloud LoadBalancer 对 URL 进行操作。因此,该路径不符合其要求。这就是 Spring Cloud Zookeeper 将别名映射到正确路径的原因。

6.3.3. 负载均衡器类型

负载均衡器类型由 YAML 属性表示loadBalancerType

如果您知道调用此特定依赖项时必须应用哪种负载平衡策略,则可以在 YAML 文件中提供它,它会自动应用。您可以选择以下负载均衡策略之一:

  • STICKY:一旦选择,实例将始终被调用。

  • RANDOM:随机选择一个实例。

  • ROUND_ROBIN:一遍又一遍地迭代实例。

6.3.4. Content-Type模板及版本

模板和版本由和 YAML 属性Content-Type表示。contentTypeTemplateversion

如果您在标头中对 API 进行版本控制Content-Type,则您不希望将此标头添加到每个请求中。此外,如果您想调用新版本的 API,您不希望在代码中漫游以提高 API 版本。这就是为什么您可以提供一个 contentTypeTemplate特殊的$version占位符。该占位符将由 versionYAML 属性的值填充。考虑以下 a 的示例contentTypeTemplate

application/vnd.newsletter.$version+json

进一步考虑以下几点version

v1

和 version的组合contentTypeTemplate会为每个请求创建一个 Content-Type标头,如下所示:

application/vnd.newsletter.v1+json

6.3.5. 默认标头

headers默认标头由YAML 中的映射表示。

有时,每次调用依赖项都需要设置一些默认标头。如果不想在代码中执行此操作,您可以在 YAML 文件中设置它们,如以下示例 headers部分所示:

headers:
    Accept:
        - text/html
        - application/xhtml+xml
    Cache-Control:
        - no-cache

headers部分会在 HTTP 请求中添加Accept和标头以及适当的值列表。Cache-Control

6.3.6。所需的依赖项

所需的依赖项由 YAML 中的属性表示required

如果应用程序启动时需要启动某个依赖项,则可以required: true在 YAML 文件中设置该属性。

如果您的应用程序无法在启动时本地化所需的依赖项,则会引发异常,并且 Spring 上下文无法设置。换句话说,如果所需的依赖项未在 Zookeeper 中注册,您的应用程序将无法启动。

您可以在本文档后面阅读有关 Spring Cloud Zookeeper Presence Checker 的更多信息 。

6.3.7. 存根

您可以提供一个以冒号分隔的路径,指向包含依赖项存根的 JAR,如以下示例所示:

stubs: org.springframework:myApp:stubs

在哪里:

  • org.springframeworkgroupId.

  • myAppartifactId.

  • stubs是分类器。(请注意,这stubs是默认值。)

因为stubs是默认分类器,所以前面的示例等同于下面的示例:

stubs: org.springframework:myApp

6.4. 配置 Spring Cloud Zookeeper 依赖项

您可以设置以下属性来启用或禁用部分 Zookeeper 依赖项功能:

  • spring.cloud.zookeeper.dependencies:如果不设置该属性,则无法使用Zookeeper依赖项。

  • spring.cloud.zookeeper.dependency.loadbalancer.enabled(默认启用):打开 Zookeeper 特定的自定义负载平衡策略,包括ZookeeperServiceInstanceListSupplier基于依赖项的负载平衡RestTemplate设置。

  • spring.cloud.zookeeper.dependency.headers.enabled(默认启用):此属性注册一个FeignBlockingLoadBalancerClient自动附加适当的标头和内容类型及其版本的属性,如依赖项配置中所示。如果没有此设置,这两个参数将不起作用。

  • spring.cloud.zookeeper.dependency.resttemplate.enabled(默认启用):启用后,此属性会修改@LoadBalanced-annotated 的请求标头RestTemplate,以便它传递具有依赖项配置中设置的版本的标头和内容类型。如果没有此设置,这两个参数将不起作用。

7.Spring Cloud Zookeeper依赖观察器

依赖项观察器机制允许您将侦听器注册到您的依赖项。事实上,功能是Observator模式的实现。当依赖项更改其状态(变为 UP 或 DOWN)时,可以应用一些自定义逻辑。

7.1. 激活

需要启用 Spring Cloud Zookeeper 依赖项功能才能使用依赖项观察器机制。

7.2. 注册监听器

要注册侦听器,您必须实现一个名为 的接口 org.springframework.cloud.zookeeper.discovery.watcher.DependencyWatcherListener并将其注册为 bean。该接口为您提供了一种方法:

void stateChanged(String dependencyName, DependencyState newState);

如果您想为特定依赖项注册侦听器,则这dependencyName将是您具体实现的鉴别器。newState为您提供有关您的依赖关系是否已更改为CONNECTED或 的信息DISCONNECTED

7.3. 使用存在检查器

与 Dependency Watcher 绑定的是称为 Presence Checker 的功能。它允许您在应用程序启动时提供自定义行为,以根据依赖项的状态做出反应。

抽象类的默认实现 org.springframework.cloud.zookeeper.discovery.watcher.presence.DependencyPresenceOnStartupVerifierorg.springframework.cloud.zookeeper.discovery.watcher.presence.DefaultDependencyPresenceOnStartupVerifier,其工作方式如下。

  1. 如果依赖项被标记为我们required并且不在 Zookeeper 中,那么当您的应用程序启动时,它会抛出异常并关闭。

  2. 如果依赖项不是required,则 org.springframework.cloud.zookeeper.discovery.watcher.presence.LogMissingDependencyChecker 记录该WARN级别缺少依赖项。

因为DefaultDependencyPresenceOnStartupVerifier仅当不存在类型为 的 bean 时才注册DependencyPresenceOnStartupVerifier,因此可以覆盖此功能。

8. 使用Zookeeper进行分布式配置

Zookeeper 提供了一个 分层命名空间 ,允许客户端存储任意数据,例如配置数据。Spring Cloud Zookeeper Config 是Config Server 和 Client的替代方案 。配置在特殊的“引导”阶段加载到 Spring 环境中。/config配置默认存储在命名空间中。PropertySource根据应用程序的名称和活动配置文件创建多个 实例,以模仿 Spring Cloud Config 解析属性的顺序。例如,名称为testAppdev配置文件为的应用程序为其创建了以下属性源:

  • config/testApp,dev

  • config/testApp

  • config/application,dev

  • config/application

最具体的属性来源位于顶部,最不具体的属性来源位于底部。命名空间中的属性config/application适用于所有使用zookeeper进行配置的应用程序。命名空间中的属性config/testApp仅适用于名为 的服务的实例testApp

目前,配置是在应用程序启动时读取的。发送 HTTPPOST 请求会/refresh导致重新加载配置。目前尚未实现监视配置命名空间(Zookeeper 支持)。

8.1. 激活

包括对启用自动配置的依赖 org.springframework.cloud:spring-cloud-starter-zookeeper-config,以设置 Spring Cloud Zookeeper 配置。

使用 Zookeeper 3.4 版时,您需要更改包含依赖项的方式,如此处所述

8.2. Spring Boot 配置数据导入

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

要选择连接到 Zookeeper 进行配置,请在 application.properties 中设置以下内容:

应用程序属性
spring.config.import=optional:zookeeper:

这将连接到默认位置“localhost:2181”的 Zookeeper。optional:如果无法连接到 Zookeeper,删除前缀将导致 Zookeeper Config 失败。要更改 Zookeeper Config 的连接属性,请设置连接spring.cloud.zookeeper.connect-string字符串或将连接字符串添加到spring.config.import语句中,例如spring.config.import=optional:zookeeper:myhost:2818。导入属性中的位置优先于connect-string属性。

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

应用程序属性
spring.config.import=optional:zookeeper:myhost:2181/contextone;/context/two

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

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

8.3. 定制

Zookeeper 配置可以通过设置以下属性来自定义:

spring:
  cloud:
    zookeeper:
      config:
        enabled: true
        root: configuration
        defaultContext: apps
        profileSeparator: '::'
  • enabled:设置此值以false禁用 Zookeeper 配置。

  • root:设置配置值的基本命名空间。

  • defaultContext:设置所有应用程序使用的名称。

  • profileSeparator:设置用于分隔属性源中的配置文件名称与配置文件的分隔符的值。

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

8.4. 访问控制列表 (ACL)

addAuthInfo 您可以通过调用 bean的方法为 Zookeeper ACL 添加身份验证信息CuratorFramework。实现此目的的一种方法是提供您自己的 CuratorFrameworkbean,如以下示例所示:

@BoostrapConfiguration
public class CustomCuratorFrameworkConfig {

  @Bean
  public CuratorFramework curatorFramework() {
    CuratorFramework curator = new CuratorFramework();
    curator.addAuthInfo("digest", "user:password".getBytes());
    return curator;
  }

}

请查阅 ZookeeperAutoConfiguration 类 以了解CuratorFrameworkbean 的默认配置如何。

或者,您可以从依赖于现有 bean 的类中添加凭据 CuratorFramework,如以下示例所示:

@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {

  public ZookeeperConfig(CuratorFramework curator) {
    curator.addAuthInfo("digest", "user:password".getBytes());
  }

}

该 bean 的创建必须发生在 boostrapping 阶段。您可以注册配置类以在此阶段运行,方法是使用注释并将它们 @BootstrapConfiguration包含在逗号分隔的列表中,并将其设置为文件org.springframework.cloud.bootstrap.BootstrapConfiguration中的属性 值resources/META-INF/spring.factories,如以下示例所示:

资源/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig