nacos配置与注册

Posted java学习坚持者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nacos配置与注册相关的知识,希望对你有一定的参考价值。

一、官方文档

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html


二、原理说明



三、实战演示

上一篇中建立了bank1工程演示nacos作为配置中心的使用,在本章中新建bank2工程,然后通过ServicID来请求bank1中的接口。


服务提供者bank1

1、添加依赖


  <!-- nacos注册中心-->

    <dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

        <version>2.2.1.RELEASE</version>

    </dependency>


2、新增注册中心配置


spring.application.name=bank2

server.port=8020

spring.profiles.active=dev


spring.cloud.nacos.username=nacos_bank1

spring.cloud.nacos.password=123456

spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57

spring.cloud.nacos.discovery.server-addr=localhost:8848

spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57


3、@EnableDiscoveryClient 开启服务发现


@Slf4j

@EnableDiscoveryClient

@SpringBootApplication

@RefreshScope

public class Bank1Application {


public static void main(String[] args) {

SpringApplication.run(Bank1Application.class, args);

log.info("bank1服务启动成功");

}

}


服务消费者者bank2

1、添加依赖

下面是我maven依赖配置。同样需要注意版本的对应关系。


 <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.2.5.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <groupId>com.laowan</groupId>

    <artifactId>spring-cloud</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>bank2</name>

    <description>bank2工程</description>

    <properties>

        <java.version>1.8</java.version>

        <skipTests>true</skipTests>

    </properties>

    <dependencies>

        <!--nacos配置中心-->

        <dependency>

            <groupId>com.alibaba.cloud</groupId>

            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

            <version>2.2.1.RELEASE</version>

        </dependency>

       <!-- nacos注册中心-->

        <dependency>

            <groupId>com.alibaba.cloud</groupId>

            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

            <version>2.2.1.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <optional>true</optional>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>



2、添加注册中心属性


spring.application.name=bank2

server.port=8020

spring.profiles.active=dev


spring.cloud.nacos.username=nacos_bank1

spring.cloud.nacos.password=123456

spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57

spring.cloud.nacos.discovery.server-addr=localhost:8848

spring.cloud.nacos.discovery.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57


说明:

这里采用和bank1中相同的用户nacos_bank1,配置的用户需要对对应的注册中心的命名空间具有读写权限。且注册中心配置成和bank1中相同值,因为经测试发现只有相同命名空间的服务之间,才能通过ServiceID进行识别。


3、@EnableDiscoveryClient 开启服务发现

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:


@Slf4j

@EnableDiscoveryClient

@SpringBootApplication

@RefreshScope

public class Bank2Application {

@LoadBalanced

@Bean

public RestTemplate restTemplate() {

return new RestTemplate();

}


public static void main(String[] args) {

SpringApplication.run(Bank2Application.class, args);

log.info("bank2服务启动成功");

}

}


配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。


声明了RestTemplate对象,并添加了@LoadBalanced注解。


4、调用bank1接口


@RestController

@RequestMapping("/config")

@RefreshScope

public class ConfigController {


    @Value("${bank.name}")

    private String bankName;


    @Autowired

    private RestTemplate restTemplate;


    @RequestMapping("/get")

    public String get() {

        return bankName;

    }


    @GetMapping(value = "/getBank1")

    public String getBank1() {

        return restTemplate.getForObject("http://bank1/config/get" , String.class);

    }

}



四、效果测试

1、启动bank1和bank2

在nacos控制台的服务列表中的bank1命名空间中,查看到服务名为bank1和bank2的2个服务。说明服务注册成功



2、通过ServcieID请求

请求bank2中的接口,调用bank1中/config/get接口来获取bank.name的属性。

请求链接:http://localhost:8020/config/getBank1

成功获取到bank1的属性。说明ServiceID为bank1的服务可以被bank2服务识别。


3、服务上线和下线

在bank1服务的详情界面,控制bank1服务下线。


再次请求http://localhost:8020/config/getBank1

这里需要注意:bank2服务从注册中心拉去的服务状态列表的list会有一定的时间的缓存。每隔一段时间重新拉取服务列表后,才会刷新bank1服务的本地状态,从而不能调用。所以测试的时候会发现虽然进行了bank1服务的下线操作,但是开始一段时间接口还是可以调用成功,稍等一会,bank1服务才会调用失败。



当控制服务bank1上线后,重新请求接口又能正常访问。


总结

采用nacos作为注册中心结合spring cloud使用非常简单。

主要有以下几步:

1、首先正确引入对应的maven依赖,需要注意jar包版本的对应关系。

2、配置nacos注册中心的相关属性,需要注意命名空间保持一致且配置的用户具有命名空间的读写权限。

3、启动类上添加@EnableDiscoveryClient开启服务发现

微服务之间的调用,本例中采用的是restTemplate。实际项目中更推荐采用Feign调用,由于非常简单,这里就不做演示。


需要注意的是,服务提供者和服务消费者配置的nacos命名空间一定要是同一个,否则尽管配置的用户具有多个命名空间的读写权限也不能识别,即不同命名空间的服务是不能相互识别的。



一、官方文档

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html


二、nacos环境说明

安装的nacos版本为NACOS2.0.0-BETA

没有采用默认的public命名空间。

新建命名空间bank1,并新建用户nacos_bank1,新建角色bank1_admin,在权限管理界面中,给角色bank1_admin绑定bank1命名空间的读写权限。




三、作为配置中心使用

新建spring boot工程bank1,测试Nacos作为配置中心的使用。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。


1.添加依赖:

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

    <version>${latest.version}</version>

</dependency>


注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。


更多版本对应关系参考:版本说明 Wiki


spring-cloud-starter-alibaba-nacos-config和spring boot的版本对应关系,我更推荐直接通过maven仓库查看,更加直接明了。

在maven仓库官网搜索spring-cloud-starter-alibaba-nacos-config。

这里我选择了下载次数最多的版本2.2.1.RELEASE。然后查看下面的依赖。


spring-cloud-starter-alibaba-nacos-config 2.2.1.RELEASE的版本依赖。


所以spring-boot-starter-parent版本,我选择了2.2.5.RELEASE。

完整的依赖为:


 <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.2.5.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <groupId>com.laowan</groupId>

    <artifactId>spring-cloud</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>bank1</name>

    <description>实战spring cloud</description>

    <properties>

        <java.version>1.8</java.version>

        <skipTests>true</skipTests>

    </properties>

    <dependencies>

        <!--nacos配置中心-->

        <dependency>

            <groupId>com.alibaba.cloud</groupId>

            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

            <version>2.2.1.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <optional>true</optional>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>


注意:这里的版本依赖关系非常重要,不然项目启动会直接出现jar包冲突的异常,导致启动失败。


2、bootstrap.properties配置


spring.application.name=bank1

server.port=8010

spring.profiles.active=dev

        

spring.cloud.nacos.username=nacos_bank1

spring.cloud.nacos.password=123456

spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57


说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

这里的spring.cloud.nacos.config.namespace指定的属性就是对应Nacos 配置管理 中的命名空间bank1的id值:a284481e-b623-4c7d-a65a-e9009cba5f57。


注意:

这里一定要在bootstrap.properties中配置配置中心的相关属性,而不能直接在application.properties中配置。原因是bootstrap.properties会在application.properties之前加载。具体bootstrap和application的区别自己可以网上找资料查看下。


这里用户命和密码需要配置在bootstrap.properties中才能生效,如果配置在application.properties中,启动时读取不到对应的属性。

这样因为这里的认证类SecurityProxy中读取的属性是BootstrapPropertySource 。根据名称就知道,这里加载的是Bootstrap中的属性。


spring.cloud.nacos.username

spring.cloud.nacos.password

1

2




3、在命名空间bank1下添加配置文件

在 Nacos Spring Cloud 中,dataId 的完整格式如下:


${prefix}-${spring.profiles.active}.${file-extension}

1

说明:

1、prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

2、spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}.prefix.{file-extension}

3、file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。


选择bank1命名空间,点击加号➕



新建配置文件:

其中Data ID为bank1-dev.properties 需要注意Data ID的命名规则。

Group一般都是采用默认值。

配置格式采用Properties。个人习惯,不是太喜欢使用YAML,格式比较难调整,格式错误难发现,属性搜索也不是很方便。

配置内容:bank.name=bank1 dev



4、通过@Value使用属性


@RestController

@RequestMapping("/config")

public class ConfigController {


    @Value("${bank.name}")

    private String bankName;


    @RequestMapping("/get")

    public String get() {

        return bankName;

    }

}


5、添加@RefreshScope注解


@Slf4j

@SpringBootApplication

@RefreshScope

public class Bank1Application {


public static void main(String[] args) {

SpringApplication.run(Bank1Application.class, args);

log.info("bank1服务启动成功");

}

}


四、效果测试

1、项目启动

2021-03-19 17:31:29.285  INFO 45872 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-bank1-dev.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1,DEFAULT_GROUP'}]

2021-03-19 17:31:29.305  INFO 45872 --- [           main] com.laowan.bank1.Bank1Application        : The following profiles are active: dev



在启动日志中发现,同时加载了bootstrapProperties-bank1-dev.properties和bootstrapProperties-bank1.properties的文件。


注意:

bank1.properties会先于bank1-dev.properties被程序加载,后加载的属性会覆盖先加载的属性。所以2个文件中如果有相同的属性,最终bank1-dev.properties中的才会生效。

利用这个特性,我们一般会存放一些通用的公共属性放在bank1.properties文件中。


示例:


bank1.properties 公共属性

bank1-dev.properties 开发环境属性

bank1-test.properties 测试环境属性

bank1-pro.properties 生产环境属性


2、获取配置

请求链接:http://localhost:8010/config/get


成功获取到配置。


3、刷新配置

在nacos中修改配置:


bank.name=bank1 dev  update

1

不重启项目,直接重新请求http://localhost:8010/config/get获取配置。发现配置刷新成功。



五、思考

1、多环境如何共用一个nacos服务?


相同命名空间:

简单的使用,只需在相同命名空间下利用Data ID中的spring.profiles.active属性来区分即可。

缺点主要是访问权限不能放开控制。多个环境的文件在同一个命名空间,容易出现误操作。


不同命名空间:

可以如下,分别建立名称为dev,test,pro的命名空间。这种情况下,可以忽略spring.profiles.active属性的作用,利用命名空间来区分不同的属性环境。


项目中bootstrap.properties的配置文件对应关系:

公共属性配置:


dev属性配置:


bootstrap-dev.properties的配置说明:

spring.cloud.nacos.username=nacos-dev(dev环境对应的用户)

spring.cloud.nacos.password=123456

spring.cloud.nacos.config.namespace=dev对应命名空间id

1

2

3

4

2、多环境下怎么独立使用各自的nacos服务?

实际项目中,开发环境,测试环境,生产环境一般都有比较严格的网络隔离和访问权限控制,同时为了避免属性误操作,不可能共用同一个nacos服务。

可以参考上面不同命名空间的处理:


3、nacos的命名空间是以项目为纬度,还是以开发环境、测试环境等环境为纬度控制好?

由于考虑到真实环境下,开发环境,生产环境等不同配置环境一般不会使用同一套nacos服务,往往都是各自独立部署。

所以同一个项目,利用命名空间来分环境控制配置属性这样的使用场景非常有限,意义不是很大。所以建议命名空间以项目为纬度就可以了。


总结

本文主要介绍了Nacos作为配置中心在Spring boot项目中的使用。

主要需要注意一下几点:

1、spring-cloud-starter-alibaba-nacos-config和Spring boot的版本依赖关系。如果版本对应出错,会出现依赖冲突问题。

2、注意在Nacos控制台添加配置时,Data ID的命名规则:p r e f i x − {prefix}-prefix−{spring.profiles.active}.${file-extension}

3、Nacos的权限管理的粒度是命名空间级别。一定要注意配置的用户具有对应命名空间的读写权限。

4、在拓展思考中,说明了多环境下Nacos作为配置中心的使用方式。


以上是关于nacos配置与注册的主要内容,如果未能解决你的问题,请参考以下文章

nacos简介以及作为注册/配置中心与Eurekaapollo的选型比较

nacos配置与注册

什么是Nacos?Nacos注册配置中心介绍

SpringCloud Alibaba——Nacos服务注册与配置中心(三Nacos持久化配置 & 集群搭建)

SpringCloud Alibaba——Nacos服务注册与配置中心(三Nacos持久化配置 & 集群搭建)

71 nacos 实现微服务的注册与发现