天天看點

Spring Cloud 學習之 Commons (Greenwich.SR6 )Spring WebFlux WebClient 負載均衡忽略網絡位址

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。

忽略網絡位址

繼續閱讀