赞
踩
服务发现,负载平衡和电路断路器等模式将它们带到一个通用的抽象层,可以由所有Spring Cloud客户端使用,而与实现无关
spring-cloud-commons.jar提供了@EnableDiscoveryClient注解。它将在META-INF/spring.factorie中查找DiscoveryClient的实现类。DiscoveryClient的实现类将一个配置类添加到spring.factories的org.springframework.cloud.client.discovery.EnableDiscoveryClient键下。
DiscoveryClient的实现类有:
@EnableDiscoveryClient注解不是必须的,只要在类路径上有DiscoveryClient的实现就足以将本地spring boot注册到远程发现服务器,如eureka的@EnableEurekaServer注解。
服务健康检查(Health Indicator)
可通过实现 DiscoveryHealthIndicator 接口实现自定义健康检查
commons提供了一个ServiceRegistry 接口让用户自定义服务注册。
EurekaServiceRegistry,ZookeeperServiceRegistry,ConsulServiceRegistry便是就实现了该接口。
禁用自动注册的两种方法:
- @EnableDiscoveryClient注解上加 autoRegister=false
- 设置spring.cloud.service-registry.auto-registration.enabled=false
服务注册执行器端点
commons提供了一个服务执行器端点 /service-registry,通过GET调用/service-registry/instance-status可以返回执行器端点的状态。
为了创建一个拥有负载均衡的RestTemplate ,只需创建一个RestTemplate 的bean并使用@LoadBalanced注解。
@Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; public String doOtherStuff() { // url必须使用虚拟主机名(即服务名,而不是主机名) String results = restTemplate.getForObject("http://服务名/上下文路径/资源地址", String.class); return results; } }
为了使用负载均衡RestTemplate,您需要在类路径中有一个负载均衡器实现。
推荐的实现是BlockingLoadBalancerClient,需要添加
org.springframework.cloud:spring-cloud-loadbalancer依赖。如果要使用
BlockingLoadBalancerClient,请确保您没有 RibbonLoadBalancerClient在项目
类路径中,因为出于向后兼容的原因,默认情况下将使用它。
WebClient可以自动配置为使用负载平衡器客户端。要创建负载均衡的WebClient,请创建一个WebClient.Builder @Bean并使用@LoadBalanced限定符,如以下示例所示:
@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() { // uri必须使用虚拟主机名(即服务名,而不是主机名) return webClientBuilder.build().get().uri("http://stores/stores") .retrieve().bodyToMono(String.class); } }
为了使用负载均衡WebClient,您需要在类路径中有一个负载均衡器实现。建议添加org.springframework.cloud:spring-cloud-loadbalancer依赖。然后ReactiveLoadBalancer将被使用。或者,此功能也可以与spring-cloud-starter-netflix-ribbon一起使用,但该请求会被一个non-reactive的LoadBalancerClient处理。
失败重试
public class MyClass {
@Autowired
private ReactorLoadBalancerExchangeFilterFunction lbFunction;
public Mono<String> doOtherStuff() {
return WebClient.builder().baseUrl("http://stores")
.filter(lbFunction)
.build()
.get()
.uri("/stores")
.retrieve()
.bodyToMono(String.class);
}
}
如果包含org.springframework.cloud:spring-cloud-loadbalancer依赖,则ReactorLoadBalancerExchangeFilterFunction将自动配置。如果没有org.springframework.cloud:spring-cloud-loadbalancer,但包含spring-cloud-starter-netflix-ribbon依赖,则LoadBalancerExchangeFilterFunction 将自动配置。
建议使用具有响应式的负载均衡ReactorLoadBalancerExchangeFilterFunction ,而不建议使用LoadBalancerExchangeFilterFunction。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。