前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天二十分钟spring-cloud的ribbon的使用

每天二十分钟spring-cloud的ribbon的使用

原创
作者头像
李子健
发布2022-07-24 11:41:35
1840
发布2022-07-24 11:41:35
举报
文章被收录于专栏:每日一善

1 ribbon提供的功能

项目地址: https://github.com/Netflix/ribbon

常用的模块

  • ribbon-loadbalancer
  • ribbon-eureka
  • ribbon-transport
  • ribbon-httpclient
  • ribbon-example
  • ribbon-core

2 ribbon的使用

2.1 原生使用

代码语言:java
复制
public class NativeRibbon {

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


    public NativeRibbon(List<Server> serverList) {
        loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
    }


    /**
     * 获取服务端ip
     *
     * @return String
     */
    public String getServerIp(String path) throws Exception {
        return LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).withRetryHandler(retryHandler).build().submit(
                new ServerOperation<String>() {
                    @Override
                    public rx.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 {

        List<Server> serverList = Arrays.asList(new Server("baidu.com", 80), new Server("sina.com.cn", 80));
        NativeRibbon nativeRibbon = new NativeRibbon(serverList);

        for (int times = 0; times < 10; times++) {
            System.out.println(nativeRibbon.getServerIp(""));
        }


    }
}

配置使用

代码语言:java
复制
@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

支持自定义拦截器

代码语言:txt
复制
MyLoadBalancerInterceptor

实现ClientHttpRequestInterceptor接口

自定义负载均衡实现IRule接口

支持重试

4 源码阅读

ribbon的抽象在core模块,核心在loadbalance

image.png
image.png
image.png
image.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 ribbon提供的功能
  • 2 ribbon的使用
    • 2.1 原生使用
      • 配置使用
      • 4 源码阅读
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档