Cloud Native云原生是一种遵循“12元素应用”理念的应用开发的风格,Spring Cloud针对云原生的概念,在Spring Boot的基础上提供了两个模块: Spring Cloud Context和Spring Cloud Commons。
spring-cloud-context上下文模块在Spring Boot的基础添加了一些其他模块会用到的共用功能:
Bootstrap Application Context:
用来在主context之前加载外部配置文件,相应的配置文件是bootstrap.yml
,可以通过
spring.cloud.bootstrap.enabled=false
来禁用这个过程。
Encryption/Decryption
Spring Cloud提供了Environment
pre-processor用于在本地解密被加密过的属性值。如果需要加密功能则需要引入Spring Security RSA模块 (Maven用户的pom.xml 添加”org.springframework.security:spring-security-rsa”即可)
Endpoints
/env
用于更新Environment
和重新绑定@ConfigurationProperties
,修改log levels
/refresh
用于重载boot strap context并刷新@RefreshScope
beans
/restart
重启ApplicationContext(默认禁用)
/pause
、/resume
调用ApplicationContext的Lifecycle方法(stop() and start())
spring-cloud-commons模块提供了服务发现,负载均衡,断路器等抽象层,独立于具体的实现,被其他模块使用,如服务注册可以通过Eureka或Consul实现具体功能。
@EnableDiscoveryClient
该注解会在/META-INF/spring.factories查看DiscoveryClient接口的具体实现类,并添加自动配置。(如Eureka、Consul、Zookeeper)。同时commons模块还有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 boolean open(RetryContext context, RetryCallback callback) {
//TODO Do you business...
return true;
}
@Override
public void close(RetryContext context, RetryCallback callback, Throwable throwable) {
//TODO Do you business...
}
@Override
public void onError(RetryContext context, RetryCallback 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=false
或spring.cloud.httpclientfactories.ok.enabled=false
来禁用。