Spring Cloud Contract 2.2.2

SpringCloud Contract是一个伞形项目,提供解决方案帮助用户成功实现消费者驱动合同(CDC)的方法。它包括SpringCloud Contract Verifier项目,这是一个工具,允许在JVM基础上的应用程序进行消费者驱动合同(CDC)开发。该工具附带了用Groovy或YAML编写的合同定义语言(DSL),并用于生成JSON存根定义、消息路由以及验收测试,以确保服务器侧API实现符合合同。

Spring Cloud Contract is an umbrella project holding solutions that help users in successfully implementing the Consumer Driven Contracts approach. Currently Spring Cloud Contract consists of the Spring Cloud Contract Verifier project.

Spring Cloud Contract Verifier is a tool that enables Consumer Driven Contract (CDC) development of JVM-based applications. It is shipped with Contract Definition Language (DSL) written in Groovy or YAML. Contract definitions are used to produce following resources:

by default JSON stub definitions to be used by WireMock (HTTP Server Stub) when doing integration testing on the client code (client tests). Test code must still be written by hand, test data is produced by Spring Cloud Contract Verifier.

Messaging routes if you’re using one. We’re integrating with Spring Integration, Spring Cloud Stream and Apache Camel. You can however set your own integrations if you want to.

Acceptance tests (by default in JUnit or Spock) used to verify if server-side implementation of the API is compliant with the contract (server tests). Full test is generated by Spring Cloud Contract Verifier.

Spring Cloud Contract Verifier moves TDD to the level of software architecture.

To see how Spring Cloud Contract supports other languages just check out this blog post.
Features

When trying to test an application that communicates with other services then we could do one of two things:

deploy all microservices and perform end to end tests

mock other microservices in unit / integration tests

Both have their advantages but also a lot of disadvantages. Let’s focus on the latter. Deploy all microservices and perform end to end tests

Advantages:

simulates production

tests real communication between services

Disadvantages:

to test one microservice we would have to deploy 6 microservices, a couple of databases etc.

the environment where the tests would be conducted would be locked for a single suite of tests (i.e. nobody else would be able to run the tests in the meantime).

long to run

very late feedback

extremely hard to debug

Mock other microservices in unit / integration tests

Advantages:

very fast feedback

no infrastructure requirements

Disadvantages:

the implementor of the service creates stubs thus they might have nothing to do with the reality

you can go to production with passing tests and failing production

To solve the aforementioned issues Spring Cloud Contract Verifier with Stub Runner were created. Their main idea is to give you very fast feedback, without the need to set up the whole world of microservices.

Spring Cloud Contract Verifier features:

ensure that HTTP / Messaging stubs (used when developing the client) are doing exactly what actual server-side implementation will do

promote acceptance test driven development method and Microservices architectural style

to provide a way to publish changes in contracts that are immediately visible on both sides of the communication

to generate boilerplate test code used on the server side

Spring Boot Config
On the Producer Side

To start working with Spring Cloud Contract, you can add files with REST or messaging contracts expressed in either Groovy DSL or YAML to the contracts directory, which is set by the contractsDslDir property. By default, it is $rootDir/src/test/resources/contracts.

Then you can add the Spring Cloud Contract Verifier dependency and plugin to your build file, as the following example shows:

org.springframework.cloud spring-cloud-starter-contract-verifier test

The following listing shows how to add the plugin, which should go in the build/plugins portion of the file:

org.springframework.cloud spring-cloud-contract-maven-plugin ${spring-cloud-contract.version} true

Running ./mvnw clean install automatically generates tests that verify the application compliance with the added contracts. By default, the tests get generated under org.springframework.cloud.contract.verifier.tests.

As the implementation of the functionalities described by the contracts is not yet present, the tests fail.

To make them pass, you must add the correct implementation of either handling HTTP requests or messages. Also, you must add a base test class for auto-generated tests to the project. This class is extended by all the auto-generated tests, and it should contain all the setup information necessary to run them (for example RestAssuredMockMvc controller setup or messaging test setup).

The following example, from pom.xml, shows how to specify the base test class:

org.springframework.cloud spring-cloud-contract-maven-plugin ${spring-cloud-contract.version} true com.example.contractTest.BaseTestClass org.springframework.boot spring-boot-maven-plugin

INFO: The baseClassForTests element lets you specify your base test class. It must be a child of a configuration element within spring-cloud-contract-maven-plugin.

Once the implementation and the test base class are in place, the tests pass, and both the application and the stub artifacts are built and installed in the local Maven repository. You can now merge the changes, and you can publish both the application and the stub artifacts in an online repository. 2.2. On the Consumer Side

You can use Spring Cloud Contract Stub Runner in the integration tests to get a running WireMock instance or messaging route that simulates the actual service.

To do so, add the dependency to Spring Cloud Contract Stub Runner, as the following example shows:

org.springframework.cloud spring-cloud-starter-contract-stub-runner test

You can get the Producer-side stubs installed in your Maven repository in either of two ways:

By checking out the Producer side repository and adding contracts and generating the stubs by running the following commands:

$ cd local-http-server-repo
$ ./mvnw clean install -DskipTests

The tests are being skipped because the producer-side contract implementation is not in place yet, so the automatically-generated contract tests fail.

By getting already-existing producer service stubs from a remote repository. To do so, pass the stub artifact IDs and artifact repository URL as Spring Cloud Contract Stub Runner properties, as the following example shows:

stubrunner:
  ids: 'com.example:http-server-dsl:+:stubs:8080'
  repositoryRoot: https://repo.spring.io/libs-snapshot

Now you can annotate your test class with @AutoConfigureStubRunner. In the annotation, provide the group-id and artifact-id values for Spring Cloud Contract Stub Runner to run the collaborators’ stubs for you, as the following example shows:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {“com.example:http-server-dsl:+:stubs:6565”},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {

Use the REMOTE stubsMode when downloading stubs from an online repository and LOCAL for offline work.

Now, in your integration test, you can receive stubbed versions of HTTP responses or messages that are expected to be emitted by the collaborator service.
Quick start
Bootstrap your application with Spring Initializr.

**Spring Cloud Netflix 2.2.2** 是 Spring Cloud 生态中用于集成 **Netflix OSS(Open Source Software)组件** 的官方模块集合,旨在为基于 JVM 的微服务架构提供一套完整的分布式系统解决方案。该版本发布于 2020 年底,属于 **Spring Cloud Netflix 项目活跃维护的最后阶段之一**,之后该项目进入维护模式,官方推荐迁移到更现代的替代方案。 > ✅ 对应 Spring Boot 版本:**2.4.x** > 📦 所属版本线:**Spring Cloud 2020.0 (Ilford)** 的一部分 > 🔗 官方仓库:[https://github.com/spring-cloud/spring-cloud-netflix](https://github.com/spring-cloud/spring-cloud-netflix) --- ### 🧩 核心组件一览 | 组件 | 功能说明 | |------|----------| | **Eureka Server / Client** | 服务注册与发现(Service Registry and Discovery) | | **Ribbon** | 客户端负载均衡(Client-side Load Balancing) | | **Hystrix** | 断路器模式实现,防止雪崩效应 | | **Hystrix Dashboard** | 实时监控 Hystrix 指标面板 | | **Zuul 1.x** | 边缘网关(API Gateway),支持路由过滤 | | **Archaius** | 外部化配置管理(已被 Spring Cloud Config 取代) | --- ### 💡 典型微服务架构图(使用 Spring Cloud Netflix) ```text +------------------+ | Client | +--------+---------+ | +-------v--------+ | Zuul (API Gateway) +-------+--------+ | +---------v-----------+ +------------------+ | Eureka Server |<--->| Service Registry | +---------+-----------+ +------------------+ | +-------------+--------------+--------------+ | | | | +----v----+ +----v-----+ +----v-----+ +----v-----+ | OrderSvc| | UserSvc | | PaySvc | | LogSvc | | @Port 81| | @Port 82 | | @Port 83 | | @Port 84 | +---------+ +----------+ +----------+ +----------+ ↑ ↑ | Ribbon | Hystrix Command | 负载均衡 | 熔断/降级 ↓ ↓ +--------------------------------------------------+ | Hystrix Dashboard | | 监控各服务调用延迟、失败率等指标 | +--------------------------------------------------+ ``` --- ## 🔧 各组件详解(以 2.2.2 版本为准) ### 1. **Eureka Server(服务注册中心)** #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ``` #### 启用注解: ```java @SpringBootApplication @EnableEurekaServer public class EurekaApp { public static void main(String[] args) { SpringApplication.run(EurekaApp.class, args); } } ``` #### 配置文件 `application.yml`: ```yaml 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/ ``` > ✅ 生产建议:搭建高可用集群,相互注册。 --- ### 2. **Eureka Client(服务提供者 & 消费者)** #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` #### 自动注册到 Eureka: ```yaml spring: application: name: order-service server: port: 8081 eureka: client: service-url: defaultZone: http://localhost:8761/eureka ``` 无需额外代码即可被发现。 --- ### 3. **Ribbon(客户端负载均衡)** > ⚠️ 在 2.2.2 中仍默认启用,但已标记为 **DEPRECATED** #### 使用方式(RestTemplate + @LoadBalanced): ```java @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } ``` ```java @Service public class OrderService { @Autowired private RestTemplate restTemplate; public String callUserService() { // 自动通过 Eureka 查找 user-service 实例并负载均衡 return restTemplate.getForObject("http://user-service/api/user", String.class); } } ``` > ✅ 替代方案:**Spring Cloud LoadBalancer**(从 2020.0 开始默认) --- ### 4. **Hystrix(断路器)** #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` #### 启用熔断: ```java @SpringBootApplication @EnableCircuitBreaker public class OrderApp { ... } ``` 或使用组合注解: ```java @EnableHystrix ``` #### 编写容错逻辑: ```java @HystrixCommand(fallbackMethod = "getDefaultUser") public String getUser() { return restTemplate.getForObject("http://user-service/api/user", String.class); } public String getDefaultUser() { return "Fallback User"; } ``` --- ### 5. **Hystrix Dashboard(监控面板)** #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` #### 启用仪表盘: ```java @EnableHystrixDashboard ``` 访问地址:`http://localhost:8081/hystrix` 输入流地址:`http://user-service/actuator/hystrix.stream` > ⚠️ 注意:需每个服务暴露 `/actuator/hystrix.stream` 端点。 --- ### 6. **Zuul 1.x(边缘网关)** #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ``` #### 启用网关: ```java @EnableZuulProxy ``` #### 路由配置: ```yaml zuul: routes: order: path: /api/order/** service-id: order-service user: path: /api/user/** url: http://localhost:8082 ``` > ❌ 局限性:Zuul 1.x 基于阻塞 I/O,性能不如 Zuul 2.x 或 Spring Cloud Gateway。 --- ### ✅ 优势总结(截至 2.2.2) | 优点 | 说明 | |------|------| | 🚀 快速构建微服务骨架 | 几行配置即可完成服务注册、发现、调用 | | 🔗 组件完整闭环 | 提供从网关 → 注册中心 → 熔断 → 监控全链路支持 | | 📊 易于调试与可视化 | Eureka UI、Hystrix Dashboard 提供直观视图 | | 🧪 成熟稳定 | 经过大规模生产验证(如 Netflix 自身使用) | --- ### ⚠️ 局限性与现状 | 问题 | 说明 | |------|------| | ❌ **项目进入维护模式** | 自 Spring Cloud 2020.0 起,Netflix 组件不再积极开发 | | ❌ **Ribbon Hystrix 已停更** | Netflix 官方停止维护这两个库 | | ❌ **Zuul 1.x 性能瓶颈** | 不支持响应式编程,无法应对高并发场景 | | ❌ **缺乏对 WebFlux 支持** | 与 Spring WebFlux、Reactor 不兼容 | | ❌ **内存占用较高** | 尤其是 Hystrix 线程池模型导致资源消耗大 | --- ### 🔁 官方推荐替代方案(Spring Cloud 2020+) | 原组件 | 推荐替代 | |--------|-----------| | **Eureka Server** | 可继续使用(社区维护),或替换为 **Consul / Nacos** | | **Ribbon** | → **Spring Cloud LoadBalancer**(基于 Reactor) | | **Hystrix** | → **Resilience4j**(轻量、函数式、无反射开销) | | **Zuul 1.x** | → **Spring Cloud Gateway**(基于 WebFlux,高性能) | | **Hystrix Dashboard** | → **Micrometer + Prometheus + Grafana** | | **Archaius** | → **Spring Cloud Config + Bootstrap 配置迁移** | --- ### ✅ 迁移示例:Zuul → Spring Cloud Gateway #### 添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` #### 配置路由: ```yaml spring: cloud: gateway: routes: - id: order_route uri: lb://order-service predicates: - Path=/api/order/** filters: - AddRequestHeader=X-Trace-ID, {uuid} ``` > ✅ 支持异步非阻塞、动态路由、限流、熔断集成(通过 Resilience4j)。 --- ### ✅ 总结:Spring Cloud Netflix 2.2.2 的定位 | 项目 | 结论 | |------|------| | **历史地位** | 微服务革命的关键推动者,定义了早期 Spring 微服务标准 | | **当前状态** | **维护模式(Maintenance Mode)**,仅修复严重 Bug | | **适用场景** | - 现有老系统维护<br>- 学习微服务核心概念(服务发现、熔断、网关) | | **新项目建议** | 使用 **Spring Cloud Gateway + LoadBalancer + Resilience4j + Nacos/Consul** | | **学习价值** | 极高 —— 理解分布式系统设计思想的基础 | > 📣 **一句话总结:它是“微服务时代的奠基者”,虽已退出舞台中央,但仍是理解云原生架构演进的重要里程碑。** ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值