您的位置:

nacos配置与本地配置优先级详解

一、nacos配置与本地配置的概念

在分布式系统中,配置管理是一个很重要的问题。在微服务架构中,每一个服务都有自己的配置文件。nacos是一种新型的服务发现和配置管理中心,可以实现动态配置,服务发现和服务健康监测。

本地配置,是指在应用程序部署时将配置信息硬编码到项目中,或者直接在配置文件中配置。这种方式的优点是简单、方便、快捷,但是不易管理。

二、nacos配置与本地配置的优缺点分析

1. nacos配置的优点

对于分布式系统,在不停机的情况下进行配置修改,使得配置更新更加容易,避免了大量手动修改配置时出错的可能性。同时,nacos的配置支持版本控制,可以管理历史版本,保证配置信息的可追溯性,方便回退。

2. nacos配置的缺点

首先,nacos进行配置必须保证nacos服务的可用性,如果nacos服务不可用,就无法获取到配置信息,这会导致应用程序异常。其次,在获取nacos配置时,可能会因为网络原因导致配置信息获取失败,也会造成应用程序异常。

3. 本地配置的优点

本地配置不需要依赖于外部配置服务,因此可以保证即使发生网络故障,应用程序也能持续运行。在开发、测试环境中,使用本地配置可以避免频繁配置修改对服务产生的不良影响。

4. 本地配置的缺点

在生产环境下,本地配置很难管理。极端情况下,例如修改密钥,需要在每一个应用程序的配置文件中手动修改。如果应用程序多,且都需要修改,那么就变得非常繁琐。

三、nacos配置与本地配置的优先级顺序

对于一个分布式应用程序来说,通常存在多个配置来源,包括本地配置和nacos配置。既然存在多个配置来源,就需要有一个顺序来决定哪个配置来源的配置具有更高的优先级。下面就介绍一下优先级的顺序。

1. nacos配置优先级高于本地配置优先级

如果在nacos配置中配置了配置项,那么本地配置文件中的配置项将会被覆盖。这意味着如果你在nacos中修改了一个配置项,即使本地配置文件中也有该项的配置,应用程序获取到的依然是nacos配置中的值。

2. 同等优先级下,随机获取一个配置来源

如果一个配置项既在nacos中配置了,又在本地配置文件中配置了,那么应用程序将从两个配置来源中的任意一个获取配置。这也意味着如果两边配置不一样,则应用程序的具体行为是随机的。

3. 不同优先级下,优先级高的配置来源优先获取

如果一个配置项在nacos中有配置,在本地配置文件中也有配置,那么应用程序将从优先级高的那个配置来源中获取配置。例如,你在本地配置文件中配置了一个密钥,在nacos中也有一个对应的密钥,此时应用程序会优先选择nacos配置中的密钥。

四、nacos配置与本地配置优先级实现示例

1. 配置文件的准备

首先,在nacos配置中心中创建一个名为example的配置信息,包含一个key为username的配置项,对应的value为nacosUsername。在本地配置文件中,也建立一个key为username的配置项,对应的value为localUsername。

application.yml:

spring:
  application:
    name: example

example:
  username: localUsername

2. 优先级示例程序的编写

接下来,我们来编写一个示例程序来说明nacos配置和本地配置的优先级问题。在这个程序中,我们注入了一个值为String类型的username属性,通过打印该属性的值,来说明获取到的是哪个配置项的值。

@Service
@RefreshScope
public class ExampleService {

    @Value("${example.username}")
    private String username;

    public String getUsername(){
        return username;
    }

}

从代码中可以看出,我们将key为example.username的值注入到了username属性中。然后,在名为getUsername()的方法中,我们返回了username属性的值。

3. 测试示例程序配置优先级的结果

现在,我们可以通过编写一个简单的单元测试来测试示例程序的配置优先级是否按照我们预期的方式进行。代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(properties = {"example.username=springboot"})
public class ExampleServiceTest{

    @Autowired
    private ExampleService exampleService;

    @Test
    public void testGetUsername(){
        // 打印获取到的username属性值
        System.out.println(exampleService.getUsername());
    }

}

在这个测试中,我们使用了SpringBootTest来加载示例程序,使用了TestPropertySource注解来指定示例程序中的example.username配置项的值应该为springboot。在打印获得的username属性值的语句中,我们可以直接看到获取到的具体值。

假设我们运行这个测试程序,并且nacos配置中的example.username的值为nacosUsername。那么在程序中应该输出的是nacosUsername,而不是在example配置项中定义的localUsername。

总结:

本文详细介绍了nacos配置与本地配置的概念、优缺点,以及它们在使用过程中的优先级。通过一个实例程序的演示,我们进一步说明了优先级的表现形式。在分布式系统的应用开发中,熟悉nacos配置与本地配置的使用方法以及二者使用的优先级是至关重要的。