《Spring Cloud微服务架构进阶》——2.2.2 Spring Cloud Commons:公共抽象
2.2.2 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 Registration> {
void register(R registration);
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() {
//使用restTemplate访问my-application微服务的/name接口
String name = restTemplate.getForObject("http://my-application/name", String.class);
return name;
}
}
URI需要使用服务名来指定需要访问应用服务,Ribbon客户端将通过服务名从服务发现应用处获取具体的服务地址来创建一个完整的网络地址,以实现网络调用。
4. RestTemplate的失败重试
负载均衡的RestTemplate可以添加失败重试机制。默认情况下,失败重试机制是关闭的,启用方式是将Spring Retry添加到应用程序的类路径中。还可以设置spring.cloud.loadbalancer.retry.enabled=false禁止类路径中Spring retry的重试逻辑。
如果想要添加一个或者多个RetryListener到重试请求中,可以创建一个类型为LoadBalancedRetryListenerFactory的Bean,用来返回将要用于重试机制的RetryListener的列表,如下代码所示:
@Configuration
public class RryListenerConfiguration {
@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) {
return true;
}
// 重试结束后的工作
@Override
public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
}
// 重试出错后的工作
@Override
public <T, E extends Throwable> void replaceString(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
}
}};
}
};
}
}
其中,自定义配置类中定义了生成LoadBalancedRetryListenerFactory实例的@Bean方法,该工厂类的createRetryListeners方法会生成一个RetryListener实例,用于进行网络请求的重试。
- 点赞
- 收藏
- 关注作者
评论(0)