spring-cloud
4
总安装量
3
周安装量
#50023
全站排名
安装命令
npx skills add https://github.com/teachingai/agent-skills --skill spring-cloud
Agent 安装分布
claude-code
3
opencode
2
antigravity
2
codex
2
windsurf
2
gemini-cli
2
Skill 文档
Spring Cloud å¾®æå¡å¼åæå
æ¦è¿°
Spring Cloud æ¯ä¸å¥å®æ´çå¾®æå¡è§£å³æ¹æ¡ï¼æä¾äºæå¡æ³¨åä¸åç°ãé 置管çãç½å ³ãè´è½½åè¡¡ãçæå¨çç»ä»¶ã
æ ¸å¿ç»ä»¶
1. æå¡æ³¨åä¸åç°ï¼Eurekaï¼
Eureka Serverï¼
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application.ymlï¼
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
Eureka Clientï¼
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
application.ymlï¼
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
2. é ç½®ä¸å¿ï¼Config Serverï¼
Config Serverï¼
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
application.ymlï¼
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/example/config-repo
search-paths: '{application}'
Config Clientï¼
spring:
application:
name: user-service
cloud:
config:
uri: http://localhost:8888
name: user-service
profile: dev
3. API ç½å ³ï¼Gatewayï¼
Gateway é ç½®ï¼
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
application.ymlï¼
spring:
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
è·¯ç±é 置类ï¼
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user-service", r -> r
.path("/api/users/**")
.uri("lb://user-service"))
.route("order-service", r -> r
.path("/api/orders/**")
.uri("lb://order-service"))
.build();
}
}
4. è´è½½åè¡¡ï¼LoadBalancerï¼
ä½¿ç¨ RestTemplateï¼
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
ä½¿ç¨ WebClientï¼
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
æå¡è°ç¨ï¼
@Service
public class OrderService {
private final RestTemplate restTemplate;
public OrderService(@LoadBalanced RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public User getUser(Long userId) {
return restTemplate.getForObject(
"http://user-service/api/users/{id}",
User.class,
userId
);
}
}
5. çæå¨ï¼Circuit Breakerï¼
ä¾èµï¼
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
é ç½®ï¼
resilience4j:
circuitbreaker:
instances:
userService:
registerHealthIndicator: true
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10000
使ç¨ï¼
@Service
public class OrderService {
private final CircuitBreaker circuitBreaker;
private final RestTemplate restTemplate;
public OrderService(
CircuitBreakerRegistry circuitBreakerRegistry,
RestTemplate restTemplate
) {
this.circuitBreaker = circuitBreakerRegistry.circuitBreaker("userService");
this.restTemplate = restTemplate;
}
public User getUser(Long userId) {
return circuitBreaker.executeSupplier(() ->
restTemplate.getForObject(
"http://user-service/api/users/{id}",
User.class,
userId
)
);
}
}
6. æå¡è°ç¨ï¼Feignï¼
ä¾èµï¼
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
å¯ç¨ Feignï¼
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
å®ä¹ Feign Clientï¼
@FeignClient(name = "user-service")
public interface UserServiceClient {
@GetMapping("/api/users/{id}")
User getUserById(@PathVariable Long id);
@PostMapping("/api/users")
User createUser(@RequestBody User user);
}
使ç¨ï¼
@Service
public class OrderService {
private final UserServiceClient userServiceClient;
public OrderService(UserServiceClient userServiceClient) {
this.userServiceClient = userServiceClient;
}
public Order createOrder(Long userId, Order order) {
User user = userServiceClient.getUserById(userId);
// å建订åé»è¾
return order;
}
}
7. åå¸å¼è¿½è¸ªï¼Sleuthï¼
ä¾èµï¼
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
é ç½®ï¼
spring:
sleuth:
sampler:
probability: 1.0
å¾®æå¡æ¶æç¤ºä¾
项ç®ç»æ
microservices/
âââ eureka-server/ # æå¡æ³¨åä¸å¿
âââ config-server/ # é
ç½®ä¸å¿
âââ gateway/ # API ç½å
³
âââ user-service/ # ç¨æ·æå¡
âââ order-service/ # 订åæå¡
âââ product-service/ # ååæå¡
æå¡é´è°ç¨
忥è°ç¨ï¼Feignï¼ï¼
@FeignClient(name = "user-service")
public interface UserServiceClient {
@GetMapping("/api/users/{id}")
User getUserById(@PathVariable Long id);
}
弿¥è°ç¨ï¼æ¶æ¯éåï¼ï¼
@Service
public class OrderService {
private final RabbitTemplate rabbitTemplate;
public void publishOrderEvent(Order order) {
rabbitTemplate.convertAndSend("order.exchange", "order.created", order);
}
}
æä½³å®è·µ
1. æå¡æå
- æä¸å¡é¢åæå
- ä¿ææå¡ç¬ç«æ§
- é¿å æå¡é´å¼ºè¦å
2. é 置管ç
- 使ç¨é ç½®ä¸å¿ç»ä¸ç®¡ç
- åºåç¯å¢é ç½®
- æ¯æå¨æå·æ°
3. æå¡æ²»ç
- 使ç¨ç½å ³ç»ä¸å ¥å£
- å®ç°æå¡çæåé级
- çæ§æå¡å¥åº·ç¶æ
4. æ°æ®ç®¡ç
- æ¯ä¸ªæå¡ç¬ç«æ°æ®åº
- ä½¿ç¨ Saga 模å¼å¤çåå¸å¼äºå¡
- é¿å è·¨æå¡ç´æ¥è®¿é®æ°æ®åº
常ç¨ä¾èµ
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Circuit Breaker -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
ç¤ºä¾ Prompt
- “å¦ä½ä½¿ç¨ Spring Cloud æå»ºå¾®æå¡æ¶æï¼”
- “Spring Cloud Gateway å¦ä½é 置路ç±ï¼”
- “å¦ä½å¨ Spring Cloud ä¸ä½¿ç¨ Feign è¿è¡æå¡è°ç¨ï¼”
- “Spring Cloud ä¸å¦ä½å®ç°æå¡çæï¼”
- “å¦ä½é ç½® Spring Cloud Config é ç½®ä¸å¿ï¼”