超详细讲解SpringCloud Commons公共抽象的用法

网友投稿 302 2022-08-03


超详细讲解SpringCloud Commons公共抽象的用法

目录Spring Cloud Commons公共抽象@EnableDiscoveryClient服务注册ServiceRegistryRestTemplate的负载均衡RestTemplate的失败重试

本期主角——Spring Cloud Commons:公共抽象

Spring Cloud Commons公共抽象

Spring Cloud将服务发现、负载均衡和断路器等通用模型封装在一个公共抽象中,可以被所有的Spring Cloud客户端使用,不依赖于具体的实现(例如服务发现就有Eureka和Consul等不同的实现),这些公共抽象位于Spring Cloud Commons项目中。

@EnableDiscoveryClient

Commons提供@EnableDiscoveryClient注释。这通过META-INF/spring.factories查找DiscoveryClient接口的实现。Discovery Client的实现将在org.springframework.cloud.client.discovery.EnableDiscoveryClient键下的spring.factories中添加一个配置类。DiscoveryClient实现的示例是Spring Cloud Netflix Eureka,Spring Cloud Consul发现和Spring Cloud Zookeeper发现。

默认情况下,DiscoveryClient的实现将使用远程发现服务器自动注册本地Spring Boot服务器。可以通过在@EnableDiscoveryClient中设置autoRegister=false来禁用此功能。

服务注册ServiceRegistry

Commons现在提供了一个ServiceRegistry接口,它提供了诸如register(Registration)和deregister(Registration)之类的方法,允许您提供定制的注册服务。Registration是一个标记界面。

@Configuration

@EnableDiscoveryClient(autoRegister=false)

public class MyConfiguration {

private ServiceRegistry registry;

public MyConfiguration(ServiceRegistry registry) {

this.registry = registry;

}

// called via some external process, such as an event or a custom actuator endpoint

public void register() {

Registration registration = constructRegistration();

this.registry.register(registration);

}

}

每个ServiceRegistry实现都有自己的Registry实现。

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.getFor0bject("http://my-application/name",string.class) ;

return name;

}

}

URI需要使用服务名来指定需要访问应用服务,Ribbon客户端将通过服务名从服务发现应用处获取具体的服务地址来创建一个完整的网络地址,以实现网络调用。

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 LoadBalancedRetryListenerFactoryO {

@override

public RetryListener[] createRetryListeners (String service)

return new RetryListener[] {new RetryListener ( {

@Override

//重试开始前的工作

public boolean open(RetryContext context,RetryCallbackcallback){

return true;

}

//重试结束后的工作@Override

public void close(RetryContext context,RetryCallbackcallback,Throwable throwable){

}

//重试出错后的工作@Override

publicT,E extends Throwable> void onError(RetryContext context,RetryCal1backcallback,Throwable throwable){

}

}};

}};

}}

其中,自定义配置类中定义了生成LoadBalancedRetryListenerFactory实例的@Bean方法,该工厂类的createRetryListeners方法会生成一个RetryListener实例,用于进行网络请求的重试。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现动态验证码生成(java怎么实现验证码)
下一篇:elasticsearch源码分析index action实现方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~