Spring Cloud Alibaba系列(一):手把手教你使用Nacos(实践篇)

由于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版本


image.png

笔者使用的是mac电脑,所以下载的是 [nacos-server-2.0.2.tar.gz]

image.png

解压压缩包

image.png

3. 启动Nacos

打开终端,进入到解压后的bin目录中

image.png

Nacos启动模式有单机模式和集群模式,在测试环境下我们以单机模式启动。执行以下命令,以单机模式启动

sh  startup.sh -m standalone 

如果出现以下内容,说明启动成功


image.png

4. 登录Nacos

启动成功后,在浏览器中输入http://127.0.0.1:8848/nacos/#/login,然后可以访问到如页面表示启动成功。

账号:nacos
密码:nacos
image.png

登录成功后,进入到以下页面

image.png

5. 停止Nacos

进入安装包的bin目录,执行以下命令,停止Nacos

sh shutdown.sh

出现以下内容,说明停止成功


image.png

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进行安装

image.png
  1. 安装后,重启IDEA。在新建工程的面板左侧找到 Alibaba Java Initializer,选择工程 SDK 1.8,点击下一步;


    image.png

2.选择工程元数据,输入maven坐标,点击下一步;

image.png
  1. 左侧边栏是可以引入的工具,左侧栏选择Spring Cloud Alibaba,勾选Nacos Service Discovery和Nacos Configuration后,点击下一步;
image.png
  1. 选择项目的存储路径后,点击finish完成。
6.2 新建provider-8081项目
  1. 按照上面的步骤创建provider-8081项目,项目结构如下
  1. 完整的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>


  1. 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 {
}

  1. 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

  1. 启动项目,如果启动日志出现以下记录,说明注册成功
 nacos registry, DEFAULT_GROUP provider-8081 172.18.41.106:8081 register finished
image.png
  1. 查看Nacos管理界面,发现已经成功注册了provider-8081
image.png
6.3 新建provider-8081项目
  1. 同provider-8081项目,新增consumer-8091项目,项目结构如下
image.png
  1. 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>

  1. 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


  1. 启动项目,注册成功
image.png
image.png
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的拼接格式:{prefix} -{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

  1. pom.xml引入以下依赖
      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. 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=

  1. 新增测试接口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;
    }
}

image.png
  1. Nacos 管理界面,新增配置
image.png
image.png
image.png
  1. 测试接口, 成功获取到dev的配置
image.png

如果修改配置,可以实时刷新

image.png
image.png
  1. 回滚配置
image.png
image.png

参考:
https://blog.csdn.net/qq_42200163/article/details/109711035

https://www.cnblogs.com/crazymakercircle/p/14231815.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容