Nacos使用入门

作者: 文景大大 | 来源:发表于2021-07-09 22:05 被阅读0次

    Nacos是可以代替SpringCloud Eureka和SpringCloud Config的开源组件,有了它我们就不用自己配置和搭建服务端了,服务端直接从最新的发布版本下载即可,我们只需要在服务机器上启动。

    首先我们需要从github的官方地址下载最新版本的压缩包。解压缩后进入到bin目录下,因为我的环境是自己的windows开发机器,所以需要修改startup.cmd中的模式为单机模式。然后再启动服务端。

    set MODE="standalone"
    

    此时访问localhost:8848/nacos就能访问已经启动的服务端应用了。

    一、Nacos作为注册中心

    我们创建一个springcloud父工程,只包含web依赖。然后基于该父工程,分别创建服务提供者Provider和消费者Consumer工程。

    1.1 服务提供者Provider

    需要的依赖如下:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2021.1</version>
    </dependency>
    

    配置文件如下:

    server:
      port: 8091
    spring:
      application:
        name: nacos-provider
      cloud:
        nacos:
          server-addr: localhost:8848
    

    然后我们创建一个controller来模拟Provider对外提供服务:

    @RestController
    public class HelloController {
    
        @GetMapping("/getHello")
        public String getHello(){
            return "hello from nacos provider!";
        }
    
    }
    

    最后,我们在启动类上添加启动注解。

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

    到此,我们服务提供者就创建好了,在localhost:8091端口等待被调用提供服务。

    1.2 服务消费者Consumer

    需要的依赖如下:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2021.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        <version>3.0.3</version>
    </dependency>
    

    配置文件如下:

    server:
      port: 8092
    spring:
      application:
        name: nacos-consumer
      cloud:
        nacos:
          server-addr: localhost:8848
    

    接下来也创建一个Controller类,对外提供调用的接口,然后在Controller中通过OpenFeign转发调用请求给到Provider。

    @RestController
    public class HelloController {
    
        @Autowired
        private FeignService feignService;
    
        @GetMapping("/getHello")
        public String getHello(){
            return feignService.getHello();
        }
    
    }
    
    @FeignClient("nacos-provider")
    public interface FeignService {
    
        @GetMapping("/getHello")
        String getHello();
    
    }
    

    如上Service表示需要请求注册中心中服务名称为nacos-provider的/getHello接口。

    最后,我们需要在启动类上加上启动注解。

    @EnableFeignClients
    @EnableDiscoveryClient
    @SpringBootApplication
    public class DiscoveryConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DiscoveryConsumerApplication.class, args);
        }
    
    }
    

    到此,消费者Consumer也创建好了,在localhost:8092提供调用服务。我们访问Consumer的/getHello接口,获得的返回内容为:

    hello from nacos provider!
    

    此时登录nacos服务端,服务管理,也能看到刚刚注册上来的消费者和服务提供者。

    二、Nacos作为配置中心

    我们以如上provider项目作为示例项目进行如下配置中心功能的演示。

    2.1 入门案例

    首先我们需要引入必要的依赖包:

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2021.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    

    其次,我们在启动配置文件bootstrap.properties中配置如下的内容:

    spring.application.name=nacos-provider
    spring.cloud.nacos.server-addr=127.0.0.1:8848
    

    然后我们创建一个Controller就可以演示从远端获取配置内容了:

    @RefreshScope
    @RestController
    public class ConfigController {
    
        @Value("${provider.name}")
        private String providerName;
    
        @GetMapping("/getDevConfig")
        public String getDevConfig(){
            return this.providerName;
        }
    
    }
    

    代码层面的示例都已经写好了,我们在远端nacos服务端,切换到配置管理的配置列表界面,需要点击+号新建一个:

    • DataID,该字段的取名是有规则的,一般而言分为三个部分,{1}-{2}.{3},其中第一部分应该和刚才本地bootstrap.properties中配置的spring.application.name完全一样;第二部分表示生效的环境名称,比如dev、stg等;第三部分表示配置文件后缀,只支持properties或者yaml类型。在这里,我们的值应该为nacos-provider.properties
    • Group,这里先设置默认的DEFAULT_GROUP即可;
    • 配置内容,把需要保存在远端Nacos的配置内容写在里面即可,这里为provider.name=nacos123

    配置点击发布后,我们启动本地的nacos-provider服务,访问Controller,就会发现读取到了nacos123的配置内容。

    2.2 配置文件的环境区分

    在实际使用时,我们一般都是区分dev、stg、prd三套环境来维护各个环境的配置文件内容的。在这样的情况下,我们的应用程序如何读取不同环境下的配置内容呢?

    2.2.1 通过profile区分

    首先我们在Nacos配置中心再增加两个DataID,分别如下:

    # nacos-provider-dev.properties
    # DEFAULT_GROUP
    provider.name=nacos-dev
    
    # nacos-provider-stg.properties
    # DEFAULT_GROUP
    provider.name=nacos-stg
    

    为了让这两个配置文件生效,我们在本地应用端的bootstrap.properties中指定生效配置文件的环境名称即可:

    spring.application.name=nacos-provider
    spring.cloud.nacos.server-addr=127.0.0.1:8848
    spring.profiles.active=dev
    # spring.profiles.active=stg
    

    如此,再重启我们的应用,就能读取到各自环境的配置文件了。

    2.2.2 通过namespace区分

    默认我们会到public这个命名空间下去读取配置文件,此时我们新建两个命名空间,分别命名为dev和stg,然后将public命名空间下的nacos-provider.properties克隆到dev和stg命名空间下,并修改provider.name的配置内容:

    # namespace dev
    provider.name=nacos-dev-123
    
    # namespace stg
    provider.name=nacos-stg-123
    

    然后我们在本地的应用中增加一个配置项,表明想要引用的namespace:

    spring.cloud.nacos.config.namespace=0a6be74a-426e-45eb-8531-6d7230f26af6
    

    然后重启应用,就能读取到对应namespace下面的配置内容了。

    2.3 加载多配置文件

    默认情况下,本地应用会去nacos服务端读取对应namespace下面的以应用名称开头的配置文件,在本例子中就是nacos-provider.properties,因为我们本地应用配置的spring.application.name=nacos-provider,在实际开发中,往往会有多个配置文件,那么如何同时加载多个配置文件中的配置内容呢?

    首先,我们在public命名空间下再新建两个配置文件:

    # redis.properties
    redis.server=127.0.0.1
    
    # mq.properties
    mq.nameserver=localhost
    

    同时,我们需要在本地项目的bootstrap.properties配置文件中增加如下的配置内容:

    spring.cloud.nacos.config.ext-config[0].data-id=redis.properties
    spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
    spring.cloud.nacos.config.ext-config[0].refresh=true
    
    spring.cloud.nacos.config.ext-config[0].data-id=mq.properties
    spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
    spring.cloud.nacos.config.ext-config[0].refresh=true
    

    对应的yml配置形式为:

    spring:
      cloud:
        nacos:
          config:
            extension-configs:
              - refresh: true
                group: DEFAULT_GROUP
                data-id: redis.properties
              - refresh: true
                group: DEFAULT_GROUP
                data-id: mq.properties
    

    然后,修改我们的controller,引用nacos服务器上的不同配置文件里面的配置项:

    @RefreshScope
    @RestController
    public class ConfigController {
    
        @Value("${provider.name}")
        private String providerName;
        @Value("${redis.server}")
        private String redisServer;
        @Value("${mq.nameserver}")
        private String mqServer;
    
        @GetMapping("/getDevConfig")
        public String getDevConfig() {
            return this.providerName + "/" + this.redisServer + "/" + this.mqServer;
        }
    
    }
    

    重启应用后,就能成功访问不同配置文件里面的配置项了。

    2.4 配置文件的分组区分

    如上我们注意到,分组Group一直都是DEFAULT_GROUP,其实我们可以在不同的Group里面创建相同名称的配置文件。比如在微服务环境中,多个微服务组件都有redis.properties的配置文件,那么如何区分哪个微服务该使用哪个Group下面的配置文件呢,其实也很简单,只要在配置文件中指定Group即可。

    本实例比较简单,就不演示了,其实对于同一个应用也可以读取不同Group下面的配置文件配置内容,我们完全也可以用Group来作为dev、stg和prd的区分。

    总之,Nacos为我们提供了三个维度来做区分,即profile、namespace和Group,开发者可以灵活应用来做自己想要的区分。

    2.5 共享配置

    很多时候,多个微服务中有相同的配置内容,比如大家连结的是同一个redis服务,同一个mq服务,那么就需要在各自的配置文件中都写上相同的配置内容,显得比较繁琐,我们完全可以将这些共同的配置内容抽取出来,形成另一个配置文件,然后大家共享它。

    比如,我们在public命名空间下新建DEFAULT_GROUP的配置文件share.properties

    provider.share=share123
    

    然后本地配置文件中新增如下配置内容:

    # 如果有多个共享配置文件,相互之间用逗号分隔即可
    spring.cloud.nacos.config.shared_dataids: share.properties
    spring.cloud.nacos.config.refreshable-dataids: share.properties
    

    然后在Controller中增加共享配置的读取内容,此处就省略了,重启应用就可以生效了。

    注意,如果共享配置不是DEFAULT_GROUP下面的,就不能使用如上的方式,而是采用2.3节中讲述的方式。

    2.6 配置内容的优先级

    有些时候,我们在加载的配置文件中都配置了同一个配置项的值,而且相互之间都不相同,那么本地应用最终以哪个配置文件中的内容为准呢?

    • A:使用spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extensionspring.cloud.nacos.config.group这几个参数拼接出来的配置文件;
    • B:使用2.3节中extension-configs指定的配置间件;
    • C:使用2.5节中共享配置指定的配置文件;
    • D:本地配置的配置内容;

    优先级顺序为:D>A>B>C

    相关文章

      网友评论

        本文标题:Nacos使用入门

        本文链接:https://www.haomeiwen.com/subject/rzrqpltx.html