Spring Boot 4.0 与 Spring Cloud Alibaba 2025 整合完整指南

Spring Boot 4.0 与 Spring Cloud Alibaba 2025 整合完整指南

Spring Boot 4.0 与 Spring Cloud Alibaba 2025 整合完整指南

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

概述

本文将详细介绍如何在 Spring Boot 4.0 中整合 Spring Cloud Alibaba 2025 最新版本。Spring Cloud Alibaba 为分布式应用开发提供了一站式解决方案,包含服务发现、配置管理、流量控制等核心功能。

环境要求

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

  • JDK: 21+ (Spring Boot 4.0 要求)
  • Maven: 3.6+ 或 Gradle 7.x+
  • Spring Boot: 4.0.0
  • Spring Cloud: 2025.0.0 (假设版本号)
  • Spring Cloud Alibaba: 2025.0.0 (假设版本号)

项目结构

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

springboot4-sc-alibaba-demo/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── Springboot4ScAlibabaApplication.java │ │ ├── controller/ │ │ ├── service/ │ │ └── config/ │ └── resources/ │ ├── application.yml │ └── bootstrap.yml ├── pom.xml └── README.md 

第一步:创建项目并配置依赖

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

1.1 使用 Spring Initializr 创建项目

访问 https://start.spring.io/ 创建基础项目,选择:

  • Spring Boot: 4.0.0
  • 打包方式: Maven/Gradle
  • Java: 21

1.2 完整 pom.xml 配置

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>4.0.0</version><relativePath/></parent><groupId>com.example</groupId><artifactId>springboot4-sc-alibaba-demo</artifactId><version>1.0.0</version><name>springboot4-sc-alibaba-demo</name><description>Spring Boot 4.0 with Spring Cloud Alibaba 2025</description><properties><java.version>21</java.version><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- Spring Cloud 版本 --><spring-cloud.version>2025.0.0</spring-cloud.version><!-- Spring Cloud Alibaba 版本 --><spring-cloud-alibaba.version>2025.0.0</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><!-- Spring Cloud 依赖管理 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 依赖管理 --><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><dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Spring Cloud Alibaba Nacos Discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Spring Cloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- Spring Cloud OpenFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- Spring Cloud LoadBalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Spring Boot Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

第二步:配置文件

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

2.1 bootstrap.yml (应用启动配置)

spring:application:name: demo-service profiles:active: dev cloud:nacos:config:server-addr: localhost:8848file-extension: yaml namespace: dev-namespace group: DEFAULT_GROUP extension-configs:-data-id: shared-config.yaml group: SHARED_GROUP refresh:truediscovery:server-addr: localhost:8848namespace: dev-namespace group: DEFAULT_GROUP metadata:version:1.0sentinel:transport:dashboard: localhost:8080eager:truedatasource:ds1:nacos:server-addr: localhost:8848data-id: ${spring.application.name}-sentinel group-id: DEFAULT_GROUP data-type: json rule-type: flow 

2.2 application.yml (应用配置)

server:port:8081servlet:context-path: /demo spring:main:allow-bean-definition-overriding:truemvc:throw-exception-if-no-handler-found:trueweb:resources:add-mappings:falsemanagement:endpoints:web:exposure:include: health,info,metrics endpoint:health:show-details: always feign:sentinel:enabled:trueclient:config:default:connect-timeout:5000read-timeout:5000logger-level: basic logging:level:com.example: debug com.alibaba.nacos: warn 

第三步:主应用类

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

packagecom.example;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableDiscoveryClient// 启用服务发现@EnableFeignClients(basePackages ="com.example.service")// 启用Feign客户端publicclassSpringboot4ScAlibabaApplication{publicstaticvoidmain(String[] args){SpringApplication.run(Springboot4ScAlibabaApplication.class, args);}}

第四步:Nacos 服务注册与发现

4.1 服务提供者示例

packagecom.example.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/api")publicclassDemoController{@Value("${server.port}")privateString port;@GetMapping("/hello")publicStringhello(@RequestParamString name){returnString.format("Hello %s, from port: %s", name, port);}@GetMapping("/health")publicStringhealth(){return"Service is healthy";}}

4.2 服务消费者示例(使用OpenFeign)

4.2.1 创建Feign客户端接口
packagecom.example.service;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;@FeignClient(name ="demo-service", path ="/demo/api")publicinterfaceDemoServiceClient{@GetMapping("/hello")StringsayHello(@RequestParamString name);@GetMapping("/health")StringhealthCheck();}
4.2.2 创建Fallback类
packagecom.example.service;importorg.springframework.stereotype.Component;@ComponentpublicclassDemoServiceFallbackimplementsDemoServiceClient{@OverridepublicStringsayHello(String name){return"Fallback: Hello "+ name;}@OverridepublicStringhealthCheck(){return"Fallback: Service unavailable";}}
4.2.3 更新Feign客户端配置Fallback

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

@FeignClient( name ="demo-service", path ="/demo/api", fallback =DemoServiceFallback.class)publicinterfaceDemoServiceClient{// 接口方法保持不变}
4.2.4 消费者控制器
packagecom.example.controller;importcom.example.service.DemoServiceClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/consumer")publicclassConsumerController{@AutowiredprivateDemoServiceClient demoServiceClient;@GetMapping("/call-hello")publicStringcallHello(@RequestParamString name){return demoServiceClient.sayHello(name);}}

第五步:Nacos 配置管理

5.1 动态配置示例

packagecom.example.config;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.cloud.context.config.annotation.RefreshScope;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/config")@RefreshScope// 支持配置动态刷新publicclassConfigController{@Value("${app.config.demo:defaultValue}")privateString demoConfig;@Value("${app.feature.enabled:false}")privateboolean featureEnabled;@GetMapping("/demo")publicStringgetDemoConfig(){return"Current config: "+ demoConfig +", Feature enabled: "+ featureEnabled;}}

5.2 在Nacos中创建配置

在Nacos控制台创建Data ID: demo-service-dev.yaml,配置内容:

app:config:demo:"This is dynamic config from Nacos"feature:enabled:trueserver:port:8081logging:level:com.example: info 

第六步:Sentinel 流量控制

6.1 Sentinel配置类

packagecom.example.config;importcom.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;importcom.alibaba.csp.sentinel.slots.block.BlockException;importcom.alibaba.csp.sentinel.slots.block.authority.AuthorityException;importcom.alibaba.csp.sentinel.slots.block.degrade.DegradeException;importcom.alibaba.csp.sentinel.slots.block.flow.FlowException;importcom.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;importcom.alibaba.csp.sentinel.slots.system.SystemBlockException;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.http.HttpStatus;importorg.springframework.http.MediaType;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.util.HashMap;importjava.util.Map;@ConfigurationpublicclassSentinelConfig{@BeanpublicBlockExceptionHandlersentinelBlockExceptionHandler(){returnnewCustomBlockExceptionHandler();}staticclassCustomBlockExceptionHandlerimplementsBlockExceptionHandler{@Overridepublicvoidhandle(HttpServletRequest request,HttpServletResponse response,BlockException e)throwsException{Map<String,Object> result =newHashMap<>();if(e instanceofFlowException){ result.put("code",1001); result.put("message","接口限流");}elseif(e instanceofDegradeException){ result.put("code",1002); result.put("message","服务降级");}elseif(e instanceofParamFlowException){ result.put("code",1003); result.put("message","热点参数限流");}elseif(e instanceofSystemBlockException){ result.put("code",1004); result.put("message","系统规则限制");}elseif(e instanceofAuthorityException){ result.put("code",1005); result.put("message","授权规则不通过");}else{ result.put("code",1000); result.put("message","未知限流");} response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); response.setCharacterEncoding("UTF-8"); response.setContentType(MediaType.APPLICATION_JSON_VALUE);newObjectMapper().writeValue(response.getWriter(), result);}}}

6.2 使用Sentinel注解进行资源保护

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

packagecom.example.controller;importcom.alibaba.csp.sentinel.annotation.SentinelResource;importcom.alibaba.csp.sentinel.slots.block.BlockException;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/sentinel")publicclassSentinelController{@GetMapping("/resource")@SentinelResource( value ="protectedResource", blockHandler ="handleBlock", fallback ="handleFallback")publicStringprotectedResource(){return"This is a protected resource";}// 限流处理publicStringhandleBlock(BlockException ex){return"请求过于频繁,请稍后重试";}// 降级处理publicStringhandleFallback(Throwable ex){return"服务暂时不可用,请稍后重试";}}

第七步:高级配置

7.1 自定义Ribbon配置(负载均衡)

packagecom.example.config;importorg.springframework.cloud.client.ServiceInstance;importorg.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importreactor.core.publisher.Flux;importjava.util.Arrays;importjava.util.List;@ConfigurationpublicclassLoadBalancerConfig{@BeanpublicServiceInstanceListSupplierserviceInstanceListSupplier(){returnnewDemoServiceInstanceListSupplier("demo-service");}staticclassDemoServiceInstanceListSupplierimplementsServiceInstanceListSupplier{privatefinalString serviceId;publicDemoServiceInstanceListSupplier(String serviceId){this.serviceId = serviceId;}@OverridepublicStringgetServiceId(){return serviceId;}@OverridepublicFlux<List<ServiceInstance>>get(){// 这里可以自定义服务实例发现逻辑returnFlux.just(Arrays.asList());}}}

7.2 全局异常处理

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

packagecom.example.config;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjava.util.HashMap;importjava.util.Map;@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)publicMap<String,Object>handleException(Exception e){Map<String,Object> result =newHashMap<>(); result.put("code",500); result.put("message","系统异常: "+ e.getMessage());return result;}}

第八步:部署和测试

8.1 启动Nacos和Sentinel Dashboard

# 启动Nacos (需要提前下载)sh nacos/bin/startup.sh -m standalone # 启动Sentinel Dashboard (需要提前下载) java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar 

8.2 应用启动类增强

packagecom.example;importorg.springframework.boot.Banner;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.builder.SpringApplicationBuilder;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;importorg.springframework.cloud.openfeign.EnableFeignClients;importorg.springframework.core.env.Environment;importjava.util.Objects;@SpringBootApplication@EnableDiscoveryClient@EnableFeignClients(basePackages ="com.example.service")publicclassSpringboot4ScAlibabaApplication{publicstaticvoidmain(String[] args){newSpringApplicationBuilder(Springboot4ScAlibabaApplication.class).bannerMode(Banner.Mode.CONSOLE).run(args);}publicvoidprintInfo(Environment env){String port = env.getProperty("server.port");String contextPath =Objects.requireNonNullElse( env.getProperty("server.servlet.context-path"),"");System.out.println("\n----------------------------------------------------------");System.out.println("Application is running! Access URLs:");System.out.println("Local: \t\thttp://localhost:"+ port + contextPath);System.out.println("External: \thttp://"+getHostAddress()+":"+ port + contextPath);System.out.println("Profile(s): \t"+String.join(",", env.getActiveProfiles()));System.out.println("----------------------------------------------------------\n");}privateStringgetHostAddress(){try{returnjava.net.InetAddress.getLocalHost().getHostAddress();}catch(Exception e){return"127.0.0.1";}}}

8.3 测试端点

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

packagecom.example.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.client.discovery.DiscoveryClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;importjava.util.stream.Collectors;@RestController@RequestMapping("/actuator")publicclassActuatorController{@AutowiredprivateDiscoveryClient discoveryClient;@GetMapping("/services")publicList<String>getServices(){return discoveryClient.getServices().stream().map(service -> service +": "+ discoveryClient.getInstances(service)).collect(Collectors.toList());}@GetMapping("/info")publicStringinfo(){return"Spring Boot 4.0 with Spring Cloud Alibaba 2025";}}

第九步:Docker 部署配置

9.1 Dockerfile

FROM openjdk:21-jdk-slim # 设置工作目录 WORKDIR /app # 复制JAR文件 COPY target/springboot4-sc-alibaba-demo-1.0.0.jar app.jar # 暴露端口 EXPOSE 8080 # 设置JVM参数 ENV JAVA_OPTS="-Xmx512m -Xms256m -Djava.security.egd=file:/dev/./urandom" # 启动应用 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"] 

9.2 docker-compose.yml

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

version:'3.8'services:nacos:image: nacos/nacos-server:latest container_name: nacos-server environment:- MODE=standalone ports:-"8848:8848"networks:- sc-alibaba-net sentinel:image: bladex/sentinel-dashboard:latest container_name: sentinel-dashboard ports:-"8080:8080"networks:- sc-alibaba-net demo-app:build: . container_name: demo-service ports:-"8081:8081"environment:- SPRING_PROFILES_ACTIVE=docker - SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR=nacos:8848- SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR=nacos:8848- SPRING_CLOUD_SENTINEL_TRANSPORT_DASHBOARD=sentinel:8080depends_on:- nacos - sentinel networks:- sc-alibaba-net networks:sc-alibaba-net:driver: bridge 

总结

本文详细介绍了 Spring Boot 4.0 与 Spring Cloud Alibaba 2025 最新版本的完整整合方案,包括:

  1. 项目搭建和依赖配置
  2. Nacos 服务注册与发现
  3. Nacos 配置中心集成
  4. Sentinel 流量控制与熔断降级
  5. OpenFeign 声明式服务调用
  6. 高级配置和最佳实践
  7. Docker 容器化部署

通过这套完整的微服务解决方案,您可以快速构建高可用、可扩展的分布式应用系统。记得根据实际生产环境需求调整配置参数和安全设置。

Spring Cloud全栈实战:手撸企业级项目,从入门到架构师!

Read more

JAVA 异常处理:从原理到实战最佳实践

JAVA 异常处理:从原理到实战最佳实践

JAVA 异常处理:从原理到实战最佳实践 1.1 本章学习目标与重点 💡 掌握异常的分类与核心概念,理解异常处理的设计思想。 💡 熟练运用 try-catch-finally、throws、throw 处理异常。 💡 掌握自定义异常的编写与使用场景,规范异常处理流程。 ⚠️ 本章重点是 异常处理的最佳实践 和 避免常见误区,这是提升代码健壮性的核心技能。 1.2 异常的核心概念与分类 1.2.1 什么是异常 💡 异常是指程序运行过程中出现的非正常情况,它会中断程序的正常执行流程。 比如文件找不到、数组下标越界、空指针访问等,这些情况都会触发异常。 Java 中所有异常都是 Throwable 类的子类,异常处理的本质是捕获并处理这些非正常情况,保证程序可以继续运行或优雅退出。 1.2.2 异常的分类 Java 中的异常体系分为三大类,它们的父类都是 Throwable: * 是 JVM 内部的严重错误,

By Ne0inhk
Java Web开发基础与Servlet核心技术

Java Web开发基础与Servlet核心技术

Java Web开发基础与Servlet核心技术 15.1 学习目标与重点提示 学习目标:掌握Java Web开发的核心概念与Servlet技术的使用方法,包括Web应用的结构、Servlet的定义与使用、HTTP请求与响应的处理、会话管理、过滤器与监听器的使用,学会在实际开发中处理Web应用问题。 重点:Web应用的结构(目录结构、配置文件)、Servlet的定义与使用(Servlet接口、HttpServlet类、注解配置)、HTTP请求与响应的处理(Request、Response对象)、会话管理(Session、Cookie)、过滤器与监听器的使用、Web开发的实际应用场景。 15.2 Web开发概述 Java Web开发是用于处理Web应用的机制。 15.2.1 Web开发的定义 定义:Web开发是用于处理Web应用的机制。 作用: * 实现Web应用的开发。 * 实现客户端与服务器之间的通信。 * 实现动态网页的生成。 * 实现Web应用的部署与维护。 ✅ 结论:Web开发是用于处理Web应用的机制,作用是实现Web应用的开发、客户端与服务器之间的通

By Ne0inhk
纯 Java 手写 TopoJSON 生成器!零依赖实战教程

纯 Java 手写 TopoJSON 生成器!零依赖实战教程

目录 前言 一、TopoJSON 核心原理极简科普 1.1 TopoJSON 与 GeoJSON 的核心区别 1.2 TopoJSON 核心结构 二、开发环境与前置准备 2.1 开发环境要求 2.2 前置知识点 三、纯 Java 代码实现 TopoJSON 生成 3.1 基础结构与构造函数 3.2 核心转换方法(GeoJSON 转 TopoJSON) 3.3 拓扑构建核心方法 3.4 辅助方法与使用示例 代码核心说明 四、总结 前言         在GIS(地理信息系统)

By Ne0inhk
JAVA 集合框架进阶:List 与 Set 的深度解析与实战

JAVA 集合框架进阶:List 与 Set 的深度解析与实战

JAVA 集合框架进阶:List 与 Set 的深度解析与实战 1.1 本章学习目标与重点 💡 掌握 List 和 Set 接口的核心特性,理解不同实现类的底层原理与适用场景。 💡 熟练运用集合的常用方法,解决数据存储、查找、去重等实际开发问题。 💡 理解集合的线程安全问题,掌握线程安全集合的使用方式。 ⚠️ 本章重点是 不同集合的底层数据结构 和 性能对比,这是面试和开发中的核心考点。 1.2 List 接口:有序可重复的集合 1.2.1 List 接口的核心特性 💡 List 是有序集合,元素的存储顺序和插入顺序一致,支持通过索引访问元素。 List 允许存储重复元素,也可以存储 null 值。 List 接口的常用实现类有 ArrayList、LinkedList 和

By Ne0inhk