《Spring Cloud微服务架构进阶》——2.2.2 Spring Cloud Commons:公共抽象

举报
华章计算机 发表于 2019/06/02 23:47:45 2019/06/02
【摘要】 本书摘自《Spring Cloud微服务架构进阶》——书中的第2章,第2.2.2节作者是朱荣鑫、张天、黄迪璇。

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实例,用于进行网络请求的重试。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。