基于nacos和gateway搭建微服务管理平台详细教程

前置说明-安装环境:

java: 1.8
maven: 3.9.9
开发工具:IntelliJ IDEA 2022.2.3 【以下简称idea】

如果cmd命令行输入以下命令查看到有相应输出则表示环境已安装

第一步:从无到有搭建spring boot2.7.18,并引入spring cloud

方法一:使用 Spring Initializr 初始化项目

Spring Initializr 是一个在线工具,可帮助你快速生成 Spring Boot 项目的基本结构

步骤 1:访问 Spring Initializr 网站

打开浏览器,访问 https://start.spring.io/。

步骤 2:配置项目信息

在该页面上,按照以下要求进行配置:

Project:选择 Maven Project 或 Gradle Project,这里以 Maven Project 为例。

Language:选择 Java。

Spring Boot:输入 版本号。

Group:通常是公司或组织的域名倒序,例如 com.example。

Artifact:项目的唯一标识符,例如 demo。

Name:项目名称,默认与 Artifact 相同。

Description:项目描述,可以简单说明项目的用途。

Package name:默认根据 Group 和 Artifact 生成,例如 com.example.demo。

Packaging:选择 Jar。

Java:选择合适的 Java 版本

由于该网站选不到Spring boot2.7.18版本,我将选择用idea搭建一个空的项目进行配置,当然如果非要使用网站生产也可以,下载后解压文件修改对应的版本号即可使用

方法二:使用idea创建空项目

步骤 1:打开idea:选择左上角File-New-Project

步骤 2:步骤一点完后会出现如图所属弹窗,按弹窗内容选择填写即可完成空项目的搭建

项目结构说明

步骤 3:配置 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.cxm</groupId>
    <artifactId>spring-cloud-nacos</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
更新Maven依赖

步骤 4:创建主应用类,Main可以删掉

代码如下
复制代码
package org.cxm;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

步骤 5:创建控制器类

为了方便管理,一般会将每个分支进行文件汇总,如下添加Controller控制层文件夹,所有的控制层文件都放在此文件夹内
新增控制器类TestController,并添加代码如下
复制代码
package org.cxm.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("get")
    public String get() {
        return "我的第一个项目!!!";
    }

}

步骤 6:运行idea,启动项目

启动后浏览器访问IP:端口【端口默认8080】即可看到控制器类的代码

至此Spring boot2.7.18并引入Spring cloud完成

第二步:集成spring cloud nacos

Nacos 可以作为服务注册与发现中心以及配置中心使用,下面从添加依赖、配置 Nacos、服务注册与发现、配置管理等方面展开说明。

1、启动 Nacos 服务

首先要确保 Nacos 服务已启动,你可以从 Nacos 官方 GitHub 仓库 下载 Nacos 服务端,下载地址:【发布历史 | Nacos 官网 】点击对应版本号即可下载,解压后在命令行中执行以下命令启动:
复制代码
Linux下进入到bin目录下执行如下命令,lunix如果开了防火墙的话,需开放两个端口8848,9848【9848 端口:在 Nacos 集群模式下,该端口用于 Nacos 节点之间的 gRPC 通信,主要负责数据同步、心跳检测等操作,以此保证集群中各个节点的数据一致性。】

# Linux/Unix/Mac
sh startup.sh -m standalone

Windows下进入bin目录下cmd执行如下命令,或者编辑startup.cmd文件,找到set MODE=,将内容改为set MODE="standalone",保存后,双击点击startup.cmd即可完成nacos服务端启动

# Windows
cmd startup.cmd -m standalone

启动完成后浏览器打开链接即可看到nacos服务端: http://localhost:8848/nacos/index.html

补充:使用源码进行启动-编译-打包(如需对nacos进行定制开发,可以使用源码修改)

2、集成nacos,添加依赖如下

复制代码
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.cxm</groupId>
    <artifactId>spring-cloud-nacos</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- spring-cloud相关依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring-cloud-alibaba 相关依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.5.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- 测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- Spring Cloud Nacos Discovery 依赖 用于服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos Config 依赖 用于配置配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- spring-cloud-starter-bootstrap 解析bootstrap.yml文件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
</project>

3、配置 Nacos 地址

如图所示添加如下两个配置文件

application.yml 添加配置如下

复制代码
server:
  port: 8081 # 指定服务端口,如果不指定默认就是8080

spring:
  application:
    name: springCloudNacos # 指定服务名称,项目启动后注册到nacos的名称就是这个

bootstrap.yml 添加配置如下,用于测试nacos配置自动刷新

复制代码
spring:
  application:
    name: springCloudNacos
  cloud:
    nacos:
      #服务注册与发现
      discovery:
        server-addr: http://127.0.0.1:8848
        group: DEFAULT_GROUP #默认分组
#        username: #nacos用户名
#        password: #nacos密码
      #服务配置中心
      config:
        server-addr: http://127.0.0.1:8848 # Nacos服务端地址
        group: DEFAULT_GROUP #默认分组
        file-extension: yml #配置文件后缀名
        refresh-enabled: true #开启自动刷新配置
#        prefix: #配置文件前缀
#        username: #nacos用户名
#        password: #nacos密码

#下面配置用于测试nacos的配置自动刷新内容获取
common:
  username: cxm
  age: 18

启动类修改如下

复制代码
package org.cxm;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient //nacos服务注册与发现
public class SpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudApplication.class,args);
    }
}

修改TestController 文件如下

复制代码
package org.cxm.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/test")
@RefreshScope  //主要用于支持配置的动态刷新
public class TestController {

    @Value("${common.username}")
    private String username;

    @Value("${common.age}")
    private Integer age;

    @GetMapping("/get")
    public String get() {
        return "我的第一个项目!!!";
    }

    @GetMapping("/getMap")
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>();
        map.put("username", username);
        map.put("age", age);
        return map;
    }
}

启动服务测试

服务启动后可看到日志打出来的配置信息名称和分组

进入nacos系统可以看到服务已经注册进来了
浏览器访问刚刚控制层写的接口,可以看到bootstrap.yml配置的信息被获取到了

4、配置管理

在配置管理 -> 配置列表中创建一个新的配置
Data ID 为 springCloudNacos.yml(Data ID 默认规则为 {spring.application.name}.{spring.cloud.nacos.config.file-extension}),配置内容如下:
再次刷新刚才接口可看到输出的内容已从nacos配置中获取,如果继续修改nacos配置文件,则获取的信息还会立马更新

至此集成spring cloud nacos已经完成

第三步:集成spring cloud gateway网关服务

集成 Spring Cloud Gateway,实现路由转发等功能。整个集成过程主要包括创建项目、添加依赖、配置路由规则、测试等步骤。

1、按照第一步的方法创建一个空项目为spring-cloud-gateway

2、添加pom依赖如下

复制代码
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.cxm</groupId>
    <artifactId>spring-cloud-gateway</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- spring-cloud相关依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring-cloud-alibaba 相关依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.5.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- 测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- Spring Cloud Nacos Discovery 依赖 用于服务注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- Spring Cloud Nacos Config 依赖 用于配置配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- spring-cloud-starter-bootstrap 解析bootstrap.yml文件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <!-- Spring Cloud Gateway网关,实现路由转发等 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- spring-cloud-starter-loadbalancer 负载均衡组件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
</project>

3、创建启动类,代码如下,删除Main类

复制代码
package org.cxm;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

4、创建yml配置文件

application.yml内容如下

复制代码
server:
  port: 8080
spring:
  application:
    name: SpringCloudGateway

bootstrap.yml内容如下

复制代码
spring:
  application:
    name: SpringCloudGateway
  cloud:
    nacos:
      #服务注册与发现
      discovery:
        server-addr: http://127.0.0.1:8848
        group: DEFAULT_GROUP #默认分组
      #        username: #nacos用户名
      #        password: #nacos密码
      #服务配置中心
      config:
        server-addr: http://127.0.0.1:8848 # Nacos服务端地址
        group: DEFAULT_GROUP #默认分组
        file-extension: yml #配置文件后缀名
        refresh-enabled: true #开启自动刷新配置
      #        prefix: #配置文件前缀
      #        username: #nacos用户名
      #        password: #nacos密码
    gateway:
      discovery:
        locator:
          enabled: true #开启服务发现路由功能,这样 Spring Cloud Gateway 就能依据服务注册中心(这里是 Nacos)里的服务信息自动创建路由规则
      routes:
        - id: springCloudNacos #路由的唯一标识,一般用${spring.application.name}
          uri: lb://springCloudNacos #目标服务地址,lb://springCloudNacos 里的 lb 代表负载均衡,springCloudNacos 是在 Nacos 注册的服务名,意味着请求会被路由到名为 springCloudNacos 的服务
          predicates:
            - Path=/test/** #路由断言,也就是路由匹配规则。Path=/test/** 表明当请求路径以 /test/ 开头时,该路由规则就会生效
启动SpringCloudGateway服务,进入nacos服务端可以看到网关服务已被注册上去了

5、创建网关配置

6、测试之前的接口请求

Spring Cloud Nacos的接口请求

Spring Cloud Gateway进行接口转发到Spring Cloud Nacos

至此集成Spring Cloud Gateway完成

补充:给nacos设置用户名密码

1、创建nacos数据库

Nacos 2.x 版本使用数据库来存储用户信息,你需要创建相应的数据库表。以 MySQL 为例,执行 conf/mysql-schema.sql 脚本,该脚本会创建 users、roles、permissions 等表
复制代码
插入一个用户名:nacos,密码:Nacos@2025!@#$
INSERT INTO users
(username, password, enabled)
VALUES('nacos', '$2a$10$Jsv69Thm1TtuMnVjnAxufu9EW5YNM6NpELOTrfTmQ2PndGZ4RdxWe', 1);

使用如下代码获取 BCrypt 加密后的密码
public static void main(String[] args) {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String rawPassword = "Nacos@2025!@#$";
        String encodedPassword = encoder.encode(rawPassword);
        System.out.println(encodedPassword);
    }

2、配置nacos服务端配置信息

在 conf/application.properties 文件中配置数据库连接信息:
复制代码
#请根据实际情况修改数据库连接 URL、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://172.16.132.252:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=GH&zgsw@2024

# 开启身份验证
nacos.core.auth.enabled=true
# 指定了服务器身份标识的键。这个键用于标识服务器身份信息的名称
nacos.core.auth.server.identity.key=nacos
# 指定了服务器身份标识的值。客户端在与 Nacos 服务器进行通信时,可以使用这些信息来验证服务器的身份。
nacos.core.auth.server.identity.value=Nacos@2025!@#$
### The default token (Base64 String):原始密钥:nacos_2025250_szhsyb_nacos_token
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNTI1MF9zemhzeWJfbmFjb3NfdG9rZW4=
【nacos.core.auth.plugin.nacos.token.secret.key=】 配置说明
在 Nacos 配置中,nacos.core.auth.plugin.nacos.token.secret.key 是用于生成和验证 Nacos 认证令牌(Token)的密钥。当你开启了 Nacos 的身份验证功能(通过设置 nacos.core.auth.enabled=true)后,Nacos 会使用这个密钥对用户登录、服务调用等操作生成的 Token 进行加密和解密,以此来保证认证信息的安全性和完整性
注意事项
复制代码
1、安全性:这个密钥非常关键,因为它关系到 Token 的加密和解密。在生产环境中,要妥善保管这个密钥,避免泄露。建议使用足够复杂且随机的字符串作为密钥,以增强安全性。
2、长度要求:虽然没有严格固定的长度限制,但为了保证加密的强度,建议使用较长的字符串。一般来说,至少 32 位及以上的随机字符串是比较合适的。
3、Base64 编码:配置时可以直接使用 Base64 编码后的字符串,Nacos 会自动进行解码处理。如果你想修改密钥,生成新的密钥后需要进行 Base64 编码再配置到文件中。
4、以下是使用 Java 代码生成随机字符串并进行 Base64 编码的示例:

public static void main(String[] args) {
        String rawKey = "nacos_2025250_szhsyb_nacos_token";
        // 进行 Base64 编码
        String encodedKey = Base64.getEncoder().encodeToString(rawKey.getBytes(StandardCharsets.UTF_8));
        System.out.println("Encoded Key: " + encodedKey);
    }

3、 以上配置完成,重启nacos服务即可

复制代码
用户名:nacos
密码:Nacos@2025!@#$
后续修改密码可以直接在nacos服务上修改
相关推荐
豆沙沙包?1 分钟前
2025年- H82-Lc190--322.零钱兑换(动态规划)--Java版
java·算法·动态规划
2401_8532757334 分钟前
对微服务的了解
微服务·云原生·架构
都叫我大帅哥34 分钟前
背压(Backpressure):响应式编程的“流量控制艺术”
java·flux
浮游本尊41 分钟前
Java学习第5天 - 输入输出与字符串处理
java
阿杰学编程42 分钟前
Go 语言中的条件判断和for 循环
java·数据库·golang
考虑考虑1 小时前
JDK9中的takeWhile
java·后端·java ee
boy快快长大1 小时前
【CompletableFuture】常用方法(三)
java
在未来等你1 小时前
Java并发编程实战 Day 26:消息队列在并发系统中的应用
微服务·kafka·消息队列·rabbitmq·并发编程·高并发系统·: java
thinking-fish2 小时前
详解JVM
java·jvm·gc