Spring Cloud Alibaba 整合 Nacos

319 阅读2分钟

写在最前

项目 GitHub 地址 mingyue-springcloud-learning 【mingyue-springcloud-user、mingyue-springcloud-member】

阅读推荐

版本声明

spring-boot: 2.7.5
spring-cloud: 2021.0.5
spring-cloud-alibaba: 2021.0.4.0

nacos: 2.1.2

Nacos 简介

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

  • Spring Cloud Alibaba Nacos Discovery,可基于 Spring Cloud 的编程模型快速接入 Nacos 服务注册功能。

  • Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。

Nacos 下载

Nacos 的获取和启动方式可以参考 Nacos 官网

本文使用 Nacos 2.1.1

版本选择

1.通过 pom.xml 文件依赖项,spring cloud alibaba 坐标 artifactId,进入 spring cloud alibaba 的 pom.xml 文件

 <!-- spring cloud alibaba 依赖 -->
<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>

2.查看 nacos.client.version,最低推荐 2.0.4 版本。截至目前推荐的稳定版本为 2.1.1

<properties>
    <maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
    <sentinel.version>1.8.5</sentinel.version>
    <maven-gpg-plugin.version>3.0.1</maven-gpg-plugin.version>
    <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
    <flatten-maven-plugin.version>1.2.7</flatten-maven-plugin.version>
    <revision>2021.0.4.0</revision>
    <nacos.client.version>2.0.4</nacos.client.version>
    <seata.version>1.5.2</seata.version>
    <spring.context.support.version>1.0.11</spring.context.support.version>
</properties>

Window 安装启动

解压 nacos-server-2.1.1.zip,进入 nacos-server-2.1.1\nacos\bin 目录

# bin 目录打开 cmd  直接双击打开是集群模式
startup.cmd -m standalone

启动成功后访问:http://127.0.0.1:8848/nacos/#/login

用户名密码
nacosnacos

image-20221118162757894

Docker 安装

推荐使用 Docker 安装

本项目提供了 docker-compose 基础环境安装

进入 docker 目录,执行 docker-compose up -d,启动成功后访问:http://127.0.0.1:8848/nacos/#/login

docker
└──	mysql
	└──	db
		└── nacos-mysql.sql
	└── dockerfile
└──	nacos
	└──	conf
		└── application.properties
	└── dockerfile
└──	docker-compose.yml

服务注册/发现: Nacos Discovery

服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos。

添加 pom 文件依赖

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

bootstrap.yml 添加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: ip:port

开启服务注册发现功能

@EnableDiscoveryClient
@SpringBootApplication
public class MingYueUserApplication {

	public static void main(String[] args) {
		SpringApplication.run(MingYueUserApplication.class, args);
	}

}

启动服务

这个时候你就可以在 Nacos 的控制台上看到注册上来的服务信息了。

image-20221122141814774

调用 Nacos 注册的服务

Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用。

Consumer 应用可能还没像启动一个 Provider 应用那么简单。因为在 Consumer 端需要去调用 Provider 端提供的 REST 服务。例子中我们使用最原始的一种方式,即显示的使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问。

编写 Consumer

import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 用户接口
 *
 * @author Strive
 */
@RestController
@RequestMapping("/memberNacos")
@RequiredArgsConstructor
public class MemberNacosController {

	private final LoadBalancerClient loadBalancerClient;

	@GetMapping("/userInfo")
	public String getUserNacos() {
		// 使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
		ServiceInstance serviceInstance = loadBalancerClient.choose("mingyue-springcloud-user");
		String url = String.format("http://%s:%s/userNacos/info", serviceInstance.getHost(), serviceInstance.getPort());
		System.out.println("request url:" + url);

		RestTemplate restTemplate = new RestTemplate();

		return restTemplate.getForObject(url, String.class);
	}

}

引入 loadbalancer

<!-- SpringCloud Loadbalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

启动服务,测试接口

curl --location --request GET 'http://127.0.0.1:8100/memberNacos/userInfo' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8100' \
--header 'Connection: keep-alive'

返回数据:

{
    "userNick": "none",
    "username": "none"
}

配置管理: Nacos Config

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

使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。

添加 pom 文件依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

bootstrap.yml 添加配置

在运行此 NacosConfigApplication 之前, 必须使用 bootstrap.yml 配置文件来配置 Nacos Server 地址。

spring:
  profiles:
    active: @profiles.active@
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yaml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

Naocs 添加配置

DataId 默认使用 spring.application.name 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 mingyue-springcloud-user-mingyue.yaml, GROUP 为 DEFAULT_GROUP。

如果需要切换环境,只需要更改 ${spring.profiles.active} 参数配置即可!

此案例中我们通过 spring.profiles.active=<profilename> 的方式写死在配置文件中,而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过 -Dspring.profiles.active=<profile> 参数指定其配置来达到环境间灵活的切换。

image-20221123140941289

录入以下配置,点击 发布 生效。

server:
  port: 8200

user:
  username: Strive
  userNick: 小小程

添加测试接口

/**
 * 用户接口
 *
 * @author Strive
 */
@RefreshScope
@RestController
@RequestMapping("/userNacos")
public class UserNacosController {

	@Value("${user.username:none}")
	private String username;

	@Value("${user.userNick:none}")
	private String userNick;

	@GetMapping("/info")
	public Map<String, String> info() {
		HashMap<String, String> userInfo = MapUtil.newHashMap();

		userInfo.put("username", username);
		userInfo.put("userNick", userNick);

		return userInfo;
	}

}

启动项目,访问接口

curl --location --request GET 'http://127.0.0.1:8200/userNacos/info' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8200' \
--header 'Connection: keep-alive'

返回数据

{"userNick":"小小程","username":"Strive"}

动态配置

Nacos Config 默认支持配置的动态更新,可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新

image-20221123142230984

编辑完,点击 发布 生效,再次访问接口查看是否生效!

user:
  username: MingYue
  userNick: 小小猪

后台会有日志打印:

...
o.s.boot.SpringApplication               : The following 1 profile is active: "mingyue"
o.s.boot.SpringApplication               : Started application in 0.297 seconds (JVM running for 160.784)
o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [user.userNick, user.username]

Tips

Nacos 主要的功能介绍完了,当然 Nacos 功能远不止这些,授人以鱼不如授人以渔

3. Spring Cloud Alibaba Nacos Discovery
    3.1. 服务注册/发现: Nacos Discovery
    3.2. 如何引入 Nacos Discovery 进行服务注册/发现
    3.3. 一个使用 Nacos Discovery 进行服务注册/发现并调用的例子
    3.3.1. Nacos Server 启动
    3.3.2. Provider 应用
    3.3.3. Consumer 应用
    3.4. Nacos Discovery 对外暴露的 Endpoint
    3.5. 如何开启权重路由
    3.5.1. Ribbon
    3.6. 关于 Nacos Discovery Starter 更多的配置项信息
4. Spring Cloud Alibaba Nacos Config
    4.1. 如何引入 Nacos Config 进行配置管理
    4.2. 快速开始
    4.2.1. Nacos 服务端初始化
    4.2.2. 客户端使用方式
    4.3. 基于 DataId 为 yaml 的文件扩展名配置方式
    4.4. 支持配置的动态更新
    4.5. 支持profile粒度的配置
    4.6. 支持自定义 namespace 的配置
    4.7. 支持自定义 Group 的配置
    4.8. 支持自定义扩展的 Data Id 配置
    4.9. 配置的优先级
    4.10. Nacos Config 对外暴露的 Endpoint
    4.11. 完全关闭 Nacos Config 的自动化配置
    4.12. 关于 Nacos Config Starter 更多的配置项信息