spring cloud 翻译-3. Spring Cloud Commons: Common Abstractions

3. Spring Cloud Commons: 公共抽象
诸如服务发现,负载均衡和断路器之类的模式适用于所有Spring Cloud客户端可以使用的公共抽象层,与实现无关(例如,使用Eureka或Consul发现)。

3.1 @EnableDiscoveryClient
Spring Cloud Commons 提供 @EnableDiscoveryClient 注解。这使用META-INF/spring.factories查找DiscoveryClient接口的实现。Discovery Client 的实现添加配置类至spring.factories下的org.springframework.cloud.client.discovery.EnableDiscoveryClient 键。DiscoveryClient的例子包括Spring Cloud Netflix Eureka,Spring Cloud Consul Discovery和Spring Cloud Zookeeper Discovery。
默认情况下,DiscoveryClient的实现会使用远程发现服务自动注册本地Spring Boot服务器。可以通过在@EnableDiscoveryClient 中设置autoRegister=false 来禁用此行为。
    @EnableDiscoveryClient 不再是必须的。你可以在类路径下放置DiscoveryClient实现以使Spring Boot应用程序向服务发现服务器注册。

3.1.1 健康指示器
Commons创建了一个Spring Boot HealthIndicator,DiscoveryClient实现可以通过实现DiscoveryHealthIndicator来参与。 要禁用复合HealthIndicator,请设置spring.cloud.discovery.client.composite-indicator.enabled = false。 基于DiscoveryClient的通用HealthIndicator是自动配置的(DiscoveryClientHealthIndicator)。 要禁用它,请设置spring.cloud.discovery.client.health-indicator.enabled = false。 要禁用DiscoveryClientHealthIndicator的description字段,请设置spring.cloud.discovery.client.health-indicator.include-description = false。 否则,它可能会像卷起的HealthIndicator的描述一样冒出来。

3.2 服务注册
Commons现在提供ServiceRegistry接口,该接口提供诸如注册(注册)和注销(注册)之类的方法,这些方法允许您提供自定义注册服务。 Registration是标记接口。
以下示例显示正在使用的ServiceRegistry:

    @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);
        }
    }

每个ServiceRegistry实现都有自己的Registry实现。
    ·ZookeeperRegistration与ZookeeperServiceRegistry一起使用
    ·EurekaRegistration与EurekaServiceRegistry使用
    ·ConsulRegistration与ConsulRegistry一起使用
如果你使用的是ServiceRegistry接口,则需有为正在使用的ServiceRegistry实现传递正确的Registry实现。

3.2.1 ServiceRegistry 自动注册
默认情况下,ServiceRegistry 自动注册正在运行的服务。要禁止该行为,你可以设置:*@EnableDiscoveryClient(autoRegister=false)来永久禁止自动注册。通过配置*.spring.cloud.service-registry.auto-registration.enabled=false 禁止该行为。
ServiceRegistry 自动注册事件
当服务自动注册时,将触发两个事件。 第一个事件名为InstancePreRegisteredEvent,在注册服务之前触发。 第二个事件名为InstanceRegisteredEvent,在注册服务后触发。 您可以注册一个ApplicationListener来监听并响应这些事件。
    ·如果spring.cloud.service-registry.auto-registration.enabled设置为false,则不会触发这些事件。

3.2.2 服务注册执行器端点
Spring Cloud Commons 提供 /Service-registry 执行器端点。此端点依赖于Spring Application Context中的Registration bean。使用GET调用/service-registry返回注册的状态。使用POST和JSON体调用相同的端点更改当前注册的状态为新的值。JSON体必须包含预期值的状态字段。关于在更新状态时的允许值和状态返回值请参考所使用的ServiceRegistry实现的文档。例如,Eureka已支持的状态是UP,DOWN,OUT_OF_SERVICE 和 UNKNOWN.

3.3 Spring RestTemplate 作为负载均衡客户端
RestTemplate 可以自动配置为使用ribbon。要创建负载均衡的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() {
            String results = restTemplate.getForObject("http://stores/stores", String.class);
            return results;
        }
    }


    警告:RestTemplate不再通过自动配置创建。个人应用程序必须自己创建。
URL需要使用虚拟主机名(即服务名称,而不是主机名)。Ribbon客户端用于创建完整的物理地址。有关如何设置RestTemplate的详细信息,请参考RibbonAutoConfiguration。

3.4 Spring WebClient 作为负载均衡客户端
WebClient 可以自动配置为使用LoadBalancerClient。要创建负载均衡的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() {
            return webClientBuilder.build().get().uri("http://stores/stores")
                            .retrieve().bodyToMono(String.class);
        }
    }

URL需要使用虚拟主机名(即服务名称,而不是主机名)。Ribbon客户端用于创建完整的物理地址。

3.4.1 重试失败请求
负载均衡的RestTemplate可以配置重试失败请求。默认情况下,该逻辑是禁止的。你可以通过添加Spring Retry到你的应用程序的类路径下来启用它。负载均衡的RestTemplate拥有与重试失败请求相关的一些Rinbbon配置值。你可以使用client.ribbon.MaxAutoRetries,client.ribbon.MaxAutoRetriesNextServer 与 client.ribbon.OkToRetryOnAllOperations 属性。如果你想使用类路径上的Spring Retry 来禁用重试逻辑,可以设置 spring.cloud.loadbalancer.retry.retry.enabled=false。有关这些属性的说明,请参考Ribbon文档。
如果要在重试中实现BackOffPolicy,需要创建LoadBalancedRetryFactory类型的bean并覆盖createBackOffPolicy方法:

    @Configuration
    public class MyConfiguration {
        @Bean
        LoadBalancedRetryFactory retryFactory() {
            return new LoadBalancedRetryFactory() {
                @Override
                public BackOffPolicy createBackOffPolicy(String service) {
                    return new ExponentialBackOffPolicy();
                }
            };
        }
    }

    前面的例子中的client应该替换为Ribbon客户端的名称。
如果要将一个或多个RetryListener实现添加到重试功能,需要创建类型为LoadBalancedRetryListenerFactory的bean,并返回要用于给定服务的RetryListener数组,如以下例子所示:

    @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...
                        }
                    }};
                }
            };
        }
    }  

3.5 多个RestTemplate 对象
如果你想创建一个非负载均衡的RestTemplate,则创建一个RestTemplate bean 并注入它。要访问负载均衡的RestTemplate,请在创建@Bean与使用@LoadBalanced 限定符,如以下例子所示:

    @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);
        }
    } 

    重要:请注意前面示例中的普通RestTemplate声明中使用@Primary注解来消除无限定@Autowired注入的歧义
    如果你遇到诸如java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89 的错误,尝试注入 RestOperations或设置spring.aop.proxyTargetClass=true。

3.6 Spring WebFlux WebClient 作为负载均衡客户端
WebClient 可以配置为使用 LoadBalancerClient。如果spring-webflux在类路径上LoadBalancerExchangeFilterFunction是自动配置的。以下例子显示如何配置WebClient以使用负载均衡器:

    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);
        }
    }

URL需要使用虚拟主机名(即服务名称,而不是主机名)。LoadBalancerClient用于创建完整的物理地址。

3.7 忽略网络接口
有时忽略某些命名的网络接口是有用的,这样它们就可以从服务发现注册中删除(例如,在docker容器中运行时)。 可以设置正则表达式列表来会略指定的网络接口。 以下配置忽略docker0接口和以veth开头的所有接口:
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()。

3.8 HTTP 客户端工厂
Spring Cloud Commons 为创建Apache HTTP客户端(ApacheHttppClientFactory)和OK HTTP客户端(OkHttpClientFactory)提供bean。只有OK HTTP jar 在了路径上才会创建OkHttpClientFactory bean。另外,Spring Cloud Commons 为创建两个客户端使用的连接管理器提供bean:对应Apache HTTP客户端的ApacheHttpClientConnectionMannagerFactory和对应OK HTTP客户端的OkHttpClientConnectionPoolFactory。如果要自定义在下游项目中HTTP客户端的创建方式,可以提供自己的这些bean实现。另外,你可以提供类型为HttpClientBuilder或OkHttpClient.Builder的bean,默认工厂使用这些构建器作为返回下游工程的构建器的基础。你也可以通过设置spring.cloud.httpclientfactories,apache.enabled 或 spring.cloud.httpclientfactories.ok.enabled 为false来禁用这些bean的创建。
    

2.9 启用特性
Spring Cloud Commons 提供 /features 执行器端点。该端点返回类路径上可用的特性以及它们是否启用。返回的信息包含特性类型,名称,版本和供应商。

3.9.1 特性类型
有两种类型的‘特性’:抽象和命名。
抽象特性是接口或抽象类定义和实现创建所在的特性(总觉的哪里怪怪的,原文:Abstract features are features where an interface or abstract class is defined and that an implementation the creates),如 DiscoveryClient,LoadBalancerClient 或LockService。抽象类或接口用于查找上下文中对应类型的bean。显示的版本是bean.getClass().getPackage().getImplementionVersion()。
命名特性是它们所实现的没有特定类的特性,诸如 "Circuit Breaker", "API Gateway", "Spring Cloud Bus", 和其他。这些特性需要名称和bean类型。

3.9.2 声明特性
任何模块都可以声明任意数量的HasFeature 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中的每一个都应该处于适当的保护@Configuration。

Part I. Cloud Native Applications 完!to be continued ······
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值