诸如服务发现、负载均衡和熔断机制之类的模式适合于公共抽象层,可以由所有 Spring Cloud 客户端使用,独立于实现(例如,使用 Eureka 或 Consul 进行发现)。
Spring Cloud Commons 提供了
默认情况下,
Commons 创建一个 Spring Boot
Commons 现在提供了一个
下面的示例展示了使用中的 @Configuration @EnableDiscoveryClient(autoRegister=false) public class MyConfiguration { private ServiceRegistry registry; public MyConfiguration(ServiceRegistry registry) { this.registry = registry; } // called through some external process, such as an event or a custom actuator endpoint public void register() { Registration registration = constructRegistration(); this.registry.register(registration); } }
每个
如果你正在使用
默认情况下,
Spring Cloud Commons 提供了一个
@Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; public String doOtherStuff() { String results = restTemplate.getForObject("http://stores/stores", String.class); return results; } }
URI 需要使用虚拟主机名(即,服务名,而不是主机名)。Ribbon 客户端用于创建完整的物理地址。有关如何设置
@Configuration public class MyConfiguration { @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder(); } } public class MyClass { @Autowired private WebClient.Builder webClientBuilder; public Mono<String> doOtherStuff() { return webClientBuilder.build().get().uri("http://stores/stores") .retrieve().bodyToMono(String.class); } } URI 需要使用虚拟主机名(即,服务名,而不是主机名)。Ribbon 客户端用于创建完整的物理地址。
负载均衡的
如果希望在重试中实现 @Configuration public class MyConfiguration { @Bean LoadBalancedRetryFactory retryFactory() { return new LoadBalancedRetryFactory() { @Override public BackOffPolicy createBackOffPolicy(String service) { return new ExponentialBackOffPolicy(); } }; } }
如果希望将一个或多个 @Configuration public class MyConfiguration { @Bean LoadBalancedRetryListenerFactory retryListenerFactory() { return new LoadBalancedRetryListenerFactory() { @Override public RetryListener[] createRetryListeners(String service) { return new RetryListener[]{new RetryListener() { @Override public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) { //TODO Do you business... return true; } @Override public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) { //TODO Do you business... } @Override public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) { //TODO Do you business... } }}; } }; } }
如果你想要一个没有负载均衡的 @Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate loadBalanced() { return new RestTemplate(); } @Primary @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; @Autowired @LoadBalanced private RestTemplate loadBalanced; public String doOtherStuff() { return loadBalanced.getForObject("http://stores/stores", String.class); } public String doStuff() { return restTemplate.getForObject("http://example.com", String.class); } }
public class MyClass { @Autowired private LoadBalancerExchangeFilterFunction lbFunction; public Mono<String> doOtherStuff() { return WebClient.builder().baseUrl("http://stores") .filter(lbFunction) .build() .get() .uri("/stores") .retrieve() .bodyToMono(String.class); } }
URI 需要使用虚拟主机名(即,服务名称,而不是主机名)。
有时,忽略某些命名的网络接口是有用的,以便可以将它们排除在服务发现注册之外(例如,在 Docker 容器中运行时)。可以设置正则表达式的列表,以使期望的网络接口被忽略。下面的配置忽略了 application.yml. spring: cloud: inetutils: ignoredInterfaces: - docker0 - veth.* 你还可以通过使用正则表达式列表强制只使用指定的网络地址,如下面的示例所示: bootstrap.yml spring: cloud: inetutils: preferredNetworks: - 192.168 - 10.0 还可以强制使用只使用站点本地地址,如下面的示例所示: application.yml spring: cloud: inetutils: useOnlySiteLocalInterfaces: true 有关站点本地地址的详细信息,请参阅 Inet4Address.html.isSiteLocalAddress()。
Spring Cloud Commons 提供了用于创建 Apache HTTP 客户端(
Spring Cloud Commons 提供了一个 特性有两种类型:抽象和命名。
抽象特性是定义接口或抽象类的特性,以及创建的实现,如 命名的特性是没有它们实现的特定类的特性,例如 "Circuit Breaker"、"API Gateway"、"Spring Cloud Bus" 等等。这些特性需要名称和 bean 类型。
任何模块都可以声明任何数量的 @Bean public HasFeatures commonsFeatures() { return HasFeatures.abstractFeatures(DiscoveryClient.class, LoadBalancerClient.class); } @Bean public HasFeatures consulFeatures() { return HasFeatures.namedFeatures( new NamedFeature("Spring Cloud Bus", ConsulBusAutoConfiguration.class), new NamedFeature("Circuit Breaker", HystrixCommandAspect.class)); } @Bean HasFeatures localFeatures() { return HasFeatures.builder() .abstractFeature(Foo.class) .namedFeature(new NamedFeature("Bar Feature", Bar.class)) .abstractFeature(Baz.class) .build(); }
这些 bean 中的每一个都应该处于一个适当的保护 由于一些用户在设置 Spring Cloud 应用程序时有问题,我们决定添加兼容性校验机制。如果当前的设置与 Spring Cloud 要求不兼容,那么它将会中断,并附上一份报告,说明到底发生了什么错误。 现在,我们校验将哪个版本的 Spring Boot 添加到类路径中。 示例报告 *************************** APPLICATION FAILED TO START *************************** Description: Your project setup is incompatible with our requirements due to following reasons: - Spring Boot [2.1.0.RELEASE] is not compatible with this Spring Cloud release train Action: Consider applying the following actions: - Change Spring Boot version to one of the following versions [1.2.x, 1.3.x] . You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn]. If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.
为了禁用该特性,将 |