由于Eureka的停更,导致新的替代产品Spring Cloud Alibaba逐渐受到重视,从本文开始,笔者将和大家一起学习Spring Cloud Alibaba全家桶。
本文示例项目地址:https://gitee.com/zhaowenyi/spring-cloud-alibaba-demo
1. 认识Nacos
Nacos官网 : https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos Wiki: http://github.com/alibaba/nacos/wiki
Nacos是Spring Cloud Alibaba中命名与配置中心,其中的Na就是Naming服务命名注册的缩写,Co就是Cofiguration配置的缩写。因此Nacos的功能相当于Eureka和Spring Cloud Config的组合。Eureka的停更,导致众多开发者不得不选择新的墙头,正好阿里的Nacos经历了多年的历练,成功地经受住了大流量,高并发的考验,成为了新的翘楚。
本文将从安装到配置详细的介绍Nacos的基本使用。
2. 下载Nacos
操作系统: Mac
Maven: 3.6.3
Nacos Server :2.0.2
Spring Boot: 2.3.7.RELEASE
Spring Cloud Alibaba: 2.2.2.RELEASE
Nacos相当于一个软件,需要下载安装nacos-server。Nacos Server下载地址
https://github.com/alibaba/nacos/releases
本文使用2.0.2版本
笔者使用的是mac电脑,所以下载的是 [nacos-server-2.0.2.tar.gz]
解压压缩包
3. 启动Nacos
打开终端,进入到解压后的bin目录中
Nacos启动模式有单机模式和集群模式,在测试环境下我们以单机模式启动。执行以下命令,以单机模式启动
sh startup.sh -m standalone
如果出现以下内容,说明启动成功
4. 登录Nacos
启动成功后,在浏览器中输入http://127.0.0.1:8848/nacos/#/login,然后可以访问到如页面表示启动成功。
账号:nacos
密码:nacos
登录成功后,进入到以下页面
5. 停止Nacos
进入安装包的bin目录,执行以下命令,停止Nacos
sh shutdown.sh
出现以下内容,说明停止成功
6. 以Nacos作为注册中心
服务的注册与发现都是在nacos server端,每个微服务注册到nacos server端即可,因此我们不需要像Eureka一样新增一个Eureka Server项目。在此例中,我们将创建两个项目,一个是服务提供者provider-8081,一个服务消费者consumer-8091。
6.1 IDEA安装插件Alibaba Cloud Toolkit
preferences -> plugins -> 搜索Alibaba Cloud ,选择Alibaba Cloud Toolkit进行安装
-
安装后,重启IDEA。在新建工程的面板左侧找到 Alibaba Java Initializer,选择工程 SDK 1.8,点击下一步;
2.选择工程元数据,输入maven坐标,点击下一步;
- 左侧边栏是可以引入的工具,左侧栏选择Spring Cloud Alibaba,勾选Nacos Service Discovery和Nacos Configuration后,点击下一步;
- 选择项目的存储路径后,点击finish完成。
6.2 新建provider-8081项目
- 按照上面的步骤创建provider-8081项目,项目结构如下
- 完整的pom.xml内容如下,其中主要是spring-cloud-starter-alibaba-nacos-discovery这个依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.elio.springcloud.alibaba.demo</groupId>
<artifactId>provider-8081</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-8081</name>
<description>Demo project for Spring Cloud Alibaba</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.4.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.elio.springcloud.alibaba.demo.Provider8081Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- NacosDiscoveryConfiguration 主要是启用Nacos Client,作为客户端注册到服务中心
package com.elio.springcloud.alibaba.demo.nacosdiscovery;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;
/**
* @author <a href="mailto:chenxilzx1@gmail.com">theonefx</a>
*/
@EnableDiscoveryClient
@Configuration
public class NacosDiscoveryConfiguration {
}
- application.properties内容如下,主要是配置Nacos Server的地址
# 应用名称
spring.application.name=provider-8081
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
server.port=8081
- 启动项目,如果启动日志出现以下记录,说明注册成功
nacos registry, DEFAULT_GROUP provider-8081 172.18.41.106:8081 register finished
- 查看Nacos管理界面,发现已经成功注册了provider-8081
6.3 新建provider-8081项目
- 同provider-8081项目,新增consumer-8091项目,项目结构如下
- pom.xml完整内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.elio.springcloud.demo</groupId>
<artifactId>consumer-8091</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-8091</name>
<description>Demo project for Spring Cloud Alibaba</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.elio.springcloud.demo.Consumer8091Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- application.properties内容如下
# 应用名称
spring.application.name=consumer-8091
# 应用服务 WEB 访问端口
server.port=8091
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
- 启动项目,注册成功
6.4 总结
至此,我们已经成功将两个项目成功注册到Nacos上。通过注册中心,服务可以拉取到别的服务的相关信息。
7 以Nacos作为配置中心
7.1 相关概念
- profile概念
Java项目中的配置文件一般分为多个环境配置,生产环境(prod),测试环境(test),开发环境(dev),然后通过spring.profiles.active可以指定使用哪个环境的配置。比如sspring.profiles.active=dev将会读取application-dev.properties的配置内容。
当项目配置文件众多,修改了配置文件内容还需要重启服务,导致配置文件难以管理。Nacos Config的作用就是将这些配置文件集中管理起来,从而可以统一管理并且可以修改实时刷新。
- NameSpace概念
NameSpace 默认是public,可以区分不同的环境,比如dev,test,prod等。
- Group概念
如果配置文件名相同,可以用Group区分,因此可以区分不同项目中,配置文件名相同的配置。Group 默认为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 来配置,当配置项太多或者有重名时,可以通过分组来方便管理。
- Data Id概念
在使用Nacos Config的过程中,数据存储在Data Id下面,一个Data Id对应一个profile文件。
Data ID的拼接格式:{spring.profiles.active} . ${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置
spring.profiles.active 取 spring.profiles.active 的值,即为当前环境对应的 profile
file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置
7.2 引入Nacos Config依赖
接下来的例子都以provider-8081为例,来介绍如何使用Nacos Config
- pom.xml引入以下依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- application.properties新增以下配置
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.cloud.nacos.config.prefix= ${spring.application.name}
# 默认是DEFAULT_GROUP
# spring.cloud.nacos.config.group=
- 新增测试接口com/elio/springcloud/alibaba/demo/controller/TestController.java
package com.elio.springcloud.alibaba.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName : TestController
* @Description : 测试
* @Author : zhaowenyi
* @Date: 2021/06/23
*/
@RestController
public class TestController {
@Value("${nacos.config.test:hello world}")
private String testValue;
@GetMapping(value = "/hello")
public String hello() {
return testValue;
}
}
- Nacos 管理界面,新增配置
- 测试接口, 成功获取到dev的配置
如果修改配置,可以实时刷新
- 回滚配置
参考:
https://blog.csdn.net/qq_42200163/article/details/109711035