微服务架构之均衡组件 Ribbon解析:应用进阶之Ribbon API

举报
qingting-fly 发表于 2021/08/06 00:19:46 2021/08/06
【摘要】 前面介绍了 Ribbon 的实现原理,本文将会主要介绍有关Ribbon的高级应用,主要有Ribbon的API使用,底层网络请求层的实现,和为已有spring系统集成Ribbon功能。 Ribbon APIRibbon除了与RestTemplate和Fegin一同使用之外,还可以依靠自己独立的API接口来实现一定的代码逻辑。比如下面的代码中,使用LoadBalancerBuilder的buil...

前面介绍了 Ribbon 的实现原理,本文将会主要介绍有关Ribbon的高级应用,主要有Ribbon的API使用,底层网络请求层的实现,和为已有spring系统集成Ribbon功能。

Ribbon API

Ribbon除了与RestTemplateFegin一同使用之外,还可以依靠自己独立的API接口来实现一定的代码逻辑。

比如下面的代码中,使用LoadBalancerBuilderbuildFixedServerListLoadBalancer创建出ILoadBalancer实例,然后使用LoadBalancerCommand.Builder的接口生成LoadBalancerCommand实例来发送网络请求。通过调用LoadBalancerCommandsubmit函数传入匿名的ServerOperation来完成网络请求的发送。LoadBalancerCommandsubmit函数中会使用你配置的负载均衡策略来选出一个服务器,然后调用匿名的ServerOperationcall函数,将选出的服务器传入,来进行网络传输的处理和操作。

FeignLoadBalancer就是使用RibbonLoadBalancerCommand来实现的有关Feign的网络请求的,只不过FeignLoadBalancer将网络请求交给其Client实例处理,而例子中的代码是交给HttpURLConnection

public class URLConnectionLoadBalancer {

    private final ILoadBalancer loadBalancer;
    private final RetryHandler retryHandler = new DefaultLoadBalancerRetryHandler(0, 1, true);

    public URLConnectionLoadBalancer(List<Server> serverList) {
        //使用LoadBalancerBuilder的接口来创建ILoadBalancer实例
        loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
    }

    public String call(final String path) throws Exception {
        //使用LoadBalancerCommand.Builder接口来配置Command实例,然后在回调函数中使用选中的服务器信息发送HTTP请求
        return LoadBalancerCommand.<String>builder()
                .withLoadBalancer(loadBalancer)
                .withRetryHandler(retryHandler)
                .build()
                .submit(new ServerOperation<String>() {
            @Override
            public Observable<String> call(Server server) {
                URL url;
                try {
                    url = new URL("http://" + server.getHost() + ":" + server.getPort() + path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    return Observable.just(conn.getResponseMessage());
                } catch (Exception e) {
                    return Observable.error(e);
                }
            }
        }).toBlocking().first();
    }

    public LoadBalancerStats getLoadBalancerStats() {
        return ((BaseLoadBalancer) loadBalancer).getLoadBalancerStats();
    }

    public static void main(String[] args) throws Exception {
        URLConnectionLoadBalancer urlLoadBalancer = new URLConnectionLoadBalancer(Lists.newArrayList(
                new Server("www.google.com", 80),
                new Server("www.linkedin.com", 80),
                new Server("www.yahoo.com", 80)));
        for (int i = 0; i < 6; i++) {
            System.out.println(urlLoadBalancer.call("/"));
        }
        System.out.println("=== Load balancer stats ===");
        System.out.println(urlLoadBalancer.getLoadBalancerStats());
    }
}

读者使用Ribbon独立的API可以在任何项目中使用Ribbon所提供的负载均衡机制。

除此之外,Ribbon除了可以和RestTemplateFeign一起使用之外,还可以与Netty进行集成,也就是说,Ribbon使用负载均衡策略选择完服务器之后,然后再交给Netty进行网络请求。

下一篇文章将会介绍使用Netty发送网络请求。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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