栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

okhttp3 url轮询负载均衡拦截器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

okhttp3 url轮询负载均衡拦截器

okhttp3添加拦截器
new OkHttpClient.Builder().addInterceptor(new PollInterceptor(urls)).build()

添加日志拦截器:

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            httpLoggingInterceptor.setLevel(Level.BODY);
new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build()
自定义轮询负载均衡拦截器

话不多说直接上代码:

public class PollInterceptor implements Interceptor {
    // url
    private final String[] urls;
    // url size
    private final int size;
    // 计数:下次轮询服务下标
    private final AtomicInteger nextUrlCyclicCounter;

    
    public PollInterceptor(String[] urls) {
        this.urls = urls;
        this.size = urls.length;
        this.nextUrlCyclicCounter = new AtomicInteger(0);
    }

    
    @Override
    public Response intercept(Chain chain) throws IOException {
        // 获取原始的originalRequest
        Request originalRequest = chain.request();
        // 不需要负载均衡
        if (size < 2) {
            return chain.proceed(originalRequest);
        }
        // 获取老的url
        HttpUrl oldUrl = originalRequest.url();
        // 获取originalRequest的创建者builder
        Request.Builder builder = originalRequest.newBuilder();
        // 重建新的HttpUrl,需要重新设置的url部分
        HttpUrl newHttpUrl = getHttpUrl(oldUrl);
        // 获取新newRequest
        Request newRequest = builder.url(newHttpUrl).build();
        // 请求
        return chain.proceed(newRequest );
    }

    
    public HttpUrl getHttpUrl(HttpUrl oldUrl) {
        // 获取url下标
        int index  = incrementAndGetModulo();
        // 获取新的url
        HttpUrl baseURL = HttpUrl.parse(urls[index]);
        // 重建新的HttpUrl,需要重新设置的url部分
        assert baseURL != null;
        return oldUrl.newBuilder()
                .scheme(baseURL.scheme())// http协议如:http或者https
                .host(baseURL.host())// 主机地址
                .port(baseURL.port())// 端口
                .build();
    }

    
    public int incrementAndGetModulo() {
        for (; ; ) {
            int current = nextUrlCyclicCounter.get();
            int next = (current + 1) % size;
            if (nextUrlCyclicCounter.compareAndSet(current, next)) {
                return next;
            }
        }
    }
}
其中核心代码:
public int incrementAndGetModulo() {
        for (; ; ) {
            int current = nextUrlCyclicCounter.get();
            int next = (current + 1) % size;
            if (nextUrlCyclicCounter.compareAndSet(current, next)) {
                return next;
            }
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/734159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号