Spring Cloud Contract和Zuul

问题描述 投票:0回答:1

使用Spring Cloud Dalston,我们已经构建了一个代理服务,当然,它使用Zuul。我现在正在尝试添加Spring Cloud Contract测试,以验证我们的代理服务是否符合合同规定的预期。奇怪的是我可以发送请求并收回200状态代码,但预期的响应正文,内容类型标题等是空的,因此我的测试失败了。

是否有测试使用Zuul功能的服务所需的Spring Cloud Contract文档中未指定的其他配置?

spring-cloud spring-cloud-netflix spring-cloud-contract
1个回答
0
投票

在这里你有一个例子https://github.com/spring-cloud/spring-cloud-contract/issues/450

/**
 * Abstraction of configuration to test contracts with external microservices which are using a zuul-gateway in between.
 *
 * When a provider of data only allows communication through a Zuul-Gateway, a special way to ensure valid contracts is needed.
 * The Goal is to emulate the Zuul-Interception to be able to use the contracts stored within the providing service.
 *
 * F.e.: Consumer-Service consumes the Provider-Service, but the provider can not be called directly.
 * The Consumer-Service calls an URL with a prefix consisting of the name of the gateway ("gateway") and name of the
 * service (in this example "Provider-Service"). For example: http://gateway/provider/path/to/resource.
 * The contract provided by Provider-Service holds only a part of the provided URL (here: "/path/to/resource").
 * The resolution of "gateway" and "provider" is done within this class.
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EmbeddedZuulProxy.class,
    properties = {"server.port: 8080",
        "zuul.routes.provider.path: /provider/**",
        "zuul.routes.provider.service-id: provider",
        "zuul.routes.provider.url: http://localhost:9090/" //the url of the provider-stub is at port 9090
    },
    webEnvironment =  WebEnvironment.DEFINED_PORT) //defined port is important! Ribbon points to zuul, which then points to the provider-stub
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
//the stub runs on fixed port 9090, so that zuul can point to it
@AutoConfigureStubRunner(ids = "<group-id>:<artifact-id>:+:stubs:9090")
@DirtiesContext
public abstract class ZuulContractBase {

}

/**
 * Configuration and Setup of an embedded Zuul-Gateway.
 * This way it is possible to use contracts, stored in providing service
 */
@Configuration
@ComponentScan(basePackages = "<path.to.feign.client>") //autowiring feign client
@EnableAutoConfiguration
@EnableZuulProxy
@EnableFeignClients
@RibbonClient(name = "gateway", configuration = SimpleRibbonClientConfiguration.class)
class EmbeddedZuulProxy {

    @Bean
    RouteLocator routeLocator(DiscoveryClient discoveryClient,
                              ZuulProperties zuulProperties) {
        return new DiscoveryClientRouteLocator("/", discoveryClient, zuulProperties);
    }
}

/**
 * Ribbon Load balancer with fixed server list for "simple" pointing to localhost,
 * which holds the mocked zuul-gateway
 *
 * f.e. a call with feign would normally look like:
 * http://gateway/provider/rest/path/to/your/{url}
 * which is mapped to:
 * http://localhost:{zuulport}/provider/rest/path/to/your/{url}
 */
@Configuration
class SimpleRibbonClientConfiguration {

    @Value("${server.port}")
    private Integer zuulPort;

    @Bean
    public ServerList<Server> ribbonServerList() {
        return new StaticServerList<>(new Server("localhost", zuulPort));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.