找回密码
 立即注册
首页 业界区 安全 Spring Cloud微服务实战:服务注册、网关、负载均衡全家 ...

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

秦晓曼 3 天前
前言

Spring Cloud是Java微服务开发的事实标准,但很多开发者对它的核心组件还是一知半解。本文从零搭建一个完整的微服务项目,涵盖服务注册(Nacos)、网关(Spring Cloud Gateway)、负载均衡(LoadBalancer)三大核心组件。
一、项目架构
  1. microservice-demo/
  2. ├── service-gateway/        # API网关 (8080)
  3. ├── service-user/           # 用户服务 (8081)
  4. ├── service-order/          # 订单服务 (8082)
  5. └── pom.xml                 # 父POM
复制代码
二、依赖版本管理
  1. <properties>
  2.     <java.version>17</java.version>
  3.     <spring-boot.version>3.2.0</spring-boot.version>
  4.     <spring-cloud.version>2023.0.0</spring-cloud.version>
  5.     <spring-cloud-alibaba.version>2023.0.0.0</spring-cloud-alibaba.version>
  6. </properties>
  7. <dependencyManagement>
  8.     <dependencies>
  9.         <dependency>
  10.             <groupId>org.springframework.cloud</groupId>
  11.             spring-cloud-dependencies</artifactId>
  12.             <version>${spring-cloud.version}</version>
  13.             <type>pom</type>
  14.             <scope>import</scope>
  15.         </dependency>
  16.         <dependency>
  17.             <groupId>com.alibaba.cloud</groupId>
  18.             spring-cloud-alibaba-dependencies</artifactId>
  19.             <version>${spring-cloud-alibaba.version}</version>
  20.             <type>pom</type>
  21.             <scope>import</scope>
  22.         </dependency>
  23.     </dependencies>
  24. </dependencyManagement>
复制代码
三、服务注册中心 - Nacos

1. 下载安装Nacos
  1. # 下载Nacos
  2. wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.zip
  3. unzip nacos-server-2.3.0.zip
  4. cd nacos/bin
  5. # 单机启动
  6. ./startup.sh -m standalone
复制代码
2. 服务注册配置
  1. # application.yml (用户服务)
  2. spring:
  3.   application:
  4.     name: service-user
  5.   cloud:
  6.     nacos:
  7.       discovery:
  8.         server-addr: localhost:8848
  9.         namespace: dev
  10. server:
  11.   port: 8081
复制代码
3. 启动类
  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class UserServiceApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(UserServiceApplication.class, args);
  6.     }
  7. }
复制代码
四、API网关 - Spring Cloud Gateway

1. 添加依赖
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>com.alibaba.cloud</groupId>
  7.     spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  8. </dependency>
  9. <dependency>
  10.     <groupId>org.springframework.cloud</groupId>
  11.     spring-cloud-starter-loadbalancer</artifactId>
  12. </dependency>
复制代码
2. 网关路由配置
  1. spring:
  2.   application:
  3.     name: service-gateway
  4.   cloud:
  5.     nacos:
  6.       discovery:
  7.         server-addr: localhost:8848
  8.     gateway:
  9.       routes:
  10.         - id: user-service
  11.           uri: lb://service-user    # lb表示负载均衡
  12.           predicates:
  13.             - Path=/api/user/**
  14.           filters:
  15.             - StripPrefix=1        # 去掉/api前缀
  16.         - id: order-service
  17.           uri: lb://service-order
  18.           predicates:
  19.             - Path=/api/order/**
  20.           filters:
  21.             - StripPrefix=1
  22.       # 跨域配置
  23.       globalcors:
  24.         cors-configurations:
  25.           '[/**]':
  26.             allowedOrigins: "*"
  27.             allowedMethods: "*"
  28.             allowedHeaders: "*"
  29. server:
  30.   port: 8080
复制代码
五、服务间调用 + 负载均衡
  1. @RestController
  2. @RequestMapping("/user")
  3. @RequiredArgsConstructor
  4. public class UserController {
  5.     private final RestTemplate restTemplate;
  6.     private final DiscoveryClient discoveryClient;
  7.     // 方式1:使用RestTemplate + LoadBalancer
  8.     @GetMapping("/{id}")
  9.     public User getUser(@PathVariable Long id) {
  10.         return restTemplate.getForObject(
  11.             "http://service-order/order/" + id,
  12.             Order.class
  13.         );
  14.     }
  15.     // 方式2:使用OpenFeign(推荐)
  16.     // 定义Feign接口
  17. }
  18. // Feign接口
  19. @FeignClient(name = "service-order")
  20. public interface OrderFeignClient {
  21.     @GetMapping("/order/{userId}")
  22.     List<Order> getOrdersByUserId(@PathVariable Long userId);
  23. }
  24. // 在启动类上添加
  25. @EnableFeignClients
复制代码
六、负载均衡策略配置
  1. # application.yml
  2. service-order:
  3.   ribbon:
  4.     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  5. # 或通过配置类
  6. @Configuration
  7. public class LoadBalancerConfig {
  8.     @Bean
  9.     public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
  10.             Environment environment, LoadBalancerClientFactory factory) {
  11.         String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
  12.         return new RandomLoadBalancer(
  13.             factory.getLazyProvider(name, ServiceInstanceListSupplier.class),
  14.             name
  15.         );
  16.     }
  17. }
复制代码
七、完整启动流程


  • 启动 Nacos(8848)
  • 启动 service-user(8081)
  • 启动 service-order(8082)
  • 启动 service-gateway(8080)
  • 访问 http://localhost:8080/api/user/1
八、常见问题


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

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册