微服务调用链:Gateway + Feign + Resilience4j

知识库
知识库文档
/tech-stacks/spring-cloud/examples/微服务调用链:Gateway + Feign + Resilience4j.md

文档

Spring Cloud 微服务调用链示例

目标

构建完整微服务调用链:Gateway 路由 → 服务发现 → Feign 调用 → Resilience4j 熔断。

架构

Client → Gateway (8080) → User Service (8081)
                        → Order Service (8082)
                              └── Feign → User Service

完整代码

1. Eureka Server(注册中心)

// pom: spring-cloud-starter-netflix-eureka-server
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
# application.properties
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

2. User Service(服务提供者 8081)

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication { ... }

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    public Map<String, Object> getUser(@PathVariable Long id) {
        return Map.of("id", id, "name", "Alice", "email", "alice@example.com");
    }
}
spring.application.name=user-service
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

3. Order Service(服务消费者 8082)

// Feign 客户端
@FeignClient(name = "user-service", fallbackFactory = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    Map<String, Object> getUser(@PathVariable Long id);
}

@Component
public class UserClientFallback implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {
        return id -> Map.of("id", id, "error", "User service unavailable");
    }
}

// Controller
@RestController
@RequestMapping("/orders")
public class OrderController {
    @Autowired
    private UserClient userClient;

    @GetMapping("/{id}")
    public Map<String, Object> getOrder(@PathVariable Long id) {
        Map<String, Object> user = userClient.getUser(1L);
        return Map.of(
            "orderId", id,
            "product", "MacBook Pro",
            "user", user
        );
    }
}
spring.application.name=order-service
server.port=8082
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# Resilience4j 熔断配置
resilience4j.circuitbreaker.instances.user-service.sliding-window-size=10
resilience4j.circuitbreaker.instances.user-service.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.user-service.wait-duration-in-open-state=30s
// 启用 Feign + CircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication { ... }

4. API Gateway(网关 8080)

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication { ... }
# application.yml
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1
      default-filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20

server:
  port: 8080

运行步骤

# 按顺序启动
# 1. Eureka Server
./mvnw spring-boot:run -pl eureka-server

# 2. User Service
./mvnw spring-boot:run -pl user-service

# 3. Order Service
./mvnw spring-boot:run -pl order-service

# 4. Gateway
./mvnw spring-boot:run -pl gateway

测试

# 通过网关访问
curl http://localhost:8080/api/orders/1001

# 熔断测试:停掉 user-service 后再次请求
# 应该返回 fallback 结果

预期输出

{
  "orderId": 1001,
  "product": "MacBook Pro",
  "user": {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com"
  }
}

信息

路径
/tech-stacks/spring-cloud/examples/微服务调用链:Gateway + Feign + Resilience4j.md
更新时间
2026/5/30