Spring Cloud云原生应用

Cloud Native云原生是一种遵循“12元素应用”理念的应用开发的风格,Spring Cloud针对云原生的概念,在Spring Boot的基础上提供了两个模块: Spring Cloud Context和Spring Cloud Commons。

Spring Cloud Context:上下文

spring-cloud-context上下文模块在Spring Boot的基础添加了一些其他模块会用到的共用功能:
这里写图片描述
Bootstrap Application Context
用来在主context之前加载外部配置文件,相应的配置文件是bootstrap.yml,可以通过
spring.cloud.bootstrap.enabled=false来禁用这个过程。
Encryption/Decryption
Spring Cloud提供了Environmentpre-processor用于在本地解密被加密过的属性值。如果需要加密功能则需要引入Spring Security RSA模块 (Maven用户的pom.xml 添加”org.springframework.security:spring-security-rsa”即可)
Endpoints
/env 用于更新Environment和重新绑定@ConfigurationProperties,修改log levels
/refresh 用于重载boot strap context并刷新@RefreshScopebeans
/restart 重启ApplicationContext(默认禁用)
/pause/resume 调用ApplicationContext的Lifecycle方法(stop() and start())

Spring Cloud Commons: 通用抽象

spring-cloud-commons模块提供了服务发现,负载均衡,断路器等抽象层,独立于具体的实现,被其他模块使用,如服务注册可以通过Eureka或Consul实现具体功能。
这里写图片描述
@EnableDiscoveryClient
该注解会在/META-INF/spring.factories查看DiscoveryClient接口的具体实现类,并添加自动配置。(如Eureka、Consul、Zookeeper)。同时commons模块还有DiscoveryHealthIndicator用于健康监控。
DiscoveryClient

DiscoveryHealthIndicator

ServiceRegistry
ServiceRegistry接口定义了注册和解除注册的方法名,Registration是个标记接口,表明一个注册项。ServiceRegistry的实现类默认会自动注册当前的服务,可通过
spring.cloud.service-registry.auto-registration.enabled=false禁用。
这里写图片描述

@LoadBalanced
通过该注解可以让RestTemplate通过Ribbon实现客户端的负载均衡功能。spring-cloud-netflix-core的RibbonAutoConfiguration实现ribbon自动配置。spring-cloud-netflix-eureka-client的RibbonEurekaAutoConfiguration自动配置ribbon结合eureka客户端。

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

Fail Retry
如果你的classpath存在spring-retry依赖,Ribbon默认会配置请求失败重试功能,可以使用Ribbon的my-client.ribbon.*配置项。可以通过spring.cloud.loadbalancer.retry.enabled=false禁用。可以配置自己的重试策略、回退策略、重试监听器等bean:

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

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

如果需要有多个RestTemplate实例,可以指定一个@Primary

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

HTTP Client Factories
commons默认提供了两种HTT client的工厂类(ApacheHttpClientFactory和OkHttpClientFactory),用于创建响应的HTTP客户端。通过设置
spring.cloud.httpclientfactories.apache.enabled=falsespring.cloud.httpclientfactories.ok.enabled=false 来禁用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章