在单体服务时代,关于配置信息,管理一套配置文件即可。
而拆分成微服务之后,每一个系统都会有自己的配置,并且都各不相同,有些配置还需要动态改变,以达到动态降级、切流量、扩缩容等目的。
在Spring Boot开发中,可以把配置项放到config文件中,把配置当代码使用。比如:
public class AppConfig {
public static final String static_SUCCESS_CODE = "0000";
public static final String static_ERROR_CODE = "0001";
}
也可以通过@Value加载yaml配置文件中的配置。
@Component
public class HttpConfig {
// 核心线程数
public static String config_CORE_POOL_SIZE;
@Value("${async.corePoolSize}")
public void setSaveUrl(String corePoolSize) {
HttpConfig.config_CORE_POOL_SIZE = corePoolSize;
}
}
无论是将配置定义在代码中,还是将配置写在yaml配置文件中,都相当于把配置存在应用程序的本地。
如果想修改配置,就需要将在linux服务器中部署的程序停止,然后手动修改其配置,再进行重启。
如果修改的配置项较多,这也是一项容易出错,而且繁琐的事情,长期运维的小伙伴应该深有体会。
当时,我就在想,作为世界上使用人数最多的语言,更新一个配置,需要这么复杂吗?
答案肯定不是的。
配置中心(Configuration Center)通常用于集中管理应用程序的配置信息。这些配置信息可以包括数据库连接信息、外部服务地址、日志级别、超时设置等。配置中心可以提高应用部署的灵活性和可维护性。
程序启动时,可以自动从配置中心拉取所需要的配置项,配置中心中配置有所改变时,同样可以自动从配置中心拉取最新的配置信息,服务不需要重新发布。
项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
Nacos采用的是Pull模式获取服务端数据,客户端采用长轮询的方式定时的发起Pull请求,去检查服务端配置信息是否发生了变化。
这种是最简单的Nacos注册中心,有若干个服务,都注册到Nacos注册中心,调用之前,先到Nacos获取对应接口,然后进行实际的调用。
服务1和服务2和Nacos之间维护一个心跳关系,每5秒跳一次,频率不能太快或者太慢,否者会嗝屁的。
也可以通过服务端主动注销的方式,停止注册。
服务1调用服务2时,服务1会通过定时任务到Nacos中获取在线的服务,保证所调用的服务一直都是健康在线的状态。
获取到之后,用缓存将其保存起来,然后通过负载均衡器调用服务2,此时,将不再使用服务端的负载均衡Nginx了。
这些功能可以帮助降低分布式系统中管理配置信息的成本,降低因错误的配置信息变更带来可用性下降甚至发生故障的风险。
配置中心的配置注册通常包括以下步骤:
通过这种方式,配置中心实现了配置的统一管理和动态更新。服务提供者和消费者都可以通过配置中心来进行配置的注册和获取,大大提高了配置的灵活性和便利性。同时,也减少了因为手动配置错误而导致的问题,提高了系统的稳定性和可用性。
要通过JAVA代码实现配置注册到配置中心,你可以遵循以下步骤。这里继续提供一个通用的示例代码,以展示基本的流程和步骤。请注意,实际的代码可能会因所使用的具体配置中心而有所不同。
import com.configcenter.sdk.ConfigCenterClient;
import com.configcenter.sdk.exception.ConfigCenterException;
import com.configcenter.sdk.model.Configuration;
public class ConfigurationRegistration {
public static void main(String[] args) {
// 配置中心的服务器URL和认证令牌
String serverUrl = "configcenter_server_url";
String authToken = "your_auth_token";
// 创建配置对象
Configuration configuration = new Configuration();
configuration.setId("your_configuration_id");
configuration.setKey("your_configuration_key");
configuration.setValue("your_configuration_value");
// 可选:设置其他配置项属性,如描述、标签等
try {
// 初始化配置中心的客户端
ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);
// 调用配置中心的注册API
boolean success = client.registerConfiguration(configuration);
if (success) {
System.out.println("配置注册成功");
} else {
System.out.println("配置注册失败");
}
} catch (ConfigCenterException e) {
System.out.println("配置注册出现异常: " + e.getMessage());
e.printStackTrace();
}
}
}
在这个示例中:
配置中心的配置反注册是指从配置中心中移除或注销某个配置项的过程。当某个服务或应用不再需要使用某个配置项时,可以进行配置反注册操作。这个操作通常通过配置中心提供的接口来完成,它会将指定的配置项从配置中心中删除或标记为注销状态。
配置反注册可以是手动触发的,也可以是自动触发的。
配置反注册是配置中心的一个重要功能,它可以帮助管理员或开发者更好地管理配置项的生命周期,确保配置中心中的数据与实际应用需求保持一致。同时,通过反注册不再需要的配置项,也可以减少配置中心的存储空间和资源消耗。
要通过Java代码实现配置反注册,你需要使用配置中心提供的Java SDK或API。以下是一个示例代码,展示了如何使用Java来实现配置反注册。
import com.configcenter.sdk.ConfigCenterClient;
import com.configcenter.sdk.exception.ConfigCenterException;
public class ConfigurationDeregistration {
public static void main(String[] args) {
// 配置中心的服务器URL和认证令牌
String serverUrl = "configcenter_server_url";
String authToken = "your_auth_token";
// 初始化配置中心的客户端
ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);
// 配置项的ID
String configurationId = "your_configuration_id";
try {
// 调用配置中心的反注册API
boolean success = client.deregisterConfiguration(configurationId);
if (success) {
System.out.println("配置反注册成功");
} else {
System.out.println("配置反注册失败");
}
} catch (ConfigCenterException e) {
System.out.println("配置反注册出现异常: " + e.getMessage());
e.printStackTrace();
}
}
}
在这个示例中:
通过配置中心的用户界面和API接口,你可以方便地查看和管理配置项。
import com.configcenter.sdk.ConfigCenterClient;
import com.configcenter.sdk.exception.ConfigCenterException;
import com.configcenter.sdk.model.Configuration;
public class ConfigurationViewer {
public static void main(String[] args) {
// 配置中心的服务器URL和认证令牌
String serverUrl = "configcenter_server_url";
String authToken = "your_auth_token";
// 配置项的ID或键(key)
String configurationId = "your_configuration_id";
// 或者使用配置项的键(key)来获取配置项,根据配置中心API的要求而定
// String configurationKey = "your_configuration_key";
try {
// 初始化配置中心的客户端
ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);
// 调用配置中心的API接口获取配置项
Configuration configuration = client.getConfiguration(configurationId);
// 或者使用配置项的键(key)来获取:
// Configuration configuration = client.getConfigurationByKey(configurationKey);
// 输出配置项的信息
if (configuration != null) {
System.out.println("配置项ID: " + configuration.getId());
System.out.println("配置项键(key): " + configuration.getKey());
System.out.println("配置项值(value): " + configuration.getValue());
// 输出其他配置项属性,如描述、标签等
} else {
System.out.println("未找到配置项");
}
} catch (ConfigCenterException e) {
System.out.println("查看配置项出现异常: " + e.getMessage());
e.printStackTrace();
}
}
}
在上面的示例代码中:
配置中心通常支持配置变更订阅功能,允许应用程序或其他服务订阅配置项的变更通知。当配置项发生变化时,配置中心会向订阅者发送通知,以便订阅者能够及时获取最新的配置项。
要通过Java代码实现配置变更订阅,你可以按照以下步骤进行操作:
下面是一个简单的示例代码,展示如何实现配置变更订阅:
import com.configcenter.sdk.ConfigCenterClient;
import com.configcenter.sdk.exception.ConfigCenterException;
import com.configcenter.sdk.listener.ConfigurationChangeListener;
import com.configcenter.sdk.model.Configuration;
public class ConfigurationSubscriber {
public static void main(String[] args) {
// 初始化配置中心的客户端(省略代码)
// 创建订阅者类
ConfigurationChangeListener listener = new ConfigurationChangeListener() {
@Override
public void onConfigurationChanged(Configuration configuration) {
// 处理配置项变更事件
System.out.println("配置项发生变化: " + configuration.getKey() + " = " + configuration.getValue());
// 在这里可以更新本地缓存、重新加载配置等
}
};
try {
// 创建订阅请求对象(根据配置中心API的要求而定)
// 指定你希望订阅的配置项过滤条件,如配置项的键(key)或其他属性
// 调用配置中心的订阅方法
ConfigCenterClient client = ConfigCenterClient.init(serverUrl, authToken);
client.subscribeToConfigurationChanges(filter, listener);
} catch (ConfigCenterException e) {
System.out.println("配置变更订阅出现异常: " + e.getMessage());
e.printStackTrace();
}
}
}
最终,选择微服务注册中心是一个权衡的过程,需要根据自己的实际需求、技术栈、团队熟悉度等因素进行综合考虑。
在Eureka、Consul、Zookeeper和Nacos这几个微服务注册中心中,选择最适合的一个取决于你的具体需求和环境。
最终的选择应基于你的技术需求、团队熟悉度和业务场景。