一、Nacos 简介
Nacos官方文档
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos可以用作服务注册中心,可以将服务信息存储到Nacos。当服务消费方服务需要调用注册中心的服务提供方服务时,可以从注册中心中获取所有服务提供方服务实例信息,再根据自身的负载均衡规则去决定调用哪个服务,常结合Ribbon和OpenFeign服务调用框架使用。同时,Nacos还可以用作配置中心,用来管理服务的配置信息,支持服务配置同步更新,配置历史管理、配置回滚和配置灰度发布等。Nacos还支持用户权限管理,可以限制用户对敏感配置文件的操作权限。
另外,Nacos可以使用配置中心这一特征与Gateway和Sentinal动态管理服务资源调度分配,动态调整每个服务实例的访问量。
二、基于Nacos的服务注册与发现
使用服务注册中心的好处是可以让服务消费方不用关注服务提供方所有实例信息,只需要知道服务提供方的域名就可以从注册中心获取所有服务实例的信息。
SpringCloud、SpringBoot、Nacos版本参照
1、配置服务提供者
- 添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
在spring-cloud-alibaba-nacos-discovery该依赖中已经包含Ribbon的依赖,可以直接使用Ribbon
- 创建bootstrap.properties文件并在该文件中添加配置
spring.application.name=goodsservice
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
服务端口号可以在该文件配置也可以在application.yml中配置,SpringBoot部分配置文件加载顺序为bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
- 添加服务发现客户端配置
@EnableDiscoveryClient
- 添加服务提供接口
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Value("${server.port}")
private String port;
@GetMapping("/port")
public String getServerPort() {
return String.format("server port is %s.", port);
}
}
5. 给该实例添加3个执行实例
在修改配置处添加执行实例
在配置页面中添加执行实例,并添加端口号配置
- 启动服务提供者实例和Nacos
查看服务列表发现已经有三个goodsservice服务实例已经注册到Nacos中
2、配置服务消费者
- 添加服务发现依赖配置,和服务提供者的一样
- 在bootstarp.properties文件中添加配置
spring.application.name=orderservice
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 添加服务发现客户端配置
@EnableDiscoveryClient
4.添加服务调用负载均衡配置
@Configuration
public class GoodsConsumerConfig {
@Bean
@LoadBalanced // 使用Ribbon,默认负载均衡规则为轮询
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
5.添加服务消费接口
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/goods/port")
public String getGoodsPort() {
return restTemplate.getForObject("http://goodsservice/goods/port", String.class);
}
}
6.参考服务提供者实例创建步骤添加2个服务消费者实例
7.启动服务消费者实例
调服务消费者接口
- 返回端口号9001
- 返回端口号9002
- 返回端口号9003
三、基于 Nacos 的配置管理
1、Nacos 如何对配置项进行区分并管理
Nacos在对配置进行管理时,会使用namespace、group和dataId一起来标记配置项集。namespace一般用于区分不同的环境,比如开发环境和测试环境;group一般用来区分不同的项目,dataId一般用来区分项目中不同的微服务。
dataId 的完整格式如下:
${spring.application.name}-${spring.profiles.active}.${file-extension}
如果没有配置spring.profiles.active,默认会服务对应的dataId为
${spring.application.name}.${file-extension}
2、单机启动Nacos
startup.cmd -m standalone
3、SpringBoot 使用 Nacos 配置中心和服务注册
参考服务注册配置说明添加服务注册配置后,添加服务配置中心依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
在bootstrap.properties中添加Nacos配置,无需配置服务对应的dataId,服务会根据spring.application.name和spring.profiles.active获取指定的dataId
spring.application.name=gateway #应用名
spring.cloud.nacos.config.server-addr=192.168.149.1:8848 #Nacos配置中心服务地址
spring.cloud.nacos.config.namespace=dev #Nacos配置所在命名空间
spring.cloud.nacos.config.group=xuecheng-plus-project #Nacos配置所在组
spring.cloud.nacos.config.file-extension=yaml #Nacos配置文件后缀
在Nacos UI 页面创建命名空间和配置文件
application.yml配置服务注册,shared-dataids和refreshable-dataids配置优先级大于bootstrap.properties
spring:
cloud:
nacos:
discovery:
namespace: dev
group: xuecheng-plus-project
config:
shared-dataids: common1.yaml,common2.yaml #公用配置文件
refreshable-dataids: common2.yaml #支持自动刷新的公用配置文件
如果需要支持服务配置随Nacos配置中心配置文件修改而更新,可在类中添加如下注释
@RefreshScope