一 概述
SpringCloud提供了一系列组件,可以在分布式系统中直接使用,这些组件大部分由Spring Boot提供,Spring Cloud在此基础上添加了分布式系统的相关特性。
Spring Cloud依赖于Spring Cloud Context和Spring Cloud Commons两个公共库,其中Spring Cloud Context为Springcloud应用程序上下文(ApplicationContext)提供了大量的实用工具和特性服务,而Spring Cloud Commons是针对不同的SpringCloud实现(如Spring Cloud Netflix Eureka 和 Spring Cloud Consul两种不同的服务注册和发现实现)提供了上层抽象和公共类。
二 Spring Cloud Context
1. Bootstrap上下文
除了应用上下文配置(application.yml或者application.properties)之外,Spring Cloud应用程序还额外提供与Bootstrap上下文配置相关的应用属性。Bootstrap上下文对于主程序来说是一个父级上下文,它支持从外部资源中加载配置文件,和解密本地外部配置文件中的属性。Bootstrap上下文和应用上下文共享一个环境(Environment),这是所有Spring应用程序的外部属性来源。一般来讲,BootStrap上下文中的属性优先级较高,所以它们不能被本地配置所覆盖。
这部分不是很理解,后续搞懂了再来总结。
三 Spring Cloud Commons
Spring Cloud将服务发现,负载均衡和断路器等通用模型封装在一个公共抽象中,可以被所有的Spring Cloud客户端使用,不依赖于具体的实现(例如服务发现就有Eureka和Consul等不同的实现),这些公共抽象位于Spring Cloud Commons项目中。
1. @EnableDiscoveryClient注解
@EnableDiscoveryClient注解用于在META-INF/spring.factories文件中查找DiscoveryClient(DiscoveryClient为服务发现功能抽象类)的实现。
spring.factories文件的org.springframework.cloud.client.discovery.EnableDiscoveryClient配置项可以指定DiscoveryClient的实现类。
DiscoveryClient目前的实现有Spring Cloud Netflix Eureka,Spring Cloud Consul Discovery和Spring Cloud Zookeeper Discovery。
DiscoveryClient的实现类会自动将本地的Spring Boot服务注册到远程服务发现中心。可以通过在@EnableDiscoveryClient中设置autoRegister = false来禁止自动注册行为。
在Finchley版本的Spring Cloud中,不需要显式使用@EnableDiscoveryClient来开启客户端的服务注册于发现功能。只要在类路径中,存在DiscoveryClient的实现就能使Spring Cloud应用注册到服务发现中心。
2. 服务注册(ServiceRegistry)
Spring Cloud Commons的ServiceRegister接口提供register(服务注册)和deregister(服务下线)方法,使得开发者可以自定义注册服务的逻辑。
public interface ServiceRegistry<R extends Reg stration> {
void register(R reg stration) ;
void deregister(R registration) ;
}
每一个ServiceRegistry的实现都拥有自己的注册表实现,如Eureka,Consul等。
3. RestTemplate的负载均衡
创建RestTemplate实例的时候,使用@LoadBalanced注解可以将RestTemplate自动配置为负载均衡的状态。@LoadBalanced将使用Ribbon为RestTemplate执行负载均衡策略。
创建负载均衡的RestTemplate不再能通过自动配置来创建,必须通过配置类创建,具体实例如下所示:
@Configuration
public class MyConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
public class MyApplication {
@Autowired
private RestTemplate restTemplate ;
public String getMyApplicationName() {
//使用resTemplate访问my-application微服务的/name接口
String name = restTemplate.getForObject(“http://myapplication/name”,String.class);
return name;
}
}
根据代码可知,URI需要使用服务名来指定需要访问应用服务,Ribbon客户端将通过服务名从服务发现应用处获取具体的服务地址来创建一个网络地址,以实现网络调用。
4 RestTemplate的失败重试
负载均衡的RestTemplate可以添加失败重试机制。默认情况下,失败重试机制是关闭的,启用方式是将Spring Retry添加到应用的类路径中。还可以设置spring.cloud.loadbalancer.retry.enabled=false禁止类路径中Spring retry的重试逻辑。
如果想要添加一个或者多个RetryListener到重试请求中,可以创建一个类型为LoadBalanceRetryListenerFactory的Bean,用来返回将要用于重试机制的RetryListener的列表。
@Configuration
public class RryListenerConfiguration {
@Bean
LoadBalancedRetryListenerFactory retryListenerFactory() {
return new LoadBalancedRetryListenerFactory() {
@Override
public RetryListener[] createRetryListeners(String service) {
return new RetryListener[]{new RetryListener() {
}
}
}
}
其中,自定义配置类中定义了生成LoadBalancedRetryListenerFactory实例的@Bean方法,该工厂类的createRetryListeners方法会生成一个RetryListener实例,用于进行网络请求的重试。
该部分内容还没完全弄明白,暂时如此,待续......!