还是和以往一样,说说最近的工作,最近的工作主要是业务相关的代码。

呼叫中心没有任何的技术含量,所以对我来说。可能处理好框架就编写业务相关的

昨晚说了租户的概念,我发现不管单体项目和集群项目中都有租户的概念

谈谈最近和朋友同事讨论这个概念

第一,使用datasouce的切面完成对某些sql的拦截

第二,采用mybaties-plus的租户,但是这里面有个登录的坑

第三,集群分库和读写分离的实现,如果多线程中有很多读和写,如果第一个是读的话是在从表,但是在本地的第二个sql中又是写的操作。但是一般线程都会封装本地的Threadlocal这个datasouce,就会照成第一个加载的datasouce的从表,而照成datasouce不能添加修改等操作

所以这个地方会采用切换到主库中,对于shardJdbc来说已经意识到这个情况,所以可以采用升级版本来解决这个问题

进入今天的主题,feign的使用

对于feign来是ribbon和hystrix的主要的核心功能

1、可插拔的http客户端

2、编码和解码 比如封装对于的对象中

3、底层还可以修改http请求的框架,如okhttp和netty api

4、可以定义gzip

5、自动的负载均衡

6、自带熔断器

7、自带重试,

8、请求日志详情

可能对于普通人来说都是使用最简单的方式

@feignClent (名字) ,但是在稍微高级一点的用法中,可以加入重试机制

比如采用retryer这个的默认的重试机制底层采用指数1.5的方式来实现的重试机制

还有log的日志,默认情况下是采用的none的方式来显示日志的。不显示日志。

可以采用Logger.level的枚举来定义,定义好了后别忘记了@FeignClent和配置文件中配置

还有可以实现一个接口RequstIntercepter这个类的apply方法的 doc说所有的http请求都会到拦截,实现apply方法就行了。

说完了高级一点的用法,说说源码吧

首先说明入口

@enableFeignClents里面有一个FeignClent的扫描器

openfeign底层resttemplate_加载

当然有一个很关键的东西

openfeign底层resttemplate_封装_02

扫描这个注解器到ioc中,具体的实现。我们继续跟进源码 

 1是加载一些主要的配置信息,

2这个是真正的注册        

openfeign底层resttemplate_加载_03

 这个是扫描包的方法,最后一个是注册客户端

openfeign底层resttemplate_封装_04

 继续看注册机干嘛了

添加了一个属性,也加入了fallback失败机制的函数

添加了fallbackFactory的一些数据

当然这个里面我可以采用mq的异步来执行失败逻辑,达到最终一致性的概念

openfeign底层resttemplate_加载_05

 注册BeanFfactoryBean,工程Bean里面不仅包含了具体的实现,也添加了写我们之前高级的用法

如Log retryer啊,还有intercepter的注册

openfeign底层resttemplate_封装_06

 同一个类里面采用了一个负载均衡的ribbon的,所以之前说的Feign是封装了ribbon和hystix的

openfeign底层resttemplate_封装_07

 我还没有看到hystrix,所以我明天再来看看hystrix的源码。看hystrix和Feign是如何组装到一起的

ps:之前看到了一个面试题:说如果从写了对象的hash和tostring feign还能不能封装对象。

源码说明,不能。 

openfeign底层resttemplate_负载均衡_08

openfeign底层resttemplate_加载_09

openfeign底层resttemplate_负载均衡_10

openfeign底层resttemplate_加载_11