阅读提醒:
- 本文面向的是有一定springboot基础者
- 本次教程使用的Spring Cloud Hoxton RELEASE版本
本文概览
- 什么是注册中心?
- 什么是配置中心?
- 如何在springcloud中使用Nacos?
前言
在使用nacos之前我们需要理解nacos在整个微服务架构中担任了什么样的角色,在微服务架构中,注册中心是非常核心的基础服务之一,在微服务流行之前就已经出现在分布式架构中。比如Dubbo,Dubbo在国内是比较流行的分布式架构,也是一个非常实用的框架,提供了比较完备的服务治理功能,而服务治理的实现主要依靠注册中心。
本文中用到的demo源码地址:https://github.com/WinterChenS/spring-cloud-hoxton-study
什么是注册中心?
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

列举一个比较简单的生活例子:
- 小明要给小红打电话,需要从通讯录(注册中心)中获取到小红的电话号码(服务地址);
- 小明根据通讯录中的电话号码拨打小红的电话号码(服务请求);
- 小红接通了电话,并随后完成了通话;
- 后面再拨打小红的电话号码可以通过电话保存的号码进行拨打(本地缓存);
nacos在整个微服务架构中充当了通讯录的角色,服务之间的调用,监控等都需要通过注册中心进行获取服务的地址端口的映射,并且一般服务端都会有本地缓存,下次请求之前会查询本地的服务映射信息,可以减少网络请求提高服务的吞吐量。
什么是配置中心?
配置中心其实理解起来很简单,就是字面意思,把服务的配置集中在配置中心,可以实现动态的修改,避免了每次修改配置文件都需要重新发布服务的尴尬。
下载nacos,并启动
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。下载地址https://github.com/alibaba/nacos/releases,下载最新版的2.0版本。
下载完成后,解压,在解压后的文件的/bin目录下,windows系统点击startup.cmd就可以启动nacos。linux或mac执行以下命令启动nacos。
sh startup.sh -m standalone
登陆页面:http://localhost:8848/nacos/ 登陆用户nacos,登陆密码为nacos。
jdk版本
- jdk: 1.8
- maven: 3.3.9
- nacos: 2.0
springcloud 和 springboot 版本
- springcloud: Hoxton.RELEASE
- springboot: 2.2.13.RELEASE
- springcloud-alibaba: 2.2.0.RELEASE
配置中心
首先我们新建一个springboot 基础项目,这里项目命名为:spring-cloud-hoxton-study
项目结构:
| 12
 3
 
 | -spring-cloud-hoxton-study|—spring-cloud-nacos-consumer
 |—pom.xml
 
 | 
父pom文件加入依赖(spring-cloud-hoxton-study):
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | <properties>
 <java.version>1.8</java.version>
 <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
 <spring-boot.version>2.2.13.RELEASE</spring-boot.version>
 <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
 </properties>
 <dependencyManagement>
 <dependencies>
 
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-dependencies</artifactId>
 <version>${spring-cloud.version}</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 
 
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-dependencies</artifactId>
 <version>${spring-boot.version}</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 
 
 <dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
 <version>${spring-cloud-alibaba.version}</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 </dependencies>
 </dependencyManagement>
 
 | 
子pom修改(spring-cloud-nacos-consumer):parent
| 12
 3
 4
 5
 
 | <parent><groupId>com.winterchen</groupId>
 <artifactId>spring-cloud-hoxton-study</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 </parent>
 
 | 
子pom加入依赖(spring-cloud-nacos-consumer):
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | <dependency><groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 
 <dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
 
 | 
注意:这里只是放了主要的maven依赖,如果需要查看全部的依赖,请查看demo的源码
创建配置:bootstrap.properties 或者 bootstrap.yml
bootstrap.properties
| 12
 3
 4
 5
 
 | spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 spring.application.name=winter-nacos-consumer
 
 spring.profiles.active=dev
 
 | 
bootstrap.yml
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | spring:cloud:
 nacos:
 config:
 server-addr: 127.0.0.1:8848
 file-extension: yaml
 application:
 name: winter-nacos-consumer
 profiles:
 active: dev
 
 | 
文中的:127.0.0.1:8848 就是上面搭建的nacos服务
之所以需要配置 spring.application.name是因为nacos默认获取配置文件是按照name作为dataId的
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
| 1
 | ${prefix}-${spring.profiles.active}.${file-extension}
 | 
- prefix 默认为 spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active即为当前环境对应的- profile,详情可以参考- Spring Boot文档。 注意:当- spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成- ${prefix}.${file-extension}
- file-exetension为配置内容的数据格式,可以通过配置项- spring.cloud.nacos.config.file-extension来配置。目前只支持- properties和- yaml类型。
在nacos配置中心创建配置文件

配置详情:
Data ID: winter-nacos-consumer-dev.yaml
Group: DEFAULT_GROUP
配置内容:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | server:port: 16011
 
 spring:
 cloud:
 nacos:
 discovery:
 server-addr: 127.0.0.1:8848
 
 test:
 config:
 refresh: true
 
 | 
自动刷新
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | @Api("nacos api")@RestController
 @RequestMapping("/nacos")
 @RefreshScope
 public class NacosController extends BaseController {
 
 @Value("${test.config.refresh:true}")
 private boolean refresh;
 
 @GetMapping("/")
 public CommonResult<Boolean> get() {
 return CommonResult.success(refresh);
 }
 
 }
 
 | 
如何测试
我们可以通过请求上面的接口: http://127.0.0.1:16011/nacos
返回的结果是:true
然后修改一下配置中心的:
| 12
 3
 
 | test:config:
 refresh: false
 
 | 
可以发现控制台的日志有打印:
| 1
 | 2021-07-27 11:25:13.973  INFO 17240 --- [8.25.36.41_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [test.config.refresh]
 | 
再请求一次就可以发现结果变成了:false
服务注册与发现

仍然使用上面的项目进行
添加依赖:
| 12
 3
 4
 5
 
 | <!-- Nacos 注册中心 --><dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
 
 | 
增加配置
以下是完整的配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | server:port: 16011
 
 spring:
 cloud:
 nacos:
 discovery:
 server-addr: 127.0.0.1:8848
 
 test:
 config:
 refresh: true
 
 | 
启动类增加:@EnableDiscoveryClient 以启用服务注册与发现
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})@EnableDiscoveryClient
 public class SpringCloudNacosApplication {
 
 public static void main(String[] args) {
 SpringApplication.run(SpringCloudNacosApplication.class, args);
 }
 
 }
 
 | 
接下来需要测试一下服务注册与发现的功能是否正常,所以我们需要复制原有的服务spring-cloud-nacos-consumer 并改名为:spring-cloud-nacos-provider
当前工程结构:
| 12
 3
 4
 
 | -spring-cloud-hoxton-study|—spring-cloud-nacos-consumer
 |—spring-cloud-nacos-provider
 |—pom.xml
 
 | 
spring-cloud-nacos-consumer 服务下的NacosController 增加方法:echo
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | @RestController@RequestMapping("/nacos")
 @RefreshScope
 public class NacosController {
 
 @Value("${test.config.refresh:true}")
 private boolean refresh;
 
 private final RestTemplate restTemplate;
 
 @Autowired
 public NacosController(RestTemplate restTemplate) {
 this.restTemplate = restTemplate;
 }
 
 @GetMapping("")
 public boolean get() {
 return refresh;
 }
 
 @GetMapping("/echo/{str}")
 public String echo(@PathVariable String str) {
 return restTemplate.getForObject("http://winter-nacos-provider/nacos/echo/" + str, String.class);
 }
 
 }
 
 | 
spring-cloud-nacos-provider 服务下的NacosController 增加方法:echo
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | @RestController@RequestMapping("/nacos")
 @RefreshScope
 public class NacosController {
 
 @Value("${test.config.refresh:true}")
 private boolean refresh;
 
 @GetMapping("")
 public boolean get() {
 return refresh;
 }
 
 @GetMapping("/echo/{string}")
 public String echo(@PathVariable String string) {
 return "Hello Nacos Discovery " + string;
 }
 
 }
 
 | 
开始测试:
测试之前需要给spring-cloud-nacos-provider 进行配置中心的配置:
- 修改bootstrap.yml的spring.application.name=winter-nacos-provider;
- 在配置中心新增配置文件:winter-nacos-provider-dev.yaml具体的配置如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | server:port: 16012
 
 spring:
 cloud:
 nacos:
 discovery:
 server-addr: 118.25.36.41:8848
 profiles:
 active: dev
 
 test:
 config:
 refresh: true
 
 | 
分别启动两个服务,然后调用接口: http://127.0.0.1:16011/nacos/echo/hello
请求的结果:

总结
本文介绍了springcloud如何使用nacos作为配置中心和注册中心,作为微服务中比较核心的两个基础功能,需要熟练的在实战中进行使用,后面也会陆续介绍如何与其他的组件进行组合使用。
上面使用的restTemplate进行服务的调用,这样显然在实际的使用当中是非常的不便利的,那么在实际应用中使用什么方式进行远程调用呢?下一篇将介绍如何使用open feign进行远程服务调用的。
源码地址
https://github.com/WinterChenS/spring-cloud-hoxton-study
参考文献:
Nacos Spring Cloud 快速开始