环境准备与工具安装
确保已安装JDK 11或更高版本,推荐使用Amazon Corretto或OpenJDK。VSCode需安装Extension Pack for Java插件,包含Spring Boot Tools、Maven for Java等核心组件。通过Ctrl+Shift+P运行Java: Create Java Project创建Spring Boot项目。
项目依赖管理建议采用Maven,在pom.xml中需包含以下核心依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
网关服务配置
创建@SpringBootApplication主类并添加@EnableDiscoveryClient注解。在application.yml中配置路由规则:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
动态路由可通过实现RouteDefinitionLocator接口完成。熔断配置建议集成Resilience4j:
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultConfig() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.build());
}
OpenFeign声明式调用
在服务消费者模块添加@EnableFeignClients注解。定义接口时需注意:
@FeignClient(name = "order-service", configuration = FeignConfig.class)
public interface OrderClient {
@GetMapping("/orders/{id}")
ResponseEntity<Order> getOrder(@PathVariable Long id);
}
配置类需处理编码与超时:
public class FeignConfig {
@Bean
public Encoder feignEncoder() {
return new JacksonEncoder();
}
@Bean
public Request.Options options() {
return new Request.Options(5000, 30000);
}
}
全链路追踪集成
添加Sleuth与Zipkin依赖实现分布式追踪:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
配置文件中需指定收集端:
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0
调试与测试策略
VSCode需配置启动参数:
{
"type": "java",
"request": "launch",
"mainClass": "com.example.GatewayApplication",
"vmArgs": "-Dspring.profiles.active=dev"
}
测试Feign客户端建议采用WireMock:
@SpringBootTest
@AutoConfigureWireMock(port = 8081)
class OrderClientTest {
@Autowired
private OrderClient orderClient;
@Test
void testGetOrder() {
stubFor(get(urlEqualTo("/orders/1"))
.willReturn(aResponse()
.withHeader("Content-Type", "application/json")
.withBody("{\"id\":1}")));
ResponseEntity<Order> response = orderClient.getOrder(1L);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}
}
491

被折叠的 条评论
为什么被折叠?



