Spring Cloud Commons(Greenwich.SR6)
- Spring Cloud Commons
- 服务发现
- 服务注册
- RestTemplate 负载均衡客户端
- WebClient 负载均衡客户端
- Spring WebFlux WebClient 负载均衡
- 忽略网络地址
Spring Cloud Commons
服务发现,负载平衡和电路断路器等模式将它们带到一个通用的抽象层,可以由所有Spring Cloud客户端使用,而与实现无关
服务发现
spring-cloud-commons.jar提供了@EnableDiscoveryClient注解。它将在META-INF/spring.factorie中查找DiscoveryClient的实现类。DiscoveryClient的实现类将一个配置类添加到spring.factories的org.springframework.cloud.client.discovery.EnableDiscoveryClient键下。
DiscoveryClient的实现类有:
- Spring Cloud Netflix Eureka
- Spring Cloud Consul Discovery
- Spring Cloud Zookeeper Discovery
@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 ,只需创建一个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,请创建一个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处理。
失败重试
Spring WebFlux WebClient 负载均衡
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。