常见的分布式配置中心
- ZooKeeper:一个高性能的分布式协调服务,可以用作配置中心、命名服务等。
- Consul:也是一个分布式协调服务平台,支持服务注册与发现、健康检查、KV存储等功能。
- Etcd:一个分布式可靠的键值存储系统,支持分布式锁和通知机制。
- Apollo:携程开源的企业级配置中心,提供管理界面、版本控制、灰度发布等功能。
- Spring Cloud Config:基于Spring Cloud的配置中心,支持Git和SVN作为后端存储,并提供RESTful API和Web UI。
- Nacos:阿里巴巴开源的新一代服务发现和配置管理平台,支持动态配置、服务发现和流量管理等功能。
基于Spring Boot接入ZooKeeper的示例
首先,在POM文件中引入相关依赖:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
讯享网
其中,${zookeeper.version}为ZooKeeper客户端的版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# ZooKeeper服务器地址 zookeeper.server=127.0.0.1:2181 # 会话超时时间,单位为毫秒 zookeeper.sessionTimeout=60000 # 连接超时时间,单位为毫秒 zookeeper.connectionTimeout=5000
接着,在Spring Boot的配置类中增加如下内容:
import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ZooKeeperConfig { @Value("${zookeeper.server}") private String zookeeperServer; @Value("${zookeeper.sessionTimeout}") private int sessionTimeout; @Value("${zookeeper.connectionTimeout}") private int connectionTimeout; @Bean(initMethod = "start", destroyMethod = "close") public CuratorFramework curatorFramework() { return CuratorFrameworkFactory.newClient(zookeeperServer, sessionTimeout, connectionTimeout, new ExponentialBackoffRetry(1000, 3)); } }
其中,curatorFramework()方法返回了一个CuratorFramework对象,这是ZooKeeper客户端的核心类之一。它实现了对ZooKeeper服务端的连接、操作和事件监听等功能。
最后,在需要使用ZooKeeper的地方,可以直接注入CuratorFramework对象,并调用其相应的方法进行操作。例如:
讯享网import org.apache.curator.framework.CuratorFramework; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyComponent { private final CuratorFramework curatorFramework; @Autowired public MyComponent(CuratorFramework curatorFramework) { this.curatorFramework = curatorFramework; } public void doSomething() throws Exception { // 创建节点 curatorFramework.create().forPath("/path/to/node", "data".getBytes()); // 获取数据 byte[] data = curatorFramework.getData().forPath("/path/to/node"); // ... } }
通过以上步骤,即可实现基于Spring Boot的ZooKeeper客户端接入。
Spring Boot接入Consul的示例
首先,在POM文件中引入相关依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> <version>${spring-cloud-version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> <version>${spring-cloud-version}</version> </dependency>
其中,${spring-cloud-version}为Spring Cloud版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# Consul服务注册与发现地址 spring.cloud.consul.host=127.0.0.1 spring.cloud.consul.port=8500 # 应用名称 spring.application.name=my-app # 以下为Consul配置中心相关配置 spring.cloud.consul.config.enabled=true spring.cloud.consul.config.format=properties spring.cloud.consul.config.prefix=config/my-app spring.cloud.consul.config.default-context=default
其中,config/my-app为Consul中存储应用配置的路径。
接着,在Spring Boot的配置类中增加如下内容:
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.consul.ConditionalOnConsulEnabled; import org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration; import org.springframework.cloud.consul.discovery.HeartbeatProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableDiscoveryClient @ConditionalOnConsulEnabled public class ConsulConfig { private final InetUtils inetUtils; public ConsulConfig(InetUtils inetUtils) { this.inetUtils = inetUtils; } @Bean public HeartbeatProperties heartbeatProperties() { return new HeartbeatProperties(); } @Bean public ConsulDiscoveryClientConfiguration consulDiscoveryClientConfiguration() { return new ConsulDiscoveryClientConfiguration(inetUtils, heartbeatProperties()); } }
最后,在需要使用配置信息的地方,可以直接注入Environment对象,并调用其相应的方法获取配置信息。例如:
讯享网import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class MyComponent { private final Environment env; @Autowired public MyComponent(Environment env) { this.env = env; } public void doSomething() { String someValue = env.getProperty("some_key", "default_value"); // ... } }
通过以上步骤,即可实现基于Spring Boot的Consul客户端接入。
基于Spring Boot接入Apollo的示例
首先,在POM文件中引入相关依赖:
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>${apollo.version}</version> </dependency> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-spring-boot-starter</artifactId> <version>${apollo.version}</version> </dependency>
其中,${apollo.version}为Apollo客户端的版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# 应用ID app.id=your_app_id # Apollo Portal配置中心地址 apollo.meta=http://localhost:8080 # 环境 apollo.env=your_env # 集群名称 apollo.cluster.name=default
接着,在Spring Boot的配置类中增加如下内容:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean @ConfigurationProperties(prefix = "apollo") public ApolloProperties apolloProperties() { return new ApolloProperties(); } }
其中,ApolloProperties为自定义的属性类,它包含了上述配置文件中的所有配置项。
最后,在需要使用配置信息的地方,可以直接注入Config对象,并调用其相应的方法获取配置信息。例如:
讯享网import com.ctrip.framework.apollo.Config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyComponent { private final Config config; @Autowired public MyComponent(Config config) { this.config = config; } public void doSomething() { String someValue = config.getProperty("some_key", "default_value"); // ... } }
通过以上步骤,即可实现基于Spring Boot的Apollo配置中心接入。
Spring Boot接入Etcd的示例代码:
首先,在POM文件中引入相关依赖:
<dependency> <groupId>io.etcd.jetcd</groupId> <artifactId>jetcd-core</artifactId> <version>${jetcd.version}</version> </dependency> <dependency> <groupId>io.etcd.jetcd</groupId> <artifactId>jetcd-client</artifactId> <version>${jetcd.version}</version> </dependency>
其中,${jetcd.version}为Etcd客户端的版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# Etcd服务器地址 etcd.server=http://127.0.0.1:2379
接着,在Spring Boot的配置类中增加如下内容:
import io.etcd.jetcd.ByteSequence; import io.etcd.jetcd.Client; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.nio.charset.StandardCharsets; @Configuration public class EtcdConfig { @Value("${etcd.server}") private String etcdServer; @Bean(destroyMethod = "close") public Client etcdClient() { return Client.builder().endpoints(etcdServer).build(); } @Bean public ByteSequence rootPath() { return ByteSequence.from("/", StandardCharsets.UTF_8); } }
其中,etcdClient()方法返回了一个Client对象,它实现了对Etcd服务端的连接、操作和事件监听等功能。另外,rootPath()方法返回了根路径的ByteSequence对象。
最后,在需要使用Etcd的地方,可以直接注入Client对象,并调用其相应的方法进行操作。例如:
讯享网import io.etcd.jetcd.ByteSequence; import io.etcd.jetcd.KV; import io.etcd.jetcd.kv.GetResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.concurrent.CompletableFuture; @Component public class MyComponent { private final KV kv; private final ByteSequence rootPath; @Autowired public MyComponent(Client client, ByteSequence rootPath) { this.kv = client.getKVClient(); this.rootPath = rootPath; } public void doSomething() throws Exception { // 创建key-value ByteSequence key = rootPath.concat(ByteSequence.from("/path/to/key", StandardCharsets.UTF_8)); ByteSequence value = ByteSequence.from("value", StandardCharsets.UTF_8); CompletableFuture<GetResponse> setFuture = kv.put(key, value); GetResponse setResponse = setFuture.get(); // 获取数据 CompletableFuture<GetResponse> getFuture = kv.get(key); GetResponse getResponse = getFuture.get(); List<io.etcd.jetcd.data.KeyValue> kvs = getResponse.getKvs(); // ... } }
通过以上步骤,即可实现基于Spring Boot的Etcd客户端接入。
Spring Boot接入Spring Cloud Config的示例
首先,在POM文件中引入相关依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>${spring-cloud-version}</version> </dependency>
其中,${spring-cloud-version}为Spring Cloud版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# Spring Cloud Config服务端地址 spring.cloud.config.uri=http://127.0.0.1:8888 # 应用名称 spring.application.name=my-app # 以下为加密相关配置(可选) encrypt.key=abcdefg
其中,http://127.0.0.1:8888为Spring Cloud Config服务端地址,my-app为应用名称。
接着,在需要使用配置信息的地方,可以直接注入Environment对象,并调用其相应的方法获取配置信息。例如:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class MyComponent { private final Environment env; @Autowired public MyComponent(Environment env) { this.env = env; } public void doSomething() { String someValue = env.getProperty("some_key", "default_value"); // ... } }
需要注意的是,若要使用加密配置,需要先在bootstrap.yml或bootstrap.properties文件中配置encrypt.key属性。例如:
讯享网encrypt: key: abcdefg
通过以上步骤,即可实现基于Spring Boot的Spring Cloud Config客户端接入。
Spring Boot接入Nacos的示例
首先,在POM文件中引入相关依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${alibaba-cloud-version}</version> </dependency>
其中,${alibaba-cloud-version}为Alibaba Cloud版本号。
然后,在application.properties或application.yml文件中配置如下内容:
讯享网# Nacos服务注册与发现地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 应用名称 spring.application.name=my-app # 以下为Nacos配置中心相关配置 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace= spring.cloud.nacos.config.group=DEFAULT_GROUP spring.cloud.nacos.config.prefix=config/my-app spring.cloud.nacos.config.file-extension=properties
其中,127.0.0.1:8848为Nacos服务注册与发现地址,my-app为应用名称。
接着,在需要使用配置信息的地方,可以直接注入Environment对象,并调用其相应的方法获取配置信息。例如:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class MyComponent { private final Environment env; @Autowired public MyComponent(Environment env) { this.env = env; } public void doSomething() { String someValue = env.getProperty("some_key", "default_value"); // ... } }
通过以上步骤,即可实现基于Spring Boot的Nacos客户端接入。
各个分布式配置中心的优缺点
- ZooKeeper
优点:ZooKeeper是一个经过时间验证的可靠的分布式系统,具有高可用性、一致性和容错能力。它提供了原生的命名服务以及基于Watch机制的配置变更通知。
缺点:ZooKeeper需要手动编写代码来使用,并且需要对ZooKeeper的内部运行机制有一定的了解。 - Consul
优点:Consul支持多种协议和服务发现方式,同时也可以直接作为负载均衡器使用。其提供了易于使用的CLI和Web UI,并且还支持多数据中心管理。
缺点:Consul使用Go语言编写,可能不太适合Java开发者使用。 - Etcd
优点:Etcd是由CoreOS开发的分布式键值存储系统,在Kubernetes中得到广泛应用。它提供了轻量级API和易于使用的CLI工具,支持分布式锁和通知机制。
缺点:Etcd的可扩展性不如其他系统,并且在性能方面可能不如ZooKeeper。 - Apollo
优点:Apollo提供完整的Web管理界面和API,支持灰度发布、版本管理和权限控制等功能。它还支持多种数据源类型,并且可以与Spring Cloud无缝集成。
缺点:Apollo是携程公司自主研发的产品,社区支持相对较弱。 - Spring Cloud Config
优点:Spring Cloud Config是Spring Cloud生态中的一员,可以与Spring Boot无缝集成。其支持Git和SVN等常见的后端存储,并且提供RESTful API和Web UI。
缺点:Spring Cloud Config没有提供服务注册和发现等功能,需要配合其他组件使用。 - Nacos
优点:Nacos支持服务注册和发现、动态配置等多种功能,同时还可以作为DNS服务器使用。其提供了易于使用的Web界面和RESTful API,支持多数据中心管理,并且可以与Spring Cloud无缝集成。
缺点:Nacos是阿里巴巴公司自主研发的产品,社区支持相对较弱。
建议
- 确定使用哪种配置中心:目前常见的配置中心有 ZooKeeper、Consul、Etcd、Apollo 等。您可以根据自己的需求和实际情况选择适合自己的。
- 设计配置文件格式:在使用配置中心时,需要将配置文件统一存储到配置中心中,并且定义好各个节点/服务所需要的配置信息,以便其它服务能够快速获取和使用。
- 集成配置中心到应用程序中:在应用程序中集成配置中心,可以通过开发 SDK 或者客户端等方式来完成。
- 监控和管理:在配置中心中需要设定监控和管理机制,以便于及时发现和解决问题。
- 安全性:由于配置中心中存储着重要的配置信息,因此需要考虑安全性问题,如加密、访问权限等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/126485.html