当前位置: 首页 > news >正文

Spring Cloud微服务实战:服务注册、网关、负载均衡全家桶指南

前言

Spring Cloud是Java微服务开发的事实标准,但很多开发者对它的核心组件还是一知半解。本文从零搭建一个完整的微服务项目,涵盖服务注册(Nacos)、网关(Spring Cloud Gateway)、负载均衡(LoadBalancer)三大核心组件。

一、项目架构

microservice-demo/
├── service-gateway/        # API网关 (8080)
├── service-user/           # 用户服务 (8081)
├── service-order/          # 订单服务 (8082)
└── pom.xml                 # 父POM

二、依赖版本管理

<properties><java.version>17</java.version><spring-boot.version>3.2.0</spring-boot.version><spring-cloud.version>2023.0.0</spring-cloud.version><spring-cloud-alibaba.version>2023.0.0.0</spring-cloud-alibaba.version>
</properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.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>

三、服务注册中心 - Nacos

1. 下载安装Nacos

# 下载Nacos
wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.zip
unzip nacos-server-2.3.0.zip
cd nacos/bin
# 单机启动
./startup.sh -m standalone

2. 服务注册配置

# application.yml (用户服务)
spring:application:name: service-usercloud:nacos:discovery:server-addr: localhost:8848namespace: devserver:port: 8081

3. 启动类

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

四、API网关 - Spring Cloud Gateway

1. 添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2. 网关路由配置

spring:application:name: service-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:routes:- id: user-serviceuri: lb://service-user    # lb表示负载均衡predicates:- Path=/api/user/**filters:- StripPrefix=1        # 去掉/api前缀- id: order-serviceuri: lb://service-orderpredicates:- Path=/api/order/**filters:- StripPrefix=1# 跨域配置globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods: "*"allowedHeaders: "*"server:port: 8080

五、服务间调用 + 负载均衡

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {private final RestTemplate restTemplate;private final DiscoveryClient discoveryClient;// 方式1:使用RestTemplate + LoadBalancer@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return restTemplate.getForObject("http://service-order/order/" + id, Order.class);}// 方式2:使用OpenFeign(推荐)// 定义Feign接口
}// Feign接口
@FeignClient(name = "service-order")
public interface OrderFeignClient {@GetMapping("/order/{userId}")List<Order> getOrdersByUserId(@PathVariable Long userId);
}// 在启动类上添加
@EnableFeignClients

六、负载均衡策略配置

# application.yml
service-order:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 或通过配置类
@Configuration
public class LoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory factory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

七、完整启动流程

  1. 启动 Nacos(8848)
  2. 启动 service-user(8081)
  3. 启动 service-order(8082)
  4. 启动 service-gateway(8080)
  5. 访问 http://localhost:8080/api/user/1

八、常见问题

  • 服务注册失败? 检查Nacos地址和namespace配置
  • 网关503? 确认下游服务已启动并注册到Nacos
  • 负载均衡不生效? 确认使用了 lb:// 协议前缀

总结

本文完整搭建了Nacos + Gateway + LoadBalancer的微服务架构。核心要点:服务注册发现让服务解耦,网关统一入口,负载均衡实现高可用。后续可加入Sentinel限流、Seata分布式事务等组件。

本文由AI辅助创作。

http://www.jsqmd.com/news/550819/

相关文章:

  • 从智能电池到服务器风扇:手把手解析SMBus的15种通信协议与应用实例
  • ISP图像处理 - YUV域降噪与边缘增强实战解析
  • 从干涉仪到Zernike系数:一文搞懂Zemax中那些‘表面公差’到底在测什么
  • 别再只抄代码了!手把手教你调试YOLOv5模型输出,彻底搞懂每个数字的含义
  • 高尔夫/跑步爱好者必看:用Xsens DOT传感器优化运动表现的3种方法
  • 4个AI字幕优化技巧:如何用VideoCaptioner实现专业级字幕纠错
  • 2026医药招商平台白皮书及优质服务商推荐 - 优质品牌商家
  • 从AST节点设计到递归下降解析:图解编译原理实验中的语法树构建
  • 别再只当数据包了!用Python的nibabel库拆解.nii.gz文件,手把手教你提取MRI图像的元数据和三维数组
  • 小白也能懂!CosyVoice2-0.5B API调用全攻略,快速生成克隆语音
  • Android应用配置避坑指南:如何正确使用ApplicationInfo flags提升应用性能
  • 从不同角度看,智能安全带的出现带来了什么意义
  • Logisim实战:8位模型计算机从零搭建指南(附完整.circ文件)
  • Akagi:麻将智能决策的创新辅助方法——从牌局困境到战术精通的实践指南
  • Obsidian数据迁移终极指南:3小时完成跨平台笔记无损转移
  • Fluent Meshing周期性界面设置避坑指南:从自动识别失效到手动配置成功的完整流程
  • Rockchip Linux SDK编译配置实战:从板级到内核的精准定制
  • dddd实战指南:从资产测绘到精准漏洞挖掘的一体化红队工作流
  • 告别OOM:用HuggingFace Tokenizers的train_from_iterator分批训练超大语料库
  • 锐捷SDN实战:手把手教你用RG-ONC控制器管理三台交换机(附MobaXterm配置)
  • Ozon买家纠纷如何高效解决?借CaptainAI轻松化解!
  • 企业架构实践与创新观察报告
  • 从零构建嵌入式Linux MIPI摄像头驱动:以RK3566+OV5695为例的V4L2框架实战解析
  • Firefly RK3568开发板刷OpenHarmony 3.1保姆级教程(含触摸屏适配)
  • ZYNQ动态加载FPGA比特流:从BOOT.BIN分离到独立更新的实践指南
  • 如何永久保存数字记忆:开源工具打造你的个人AI数据保险箱
  • 快速上手p5.js Web Editor:新手必知的3大核心问题与终极解决方案
  • 上位机开发避坑指南:为什么你的Modbus通信总超时?(附Wireshark抓包分析)
  • 《不容错过!AI应用架构师打造企业AI研发标准的实战路径》
  • 别再死磕公式了!三自由度机械臂逆解求解的3种实用思路与避坑指南