Day01-Gateway+Auth

📅 2026/7/1 18:59:08
Day01-Gateway+Auth
目录1 创建父项目time-traces-java1.1 设置JDK25语法1.2 删除多余文件夹2 引入gitee管理2.1 初始化git2.2 配置.gitignore2.3 第一次提交3 引入依赖约束4 创建子模块time-traces-gateway4.1 创建module4.2 引入依赖4.3 启动类4.4 配置类application.yml4.5 启动项目5 创建子模块time-traces-auth5.1 创建module5.2 引入依赖5.3 启动类5.4 配置类5.5 TestController5.6 启动并调试6 注册中心Nacos6.1 docker部署mysql6.2 docker部署nacos部署页面6.3 整合nacos注册与发现[time-traces-java]pom.xml[time-traces-gateway]pom.xml[time-traces-auth]pom.xml[time-traces-gateway]application.yml[time-traces-auth]application.ymlGatewayApp.javaAuthApp.java调试7 配置中心Nacos[time-traces-gateway]pom.xml[time-traces-auth]pom.xml[time-traces-gateway]application.yml[time-traces-auth]application.ymlTestProperties.javaTestController.java调试注意总结整体架构关键知识点部署侧要点1 创建父项目time-traces-java1.1 设置JDK25语法这里创建完成后自动选择的语法不是JDK25可以点击自动提示设置。点击后不爆红即可点击运行。1.2 删除多余文件夹这些都可以删掉2 引入gitee管理2.1 初始化git在gitee创建好项目后不会的可以自行搜索可以直接拉取该项目到本地然后将.git以及两个md拉到我们刚刚创建的java项目中回来再看idea中就已经有git管理了前提git已经安装在了本地并且idea正确配置了git2.2 配置.gitignore修改.gitignore为极简模式后面有其他需要我们再加然后需要在git管理界面刷新下这样我们忽略的文件就不会被git管理了2.3 第一次提交选中要提交的文件填写提交信息然后commit and push然后可以看到idea和gitee都有了提交记录我这里有一个gitmoji-plus-commit-button的插件可以在gitee里显示一个小图标忙里偷闲哈哈3 引入依赖约束[time-traces-java]pom.xml后面都会在pom.xml前面加上所属项目避免有多个pom.xml找错了spring-boot-starter-parentspringboot父依赖后续springboot相关包的版本都可以不用再单独约束版本这里的版本大家可以去maven仓库看最新的版本我写这个文章的时候最新的是4.1.0用最新版本优点缺点就是第三方依赖可能跟不上趟这也没办法只能尽量少用第三方的properties里约束了java的版本和编码还可以统一管理自定义依赖的版本号dependencyManagement里约束了springcloud的依赖版本后续springcloud相关的不用再单独约束版本dependencies里不宜引入过重的依赖所以引入了一个轻量的大家都会用的lombok版本由springboot约束不自行定义build里这个我看大概意思是maven编译的时候用25创建出来就带这个我就没删?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.time.traces/groupId artifactIdtime-traces-java/artifactId version1.0-SNAPSHOT/version parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version4.1.0/version relativePath/ /parent properties java.version25/java.version project.build.sourceEncodingUTF-8/project.build.sourceEncoding spring-cloud.version2025.1.2/spring-cloud.version /properties dependencyManagement dependencies !-- spring cloud -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies !-- 自动生成getter setter -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId scopeprovided/scope /dependency /dependencies build pluginManagement plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId configuration source25/source target25/target /configuration /plugin /plugins /pluginManagement /build /project刷新idea里的maven可以正常拉取到依赖没有爆红并且看了dependence说明没有问题。4 创建子模块time-traces-gateway4.1 创建module右击time-traces-java新建一个module子模块会自动把parent设置为time-traces-java刷新maven3里有不过多赘述了能看到gateway模块已经正常加载并且父pom也自动注入了子模块4.2 引入依赖[time-traces-gateway]pom.xmlgateway的依赖和springboot2是有区别的如果引入之前的会提示你更新到新版本的依赖负载均衡需要额外引入loadbalancer以及caffeine缓存各服务的路由build中需要指定启动类?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.time.traces/groupId artifactIdtime-traces-java/artifactId version1.0-SNAPSHOT/version /parent artifactIdtime-traces-gateway/artifactId dependencies !-- Spring Cloud Gateway -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-gateway-server-webflux/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency !-- LoadBalancer (Gateway 使用 lb:// 协议需要) -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency !-- 内存缓存 也是lb需要的 -- dependency groupIdcom.github.ben-manes.caffeine/groupId artifactIdcaffeine/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.time.traces.gateway.GatewayApp/mainClass /configuration /plugin /plugins /build /project4.3 启动类SpringBootApplication启动springboot必备注解可以做自动装配啥的package com.time.traces.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * auth: lws * date: 2026/6/30 */ SpringBootApplication public class GatewayApp { static void main() { SpringApplication.run(GatewayApp.class); } }4.4 配置类application.yml需要指定一个不容易跟别人冲突的端口给一个application name是为了后面方便用比如nacos和skywalkingserver: port: 9601 spring: application: name: time-traces-gateway4.5 启动项目别忘了刷新下maven5 创建子模块time-traces-auth5.1 创建module不在赘述5.2 引入依赖[time-traces-auth]pom.xml除了gateway是引入webflux其他web模块都是引入的spring-boot-starter-web?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.time.traces/groupId artifactIdtime-traces-java/artifactId version1.0-SNAPSHOT/version /parent artifactIdtime-traces-auth/artifactId dependencies !-- web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.tt.auth.AuthApp/mainClass /configuration /plugin /plugins /build /project5.3 启动类package com.time.traces.auth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * auth: lws * date: 2026/6/30 */ SpringBootApplication public class AuthApp { static void main() { SpringApplication.run(AuthApp.class); } }5.4 配置类除了指定端口和应用名称外还需要指定一个公共路径这样就会在controller定义的路径的基础上加上一个公共的/time-traces-authserver: port: 9602 servlet: context-path: /time-traces-auth spring: application: name: time-traces-auth5.5 TestControllerpackage com.time.traces.auth.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * auth: lws * date: 2026/6/30 */ RestController RequestMapping(/test) public class TestController { GetMapping(/ok) public String ok() { return ok; } }5.6 启动并调试6 注册中心Nacos我们后期会把一些通用功能类似鉴权限流等策略放到gatewayauth和user等web模块只负责提供业务功能就可以了。而通过gateway调用auth肯定要知道怎么指向auth的nacos注册中心就帮我解决了这个问题。例如auth启动后会告诉nacos自己已经上线可以供其他人调用了gateway会定时拉取nacos中已经注册的服务和ip列表当通过gateway调用auth服务的时候gateway就会负载到每一台auth服务。6.1 docker部署mysqlnacos用到了mysql存储信息所以先部署下mysql# 创建挂载文件夹 mkdir -p /home/mysql/{log,data,conf} # 追加如下内容设置数据库时区和字符集 cat /home/mysql/conf/my.cnf EOF [mysqld] default-time-zone 08:00 character-set-server utf8mb4 collation-server utf8mb4_unicode_ci [client] default-character-set utf8mb4 [mysql] default-character-set utf8mb4 EOF # 编辑docker-compose.yml cat /home/mysql/docker-compose.yml EOF services: mysql: image: mysql:latest container_name: mysql restart: always privileged: true ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: 123456 TZ: Asia/Shanghai volumes: - /home/mysql/log:/var/log/mysql - /home/mysql/data:/var/lib/mysql - /home/mysql/conf:/etc/mysql/conf.d command: - --default-time-zone08:00 EOF # 启动 cd /home/mysql/ docker-compose up -d# --privilegedtrue 给予权限(目前我就发现给了挂载目录的权限) # -v 挂载目录 # -e 环境变量:mysql密码 # --name 容器名称 # mysql版本不指定就是最热版本6.2 docker部署nacos部署# 创建文件夹 mkdir -p /home/nacos/{conf,logs,data} # 获取到mysql初始化文件 docker run --name nacos -d -p 8848:8848 -e MODEstandalone nacos/nacos-server docker cp nacos:/home/nacos/conf/ /home/nacos/ # 需要在mysql中新建个数据库建议起名nacos执行conf中的初始化sql # /home/nacos/conf/mysql-schema.sql # 移除容器 docker rm -f nacos # 编辑compose cat /home/nacos/docker-compose.yml EOF services: nacos: image: nacos/nacos-server:latest container_name: nacos restart: always privileged: true ports: - 8080:8080 - 8848:8848 - 9848:9848 - 9849:9849 environment: # 运行模式单机 MODE: standalone # JVM 配置 JVM_XMS: 128m JVM_XMX: 128m JVM_XMN: 64m # 数据库配置 MYSQL_SERVICE_HOST: 196.168.40.112 MYSQL_SERVICE_PORT: 3306 MYSQL_SERVICE_DB_NAME: nacos MYSQL_SERVICE_USER: root MYSQL_SERVICE_PASSWORD: 123456 MYSQL_SERVICE_DB_PARAM: characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalseserverTimezoneAsia/Shanghai # 认证配置必须填但是填啥无所谓可以参照我这个来 NACOS_AUTH_ENABLE: true NACOS_AUTH_IDENTITY_KEY: identityKey NACOS_AUTH_IDENTITY_VALUE: identityValue NACOS_AUTH_TOKEN: VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg EOF # 创建容器并复制里面的配置文件到宿主机 cd /home/nacos/ docker-compose up -d页面访问http://192.168.40.111:8080/nacos更新了AI相关的东西但是我们可以先不管先看服务管理就行暂时还啥也没有6.3 整合nacos注册与发现[time-traces-java]pom.xml追加spring-cloud-alibaba-dependencies因为nacos不是通过springcloud管理的需要额外添加依赖管理?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion ... properties ... spring-cloud-alibaba.version2025.1.0.0/spring-cloud-alibaba.version /properties dependencyManagement dependencies ... !-- spring cloud alibaba -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version${spring-cloud-alibaba.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement ... /project[time-traces-gateway]pom.xml追加依赖!-- Nacos -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency[time-traces-auth]pom.xml追加依赖!-- Nacos -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency[time-traces-gateway]application.yml除了追加服务注册与发现的配置还要追加route的配置id无实际用途可用application nameurilb代表负载均衡需要配合gateway的两个依赖参考4.2后面跟对应的服务端application namepredicates什么样的请求会被路由到该route比如path/time-traces-auth/**就是除了域名第一节路径是time-traces-auth的都走这个路由spring: ... # nacos服务发现 cloud: nacos: discovery: server-addr: 192.168.40.111:8848 username: nacos password: nacos gateway: server: webflux: routes: - id: time-traces-auth uri: lb://time-traces-auth predicates: - Path/time-traces-auth/**[time-traces-auth]application.ymlspring: ... # nacos服务发现 cloud: nacos: discovery: server-addr: 192.168.40.111:8848 username: nacos password: nacos ...GatewayApp.javaEnableDiscoveryClient新增注解package com.time.traces.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * auth: lws * date: 2026/6/30 */ SpringBootApplication EnableDiscoveryClient public class GatewayApp { static void main() { SpringApplication.run(GatewayApp.class); } }AuthApp.javaEnableDiscoveryClient新增注解package com.time.traces.auth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * auth: lws * date: 2026/6/30 */ SpringBootApplication EnableDiscoveryClient public class AuthApp { static void main() { SpringApplication.run(AuthApp.class); } }调试启动两个项目先观察nacos的服务列表是否有了两个服务然后测试下API是否可以调通7 配置中心Nacos我们的application.yml里有很多的配置有一些业务配置可能我们要经常改变比如设置了一个IP白名单如果每次改配置都要重启显而是一个很麻烦的事情。Nacos也为我们解决了这个问题我们将项目的配置放到nacos上项目启动时通过nacos拉取配置到本地进行启动而nacos每次配置改变都会通知到服务通过销毁并创建bean的方式让配置刷新[time-traces-gateway]pom.xml追加依赖!-- Nacos -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency[time-traces-auth]pom.xml追加依赖!-- Nacos -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency[time-traces-gateway]application.yml追加spring.config.import配置读取nacos上的time-traces-gateway.yml追加spring.cloud.nacos.config配置直接用discovery的可以少写一遍将gateway路由相关配置挪到nacos上编辑路由实时生效server: port: 9601 spring: application: name: time-traces-gateway config: import: - optional:nacos:${spring.application.name}.yml cloud: nacos: discovery: server-addr: 192.168.40.111:8848 username: nacos password: nacos config: server-addr: ${spring.cloud.nacos.discovery.server-addr} username: ${spring.cloud.nacos.discovery.username} password: ${spring.cloud.nacos.discovery.password} file-extension: ymlnacos配置spring: cloud: gateway: server: webflux: routes: - id: time-traces-auth uri: lb://time-traces-auth predicates: - Path/time-traces-auth/**[time-traces-auth]application.ymlauth暂时没有需要放到nacos上的配置但是可以先放一个biz.server: port: 9602 servlet: context-path: /time-traces-auth spring: application: name: time-traces-auth config: import: - optional:nacos:${spring.application.name}.yml cloud: nacos: discovery: server-addr: 192.168.40.111:8848 username: nacos password: nacos config: server-addr: ${spring.cloud.nacos.discovery.server-addr} username: ${spring.cloud.nacos.discovery.username} password: ${spring.cloud.nacos.discovery.password} file-extension: ymlnacos配置biz: test: aaaTestProperties.javaData生成getter setterRefreshScopenacos改配置实时刷新configuration标明是配置类configurationProperties标明是读取配置的配置类prefix是除了最后一级的前缀比如bix.testbiz.test1两个配置那么前缀是biz属性可以写test和test1两个属性。package com.time.traces.auth.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; /** * auth: lws * date: 2026/6/30 */ Data RefreshScope Configuration ConfigurationProperties(prefix biz) public class TestProperties { private String test; }TestController.javaRequiredArgsConstructor生成一个全参构造代替调autowire和resoucepackage com.time.traces.auth.controller; import com.time.traces.auth.properties.TestProperties; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * auth: lws * date: 2026/6/30 */ RequiredArgsConstructor RestController RequestMapping(/test) public class TestController { private final TestProperties testProperties; GetMapping(/ok) public String ok() { return ok; } GetMapping(/properties) public String properteis() { return testProperties.getTest(); } }调试直接调用是可以拿到aaa的修改nacos这个配置有变化会打印日志再次调用接口会发现值变掉了注意需要改变的配置最好写在properties类里这样销毁和创建bean对业务影响最小properties里不要写业务逻辑类似mysqlredismq这种项目创建就实例化的实例更改配置仍然需要重启服务才可以生效总结整体架构父项目time-traces-java统一管理依赖下挂两个子模块gateway网关webflux和auth业务模块web mvc。Nacos 同时承担注册中心和配置中心两个角色。关键知识点1. 版本与依赖管理重点父 pom 用spring-boot-starter-parent统一约束 SpringBoot 系版本dependencyManagement里 importspring-cloud-dependencies和spring-cloud-alibaba-dependencies子模块引依赖无需再写版本号。注意Nacos 属于 Alibaba 体系不被 spring-cloud-dependencies 管理必须额外加 alibaba 的 BOM。用最新版如 SpringBoot 4.1.0 JDK25的代价是第三方依赖可能跟不上所以尽量少引重依赖。2. Gateway 与普通 web 模块的区别Gateway 引spring-cloud-gateway-server-webfluxwebflux不是starter-web负载均衡额外需要loadbalancercaffeine缓存路由。其他 web 模块用spring-boot-starter-web。两类模块的 build 都要指定mainClass启动类。3. 注册与发现启动类加EnableDiscoveryClient配置spring.cloud.nacos.discovery。路由uri: lb://服务名中的lb就是走负载均衡必须配合 gateway 的 lb 依赖。predicates里Path/xxx/**决定哪些请求被路由过去。4. 配置中心重点理解动态刷新机制加nacos-config依赖 spring.config.import: optional:nacos:${应用名}.yml。把 gateway 路由配置挪到 Nacos 上改路由实时生效无需重启。动态刷新的本质Nacos 通知服务 →销毁并重建 bean→ 配置生效。5. 配置刷新的三条实践纪律容易踩坑需要动态变的配置写进RefreshScope ConfigurationProperties的 properties 类里把 bean 重建对业务的影响降到最小。properties 类里不要写业务逻辑因为它会被反复销毁重建。MySQL、Redis、MQ 这种项目启动即实例化的连接改配置仍需重启才生效刷新机制对它们无效。部署侧要点Nacos 用 MySQL 存数据需先建库建议名nacos并执行conf/mysql-schema.sql初始化。新版 Nacos 端口除 8848 外还需开放 9848/9849gRPC8080 是新控制台。NACOS_AUTH_*鉴权配置必填但具体值无所谓。