pluginagentmarketplace

spring-microservices

Build cloud-native microservices - service discovery, config server, API gateway, resilience patterns

pluginagentmarketplace 2 Updated 5mo ago

Resources

3
GitHub

Install

npx skillscat add pluginagentmarketplace/custom-plugin-spring-boot/spring-microservices

Install via the SkillsCat registry.

SKILL.md

Spring Microservices Skill

Master building cloud-native microservices with Spring Cloud including service discovery, centralized configuration, API gateway, and resilience patterns.

Overview

This skill covers the complete Spring Cloud ecosystem for production-grade microservices architecture.

Parameters

Name Type Required Default Validation
discovery enum eureka eureka | consul | kubernetes
gateway enum spring-cloud-gateway spring-cloud-gateway | zuul
resilience enum resilience4j resilience4j | hystrix

Topics Covered

Core (Must Know)

  • Service Discovery: Eureka Server/Client, service registration
  • API Gateway: Spring Cloud Gateway, routing, filters
  • Configuration: Spring Cloud Config Server/Client
  • Load Balancing: Spring Cloud LoadBalancer

Intermediate

  • Resilience: Circuit breaker, retry, timeout, bulkhead
  • Distributed Tracing: Micrometer Tracing, Zipkin
  • Inter-Service Communication: RestClient, Feign

Advanced

  • Event-Driven: Spring Cloud Stream, Kafka, RabbitMQ
  • Service Mesh: Kubernetes integration
  • Multi-Region: Cross-region deployment patterns

Code Examples

Eureka Server

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryServerApplication.class, args);
    }
}
# application.yml
server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

Spring Cloud Gateway

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r
                .path("/api/users/**")
                .filters(f -> f
                    .stripPrefix(1)
                    .circuitBreaker(c -> c.setName("userCB").setFallbackUri("forward:/fallback"))
                    .retry(retryConfig -> retryConfig.setRetries(3)))
                .uri("lb://USER-SERVICE"))
            .build();
    }
}

Resilience4j Circuit Breaker

@Service
public class OrderClient {

    @CircuitBreaker(name = "orderService", fallbackMethod = "fallback")
    @Retry(name = "orderService")
    public List<Order> getOrders(Long userId) {
        return restClient.get()
            .uri("/orders?userId={userId}", userId)
            .retrieve()
            .body(new ParameterizedTypeReference<>() {});
    }

    public List<Order> fallback(Long userId, Throwable t) {
        log.warn("Fallback for userId: {}", userId);
        return Collections.emptyList();
    }
}
# resilience4j configuration
resilience4j:
  circuitbreaker:
    instances:
      orderService:
        failure-rate-threshold: 50
        wait-duration-in-open-state: 30s
        sliding-window-size: 10
  retry:
    instances:
      orderService:
        max-attempts: 3
        wait-duration: 1s

Distributed Tracing

management:
  tracing:
    sampling:
      probability: 1.0
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans

logging:
  pattern:
    level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}]"

Troubleshooting

Failure Modes

Issue Diagnosis Fix
Service not registered Wrong Eureka URL Check eureka.client.serviceUrl
Gateway 503 No instances Check service health
Circuit always open Threshold too low Adjust failure rate

Debug Checklist

□ Check Eureka dashboard: http://localhost:8761
□ Verify gateway routes: /actuator/gateway/routes
□ Check circuit breaker state: /actuator/circuitbreakers
□ Test config refresh: POST /actuator/refresh

Unit Test Template

@SpringBootTest
@WireMockTest(httpPort = 8089)
class OrderClientTest {

    @Autowired
    private OrderClient orderClient;

    @Test
    void shouldReturnOrdersWhenServiceAvailable() {
        stubFor(get(urlPathEqualTo("/orders"))
            .willReturn(aResponse()
                .withStatus(200)
                .withBody("[]")));

        List<Order> orders = orderClient.getOrders(1L);
        assertThat(orders).isEmpty();
    }

    @Test
    void shouldUseFallbackWhenServiceDown() {
        stubFor(get(urlPathEqualTo("/orders"))
            .willReturn(aResponse().withStatus(503)));

        List<Order> orders = orderClient.getOrders(1L);
        assertThat(orders).isEmpty(); // fallback
    }
}

Usage

Skill("spring-microservices")

Version History

Version Date Changes
2.0.0 2024-12-30 Resilience4j, Micrometer Tracing, gateway patterns
1.0.0 2024-01-01 Initial release