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的实现类有:

  1. Spring Cloud Netflix Eureka
  2. Spring Cloud Consul Discovery
  3. Spring Cloud Zookeeper Discovery

@EnableDiscoveryClient注解不是必须的,只要在类路径上有DiscoveryClient的实现就足以将本地spring boot注册到远程发现服务器,如eureka的@EnableEurekaServer注解。

服务健康检查(Health Indicator)
可通过实现 DiscoveryHealthIndicator 接口实现自定义健康检查

服务注册

commons提供了一个ServiceRegistry 接口让用户自定义服务注册。

EurekaServiceRegistry,ZookeeperServiceRegistry,ConsulServiceRegistry便是就实现了该接口。

禁用自动注册的两种方法:

  1. @EnableDiscoveryClient注解上加 autoRegister=false
  2. 设置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。