Spring Cloud 方式搭建
基于 Spring Cloud 2023.0.3 + Spring Boot 3.5.6 + Java 17 使用 JavaFree 2025 框架(v2.0.1)快速搭建企业级微服务架构。
准备工作
环境要求
| 工具 | 版本 | 推荐下载 |
|---|---|---|
| JDK | 17 或以上 | Eclipse Temurin |
| Maven | 3.8+ | Apache Maven |
| IDE | IntelliJ IDEA / Eclipse | IntelliJ IDEA |
| Nacos | 3.0.2+ | Nacos Server |
| MySQL | 5.7 / 8.0+ | MySQL Community |
| Redis | 5.0+ | Windows 版 5.0.14.1 |
✅ 建议使用 JDK 17+ 和 Maven 3.8+,确保兼容性。 ✅ Nacos 作为注册中心和配置中心,是 JavaFree Cloud 微服务的核心依赖。
配置 Maven(关键)
JavaFreeCloud 使用私有 Maven 仓库,需配置 settings.xml。
1. 文件路径
# 全局配置(推荐)
{MAVEN_HOME}/conf/settings.xml
# 用户配置
{USER_HOME}/.m2/settings.xml⚠️ 修改前建议备份原文件。
2. 配置内容(关键片段)
将以下配置合并到你的 settings.xml 中:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库 -->
<localRepository>E:/tools/apache-maven-repository</localRepository>
<!-- ============ 镜像配置 ============ -->
<mirrors>
<!-- 将阿里云作为 central 的镜像 -->
<mirror>
<id>aliyun-central</id>
<mirrorOf>central,!2602177-release-16ys0R,!2602177-snapshot-tixmOn</mirrorOf>
<name>Aliyun Central Mirror</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
<!-- ============ 服务器认证 ============ -->
<servers>
<server>
<id>2602177-release-16ys0R</id>
<username>68ecafb91a2f30e9eb4f0a45</username>
<password>4M3ESLdeE3(D</password>
</server>
<server>
<id>2602177-snapshot-tixmOn</id>
<username>68ecafb91a2f30e9eb4f0a45</username>
<password>4M3ESLdeE3(D</password>
</server>
</servers>
<!-- ============ 构建配置 ============ -->
<profiles>
<profile>
<id>javafree-public</id>
<repositories>
<!-- 私有仓库 releases -->
<repository>
<id>2602177-release-16ys0R</id>
<url>https://packages.aliyun.com/68ecb026ccf3499544d8ade3/maven/2602177-release-16ys0r</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<!-- 私有仓库 snapshots -->
<repository>
<id>2602177-snapshot-tixmOn</id>
<url>https://packages.aliyun.com/68ecb026ccf3499544d8ade3/maven/2602177-snapshot-tixmon</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<!-- 中央仓库 -->
<repository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>2602177-release-16ys0R</id>
<url>https://packages.aliyun.com/68ecb026ccf3499544d8ade3/maven/2602177-release-16ys0r</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
<pluginRepository>
<id>2602177-snapshot-tixmOn</id>
<url>https://packages.aliyun.com/68ecb026ccf3499544d8ade3/maven/2602177-snapshot-tixmon</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
<pluginRepository>
<id>central</id>
<url>https://repo1.maven.org/maven2</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活 profile -->
<activeProfiles>
<activeProfile>javafree-public</activeProfile>
</activeProfiles>
</settings>✅ 重点说明:
mirrorOf中排除私有仓库 ID,避免镜像覆盖。server提供私有仓库认证。activeProfiles确保配置生效。
创建 Spring Cloud 工程
1. 项目结构
javafree-springcloud-demo/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/SpringCloudDemoApplication.java
│ └── resources/
│ ├── application.yml
│ └── logback-spring.xml
├── pom.xml💡 说明:
application.yml:应用主配置。优先加载,用于连接 Nacos 配置中心。
2. pom.xml 配置
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>javafree-springcloud-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>javafree-springcloud-demo</name>
<description>JavaFree SpringCloud 示例工程</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<javafree.cloud.version>2.0.1</javafree.cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.javafree.cloud</groupId>
<artifactId>javafree-cloud-dependencies</artifactId>
<version>${javafree.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.javafree.springcloud</groupId>
<artifactId>javafree-spring-cloud-starter</artifactId>
</dependency>
</dependencies>
</project>✅ 说明:
- 使用
javafree-cloud-dependencies统一管理 Spring Cloud 版本。- 引入
javafree-spring-cloud-starter即集成 Nacos、OpenFeign、Gateway、Sentinel 等全套微服务组件。
3. 主启动类
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDemoApplication.class, args);
}
}4. 主配置文件
application.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP
timeout: 3000
# 注册中心配置
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
service: ${spring.application.name}
enabled: true
# 👇 关键:导入多个 Nacos 配置文件(Data ID)
config:
import:
- optional:nacos:javafree-local-application.yaml?refreshEnabled=true
- optional:nacos:javafree-local-datasource.yaml?refreshEnabled=true
- optional:nacos:javafree-local-jwt.yaml?refreshEnabled=true
- optional:nacos:javafree-local-cache.yaml?refreshEnabled=true
- optional:nacos:javafree-local-logging.yaml?refreshEnabled=true
- optional:nacos:javafree-local-accesslog.yaml?refreshEnabled=true
# 建议关闭,除非调试自动配置
debug: true
# 可保留,但优先级低于 logging.yaml 或 logback-spring.xml
logging:
level:
root: info好的,我们来详细说明一下 application.yml 文件中通过 spring.config.import 导入的那几个 Nacos 配置文件。
这些文件本身并不存在于你本地的项目中,而是存在于 Nacos 配置中心服务器上。application.yml 文件的作用是告诉 Spring Boot 应用:“请到 Nacos 服务器上去拉取这些名字的配置文件,并将它们合并到当前应用的配置环境中”。
5. 各个配置文件的说明
核心概念:Nacos 配置中心与 Data ID
代码中 spring.config.import 列表里的每一项: optional:nacos:javafree-local-xxx.yaml?refreshEnabled=true
optional:nacos:: 表示这是一个可选的 Nacos 配置,即使 Nacos 服务器暂时不可用或该配置不存在,应用也能启动(只是缺少这部分配置)。javafree-local-xxx.yaml: 这就是你要从 Nacos 拉取的 Data ID。?refreshEnabled=true: 表示开启配置的动态刷新。当 Nacos 上的这个配置文件被修改并发布后,你的应用能自动感知并更新配置,而无需重启。
以下是几个 javafree-local-xxx.yaml 文件的典型用途和内容说明:
1. javafree-local-application.yaml
作用:
应用通用配置。
- 这是除数据库、安全等核心模块外的其他业务或框架配置的集合。
- 它可能包含一些应用级别的开关、第三方服务的 API Key、消息队列的地址、任务调度配置等。
典型内容示例:
yamlserver: port: 8090 spring: application: name: javafree-cloud-web servlet: multipart: max-file-size: 512MB max-request-size: 512MB enabled: true file-size-threshold: 0
2. javafree-local-datasource.yaml
作用:
数据源配置。
- 这是所有与数据库连接相关的配置。将它独立出来是最佳实践,便于在不同环境(开发、测试、生产)中快速切换数据库地址、用户名和密码。
典型内容示例:
yaml#此文件存到配置中心 spring: datasource: url: jdbc:mysql://localhost:3306/javafree_demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 #初始连接数 max-active: 10 #最大活动连接 max-wait: 60000 #从池中取连接(没有闲置连接)的最大等待时间,-1表示无限等待 min-idle: 5 #最小闲置数,小于min-idle连接池会主动创建新的连接 time-between-eviction-runs-millis: 60000 #清理线程启动的间隔时间,当线程池中没有可用的连接启动清理线程 min-evictable-idle-time-millis: 300000 #清理线程保持闲置最小时间 validation-query: SELECT 1 #用于校验连接 test-on-borrow: false #请求连接时是否校验,比较消耗性能,一般设置false test-on-return: false #归还连接时是否校验,比较消耗性能,一般设置false test-while-idle: true #清理线程通过validation-query来校验连接是否正常,如果不正常将从连接池中移除 pool-prepared-statements: true #存储相同逻辑的sql到连接池的缓存中 # filters: stat,wall #监控统计web的statement(sql),以及防sql注入的wall # 关闭如上配置,可以采用自定义的filter filter: stat: enabled: true #状态监控-->stat db-type: mysql log-slow-sql: true #记录超过指定时间的sql到日志中 slow-sql-millis: 2000 wall: enabled: true #防火墙-->wall db-type: mysql config: delete-allow: true #false禁止删除 drop-table-allow: false #禁止删除表 case-condition-const-allow: true #解决1=1报错 web-stat-filter: enabled: true #开启监控uri,默认false url-pattern: /* #添加过滤规则 exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid" #忽略过滤 stat-view-servlet: enabled: true #开启视图管理界面,默认false url-pattern: /druid/* #视图管理界面uri login-username: druid #账号 login-password: 123456 #密码 # allow: 127.0.0.1 白名单 # deny: 192.168.1.130黑名单 jpa: show-sql: true # 默认false,在日志里显示执行的sql语句 hibernate: ddl-auto: none #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建,生产环境none naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl open-in-view: off #尽快释放数据库连接资源,不支持jpa的懒加载 aop: proxy-target-class: true # 启用 CGLIB 代理,避免 LoadTimeWeaver 警告
3. javafree-local-jwt.yaml
作用:
JWT(JSON Web Token)安全认证配置。
- 在微服务架构中,JWT 常用于用户身份认证和授权。将 JWT 的密钥、过期时间等敏感信息独立管理,安全性更高。
典型内容示例:
yaml#此文件存到配置中心 #登录日志保存时间及清理周期 loginlog: retention-days: 10 # 默认保存30天 #cleanup-cron: 0 0 2 * * ? # 默认每天凌晨 2 点执行 cleanup-cron: "0 0/30 * * * ?" # 每30分钟执行,用于测试 #spring security jwt相关配置 jwt: #private.key: /opt/certs/app.key #本地文件路径方式 private.key: classpath:app.key # 配置私钥 两个密钥文件通过 RsaKeyGenerator工具类生成 #public.key: /opt/certs/app.pub #本地文件路径方式 public.key: classpath:app.pub # 配置公钥 private.key.password: "javafree-cloud-rsa-password" # 配置私钥文件生成时的密码 token.url: /auth/token # 登录接口,默认是/login,登录成功后返回token,此url需要加入白名单中 refresh.token.url: /auth/refresh_token # 刷新token接口,默认是/auth/refresh_token,刷新token成功后返回token,此url需要加入白名单中 refresh.token.parameter.name: refresh_token # 刷新token请求参数名,默认为refreshToken security: # 白名单配置 white_urls: - / - /login - /auth/token - /auth/refresh_token - /jwtlogin - /auth/logout - /resource/* - /static/** - /register/** - /v3/api-docs/** - /api-ui.html - /swagger-ui/** - /swagger-ui.html - /druid/** - /actuator/** - /webjars/** - /**.js - /**.svg - /**.css - /**.png - /**.ico - /viewimages/** - /avatar_img/** - /error - /favicon.ico token: # JWT 在 HTTP HEADER 中默认的 KEY 默认Authorization,集成公司的jwt平台后, # 不要用Authorization名,也不能用驼峰,前端会自动改成首字母大写 token_name: Javafreeauthorization # JWT 内容的开头字符 默认 "Bearer "(后面加了空格) token_head: "Bearer " #JWT 标准信息:签发人 - iss issuer: javafree-cloud #JWT 标准信息:过期时间 单位秒- exp,未来多长时间内过期 2小时(60*60*2=7200) expiration: 7200 #JWT 标准信息:刷新token过期时间 单位秒- exp,未来多长时间内过期 1天(60*60*24=86400) refresh_expiration: 86400
4. javafree-local-cache.yaml
作用:
缓存配置。
- 配置应用使用的缓存技术,如 Redis。独立出来便于管理缓存服务器地址、密码、超时时间等。
典型内容示例:
yaml#此文件存到配置中心 spring: # redis 单机配置示例 data: redis: host: 127.0.0.1 # Redis服务器地址(生产环境建议集群配置) port: 6379 # Redis服务端口 password: 123456 # 访问密码(重要!生产环境必须配置) timeout: 2200ms # 连接超时时间(建议 1~3 秒) lettuce: pool: max-active: 8 # 连接池最大连接数(根据 QPS 调整,建议值 = QPS*平均响应时间(秒) ) max-idle: 4 # 最大空闲连接数(建议 max-active 的 5%~10%) min-idle: 1 # 最小空闲连接数(生产环境建议 >=5) max-wait: 5000ms # 获取连接最大等待时间(网络不稳定时可适当增加) # 缓存全局配置 cache: type: redis # 使用 Redis 作为缓存实现 # 多级缓存配置(Caffeine + Redis) multilevel: enable-redis: true # 默认关闭 Redis 相关功能,如果redis服务无法连接,会导致项目无法启动,此时可改为false (生产环境建议开启) time-to-live: 1h # Redis 缓存默认存活时间(生产环境建议 30m~4h) use-key-prefix: true # 启用缓存键前缀(必须与 key-prefix 配合使用) key-prefix: "JAVAFREENEWCACHEKEY:DEV" # 统一前缀(建议格式:项目名:环境) topic: "cache:multilevel:topic" # 缓存同步消息主题(集群环境必须唯一) allow-null-values: true # 是否允许缓存空值(防穿透,建议保持 true) # 本地缓存配置(Caffeine) local: max-size: 2000 # 本地缓存最大条目数(建议内存的 0.1%~1%) initial-capacity: 1000 # 初始哈希表容量(建议 max-size 的 50%) # 过期策略(三选一) expire-mode: RANDOM # 过期模式:RANDOM(推荐)/WRITE/ACCESS expire-after-access: 1800s # ACCESS模式:最后访问后30分钟过期 expire-after-write: 1800s # WRITE模式:写入后30分钟过期 expiry-jitter: 50 # RANDOM模式:±50% 时间偏差(防雪崩) # 熔断器配置(Resilience4j) circuit-breaker: failure-rate-threshold: 35 # 从25%提升至35%,避免短暂网络抖动触发熔断 slow-call-rate-threshold: 30 # 从25%提升至30%,允许更多慢调用 slow-call-duration-threshold: 500ms # 从250ms调整为500ms(需参考Redis实际P99延迟) sliding-window-type: time_based # 改为时间窗口(更适合突发流量) permitted-number-of-calls-in-half-open-state: 30 # 增加探测请求量 max-wait-duration-in-half-open-state: 10s # 延长半开状态窗口 sliding-window-size: 60 # 60秒时间窗口(原count_based 40太小) minimum-number-of-calls: 50 # 最小统计样本从10提升至50 wait-duration-in-open-state: 30s # 熔断持续时间从2.5s调整为30秒(需结合业务容忍度) # 新增监控配置 register-health-indicator: true # 启用健康检查端点 event-consumer-buffer-size: 50 # 事件缓冲区大小
5. javafree-local-logging.yaml
作用:
日志级别和输出配置。
- 配置不同包或类的日志级别(INFO, DEBUG, WARN, ERROR)。这是最常用的动态配置之一,比如线上出了问题,可以临时把某个模块的日志级别调成 DEBUG 来排查,而无需重启服务。
典型内容示例:
yaml#此文件存到配置中心 logging: level: # 核心业务包 com.yourcompany.javafree: INFO # 第三方组件调优:避免 DEBUG 泛滥 com.alibaba.cloud.nacos: WARN # 仅告警以上(生产推荐) org.springframework.web: INFO org.springframework.security: WARN org.springframework.boot: INFO org.springframework.cloud: INFO org.apache.http: INFO feign: INFO # 关闭 Spring Boot 内部 debug 模式(除非排查自动配置问题) debug: false
6. javafree-local-accesslog.yaml
作用:
访问日志(Access Log)配置。
- 专门用于记录 HTTP 请求的详细信息,如请求时间、IP、URL、状态码、耗时等。这对于分析用户行为、监控系统性能和排查问题至关重要。
典型内容示例:
yaml#此文件存到配置中心 #accesslog插件配置 spring: #日志elasticsearch 配置 elasticsearch: rest: # Elasticsearch的地址,可以是集群多个节点,逗号分隔 uris: http://localhost:9200 # 如果启用了安全认证(如 X-Pack),填写用户名和密码 # username: "" # 如果Elasticsearch需要认证,请填写用户名 # password: "" # 相应的密码 # 连接超时时间(单位:秒) connect-timeout: 10 # 套接字超时时间(单位:秒) socket-timeout: 30 # 最大重试超时时间(单位:秒) max-retry-timeout: 60 # 禁用 Elasticsearch 健康检查,避免日志使用顾时,健康检查失败 management: health: elasticsearch: enabled: false # 操作日志配置 accesslog: enabled: true # 是否开启日志存储 true or false storage: jpa # 可选 jpa 或 elasticsearch retention-minutes: 1440 # 日志保留多少分钟 默认 24 小时 cleanup-enabled: true #cleanup-cron: "0 0 1 * * ?" # 默认每天凌晨 1 点执行 #cleanup-cron: "0 0/30 * * * ?" # 每30分钟执行 cleanup-cron: "0 0 */2 * * ?" # 每2小时执行 cache-request-body: false # 是否保存请求体, 为了控制是否记录请求体 默认为 false max-body-size: 1048576 # 超过这个值的字节数请求体,不缓存,默认 1M(1024*1024)
总结
通过将配置拆分成多个独立的 .yaml 文件并托管到 Nacos:
- 职责分离:每个文件只关注一个领域的配置,结构清晰,易于维护。
- 动态刷新:
refreshEnabled=true使得修改配置后能实时生效,极大地提升了运维效率。 - 环境隔离:在 Nacos 中,你可以为
dev、test、prod等不同namespace创建同名的 Data ID,应用通过切换namespace就能加载对应环境的配置。 - 安全性:敏感信息(如数据库密码、API Key)可以设置读写权限或加密存储。
你需要做的:确保在 Nacos 控制台的 dev 命名空间下,创建了这些 Data ID,并填入了正确的配置内容。应用启动时,Spring Boot 会自动将 application.yml 和这些从 Nacos 拉取的配置合并,形成最终的运行时配置。
启动 Nacos 服务
1. 下载并启动 Nacos
# 下载 Nacos Server
wget https://github.com/alibaba/nacos/releases/download/3.0.2/nacos-server-3.0.2.zip
unzip nacos-server-3.0.2.zip
# 启动(单机模式)
cd nacos/bin
sh startup.sh -m standalone访问:http://localhost:8080/nacos 默认账号:nacos / nacos
2. 在 Nacos 中创建配置
在 Nacos 控制台创建 前面介绍的几个javafree-local-xxx.yaml 文件

启动与验证
1. 启动应用
cd javafree-springcloud-demo
mvn spring-boot:run2. 验证结果
| 项目 | 地址 / 操作 | 预期结果 |
|---|---|---|
| Nacos 控制台 | http://localhost:8080/nacos | 在「服务列表」中看到 javafree-cloud-web |
| 应用日志 | 控制台 | 输出 Registered service 和 Started |
| API 文档 | http://localhost:8090/swagger-ui.html | 显示 Swagger UI |
核心功能模块
| 模块 | 功能说明 |
|---|---|
nacos | 服务注册与发现 + 配置中心 |
openfeign | 声明式 HTTP 客户端,服务间调用 |
gateway | 统一网关,路由、限流、鉴权 |
sentinel | 流量控制、熔断降级、系统保护 |
auth | JWT 全链路认证,网关统一拦截 |
cache | 分布式缓存(Redis)+ 本地缓存(Caffeine) |
springdoc | 微服务 API 文档自动聚合 |
常见问题
| 问题 | 解决方案 |
|---|---|
| 服务未注册到 Nacos | 检查application.yml 中 nacos.discovery.server-addr 配置 |
| 配置未生效 | 检查 shared-imports 是否正确,Nacos 中 dataId 和 group 是否匹配 |
| Feign 调用失败 | 检查服务名是否一致,端口是否开放 |
| Sentinel 控制台打不开 | 确保已引入 spring-cloud-starter-sentinel 并配置 dashboard |
启动报 ClassNotFoundException | 安装 Lombok 插件并启用注解处理 |
下一步
参考示例工程:javafree2025-examples
✅ 你已成功搭建 JavaFreeCloud2025 Spring Cloud 微服务! 现在可以开始构建你的微服务集群了。
本指南适用于快速入门。如需高级配置(如多环境、灰度发布、服务网格),请参考官方文档。