跳至主要內容

SpringCloud Alibaba Nacos

Zenghr大约 4 分钟SpringSpringCloud

SpringCloud Alibaba Nacos

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台

参考文档如下👇

Nacos 官网文档地址:https://nacos.io/zh-cn/docs/what-is-nacos.htmlopen in new window

Nacos Spring Cloud 快速开始:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.htmlopen in new window

Nacos 搭建

根据 Nacos 官网的版本选择描述中,可以根据 releasesopen in new window 中找到每个版本的介绍,Spring Cloud 版本对应关系可以查看 版本说明Wikiopen in new window

获取 Nacos

启动、关闭服务

Linux/Unix/Mac

# Linux/Unix/Mac
# 启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
sh shutdown.sh

Window

# 启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
shutdown.cmd

访问 Nacos 后台界面

当我们的 Nacos 运行起来时,我们可以访问 http://127.0.0.1:8848/nacosopen in new window 地址,输入账号密码:nacos 登录系统

XOjON2
XOjON2
ZoWv68
ZoWv68

环境说明

提示

Spring Cloud: 2020.0.3

Nacos: 14.2

spring-cloud-alibaba: 2021.1

关于 Nacos Spring Cloud 的详细文档请参看:Nacos Configopen in new windowNacos Discoveryopen in new window

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

服务发现是什么

服务提供者与服务消费者

  • 服务提供者:服务的被调用方(即:为其他微服务提供接口的微服务)
  • 服务消费者:服务的调用方(即:调用其他微服务接口的微服务)

服务发现原理

  • 服务发现机制就是通过一个中间件去记录服务提供者的ip地址,服务名以及心跳等数据(比如用mysql去存储这些信息),然后服务消费者会去这个中间平台去查询相关信息,然后再去访问对应的地址,这就是服务注册和服务发现。
  • 当用户地址发生了变化也没有影响,因为服务提供方修改了用户地址,在中间件中会被更新,当服务消费方去访问中间件时就能及时获取最新的用户地址,就不会出现用户地址发生变化导致服务找不到

启动服务发现

我们通过 spring-cloud-starter-alibaba-nacos-discovery 来实现服务注册和发现

注意

注意:如果你的 Spring Cloud 版本是 2020,那么 配置文件 bootstrap.yml 将会不起作用,会导致 nacos 的配置管理、服务发现等配置失效,需要添加依赖,详细方案请看 Spring Cloud 趟坑记录

添加依赖

<!-- nacos 服务发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

更多版本对应关系参考:版本说明 Wikiopen in new window

添加配置

通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上

bootstrap.yml 中配置 Nacos server 的地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: mall-order

注意:需要配置 application.nameopen in new window 属性,因为 Nacos 注册服务默认取 ${spring.application.nameopen in new window} 的值

添加注解

早期在启动类上需要加上 @EnableDiscoveryClient注解,现在已经可以不需要加了

Hpj6v9
Hpj6v9

启动配置管理

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

添加依赖

<!-- nacos 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

更多版本对应关系参考:版本说明 Wikiopen in new window

添加配置

bootstrap.properties 中配置 Nacos server 的地址和应用名

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  application:
    name: mall-order

提示

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

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

  • prefix: 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active: 即为当前环境对应的 profile,详情可以参考 Spring Boot文档open in new window注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension: 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

即,采用上述配置,nacosconfig 会从 Nacos Server 读取 Data Id 为 nacosconfig.yaml 的配置。

Nacos 控制台添加配置文件

在 Nacos 控制台添加一个新的配置,其中:

  • Data Id:nacosconfig
  • Group:DEFAULT_GROUP
  • 配置格式:YAML
JnlTaf
JnlTaf
hlPcGj
hlPcGj

读取 Nacos 变量配置

@RefreshScope
@RestController
public class ConfigController {
    private static final Logger logger = LoggerFactory.getLogger(ConfigController.class);

    @Value("${order.name:test}")
    private String name;

    @RequestMapping(value = "/config", method = RequestMethod.GET)
    public String index() {
        logger.info("get order config value from nacos: {}", name);
        return name;
    }
}
  • RefreshScope: 实现配置自动更新,在 nacos 中修改了配置,会动态更新数据