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-user
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: dev

server:
  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-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: user-service
          uri: lb://service-user    # lb表示负载均衡
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1        # 去掉/api前缀
        - id: order-service
          uri: lb://service-order
          predicates:
            - 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 {
    @Bean
    public 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辅助创作。

文章摘自:https://www.cnblogs.com/czlws/p/19788410