编程语言
首页 > 编程语言> > spring-cloud-square源码速读(spring-cloud-square-okhttp篇)

spring-cloud-square源码速读(spring-cloud-square-okhttp篇)

作者:互联网

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

前文回顾

  1. 《五分钟搞懂spring-cloud-square》:说清楚了spring-cloud-square是什么
  2. 《spring-cloud-square开发实战(三种类型全覆盖)》:说清楚了spring-cloud-square怎么用

阅读源码的动机

  1. spring是java开源项目的典范,它的源码具备很高的质量和参考价值
  2. 和其他spring项目相比,spring-cloud-square的源码少得可怜,花最少的时间阅读spring项目的源码,这事儿我挺有兴趣
  3. 自动装配、拦截器、业务接口自动实现,这些技术都出现在spring-cloud-square项目中,看懂了学会了,对自己的项目有很高的参考价值

把握核心方向

  1. okhttp源码,只看关键部分,其余一律跳过
  2. 只想知道在使用spring-cloud-square-okhttp.jar的时候,为何输入服务名就能访问到对应的服务

下载源码

在这里插入图片描述

在这里插入图片描述

提前小结

  1. spring-cloud-square-okhttp.jar的使用者是个java应用,该应用要写代码实例化OkHttpClient.Builder对象
  2. spring.factories中配置的OkHttpLoadBalancerAutoConfiguration,会被spring框架扫到并实例化
  3. OkHttpLoadBalancerAutoConfiguration中实例化了OkHttpLoadBalancerInterceptor,并将LoadBalancerClient实例传给它
  4. OkHttpLoadBalancerAutoConfiguration中实例化了OkHttpClientBuilderCustomizer接口的实现,这里面是个lambda表达式,功能是将所有Interceptor传给lambda表达式对应的builder
  5. OkHttpLoadBalancerAutoConfiguration中实例化了OkHttpBuilderBeanPostProcessor,当步骤1中的OkHttpClient.Builder对象被实例化后,OkHttpBuilderBeanPostProcessor会调用OkHttpClient.Builder的addInterceptor对象,将OkHttpLoadBalancerInterceptor传给OkHttpClient.Builder
  6. 业务代码远程访问的时候,用OkHttpClient.Builder创建OkHttpClient对象,此时的OkHttpClient就得到了OkHttpLoadBalancerInterceptor,在远程访问时,业务代码传入的URL中是远程服务的名字,但是OkHttpLoadBalancerInterceptor会借助LoadBalancerClient将远程服务的名字替换成对应的IP和端口,然后再执行真正的网络请求

在这里插入图片描述

知识点补充(OkHttpClient.Builder.addInterceptor)

    public Builder addInterceptor(Interceptor interceptor) {
      if (interceptor == null) throw new IllegalArgumentException("interceptor == null");
      interceptors.add(interceptor);
      return this;
    }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

spring-cloud-square-okhttp

在这里插入图片描述

在这里插入图片描述

{
	"groups": [
	],
	"properties": [
		{
			"name": "okhttp.loadbalancer.enabled",
			"type": "java.lang.Boolean",
			"description": "Allows disabling OkHttp Spring Cloud LoadBalancer support.",
			"defaultValue": "true"
		}
	]
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.square.okhttp.loadbalancer.OkHttpLoadBalancerAutoConfiguration

在这里插入图片描述

在这里插入图片描述

package com.bolingcavalry.consumer;

import okhttp3.OkHttpClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
class OkHttpClientConfig{
    @Bean
    @LoadBalanced
    public OkHttpClient.Builder okHttpClientBuilder() {
        return new OkHttpClient.Builder();
    }
}

在这里插入图片描述

收获

  1. OkHttpClient的链式处理很精彩,Interceptor.intercept中强制要求执行chain.proceed方法,让我想起了装饰者模式中的叠加处理逻辑
  2. 如何用spring.factories + AutoConfig + BeanPostProcessor + SpringCloud LoadBalance协同作战,spring-cloud-square-okhttp算是给我上了一课,尤其是OkHttpLoadBalancerAutoConfiguration中三个构造器的顺序注入,让人有种鼓掌叫好的冲动,我能写出这样简洁明快的starter吗?

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界..
https://github.com/zq2599/blog_demos

标签:square,spring,OkHttpClient,源码,okhttp,cloud
来源: https://www.cnblogs.com/bolingcavalry/p/15497094.html