肥朝

其他

从一道真实的面试题,聊聊消息机制。

前言上周一同事面试遇到一个比较有趣的面试题,大意是,我们在项目中,像分布式消息队列,比如RocketMQ、Kafka等都用得很多了,他们的优点比如解耦大家都很熟了,那么,有没有在项目中,用到一些单机的队列,或者事件通知机制?坦白说,绝大部分同学平时开发,都是CRUD为主,除了分布式队列外,能和队列沾上边的,还是比较少的。可能比较好想到的是,线程池中有队列这么一个概念。但是这种生拉硬扯的队列“远方亲戚”可能也不是面试官想听的,肥朝就根据自己的经验,说一下单机的队列,或者事件通知机制的场景。场景描述先简单交代背景,每个公司肯定有一些前后端交互的规范,比如常见的请求头参数、响应json格式等等,这个很好理解。所以我们会在spring-boot-starter-web的基础上,进行二次开发,做一些增强,这里命名为feichao-boot-starter-web。(不要问我feichao是什么)特别声明,我们之所以做二次开发,并不仅仅是为了上述的功能,增强的全部的功能不是本文重点,这里暂不介绍。但是我们知道,肯定有一些不需要校验请求头的url,比如我们也对Swagger做了一些增强feichao-boot-starter-swagger。因此,就需要在feichao-boot-starter-web做一些忽略校验的URL。public
2020年3月24日
其他

自荐!

肥朝曾经也号称白酒一斤半,啤酒随便灌,一晚上对付三十几个,喝伤
2019年9月29日
其他

阿里不让多表join?我偏要!

sc.t_id=teacher.t_Id);我来分析一下这个语句:4张表等值join,还有一个子查询。算是比较简单的sql语句了(相比ERP动就10张表的哦,已经很简单了)。我
2019年7月18日
其他

阿里规范不建议多表join,可这SQL要怎么写啊?

前言我们先来看一下阿里开发手册的描述手册上写着【强制】,但是肥朝相信很多同学项目里面的代码都不满足这个要求。但是关键问题是,不用join,这SQL究竟要怎么写啊!高性能MySQL高性能MySQL这本书相信大家都看过,在分解大的查询这部分提到。分解关联查询,即对每个要关联的表进行单表查询,然后将结果在应用程序中进行关联。下面的这个查询:SELECT
2019年7月15日
其他

图解源码 | SpringBoot中拓展SpringMVC原理

System.out.println("公众号:肥朝(id:feichao_java),afterCompletion");
2019年5月5日
其他

编码不规范,同事真的会两行泪?

案发现场我们在Dubbo中定义一个接口,这个接口采用上方说的欺骗性的命名方式,这个getFeiChaoInfo()中并没有返回值。好了,然后我们将这个服务暴露,然后启动。按照肥朝之前的观念,命名不规范,无非是理解起来恶心了点,但是跑还是能跑的。结果一启动之前看过肥朝Dubbo源码解析的同学,对这个服务暴露再熟悉不过了,根据异常栈,我们很快定位到了关键位置。就算你连Dubbo都没用过也没关系,其实你从javassist和CannotCompileException这两个关键词就能猜到异常的原因。javassist常用于操作字节码,CannotCompileException根据我小学三年级的英语都知道是无法编译异常。那为什么出现没办法编译通过呢?我们把这段Dubbo拼接出来,准备要用javassist进行编译的代码格式化一下就一目了然了格式化后就很明显可以看出,getFeiChaoInfo()这个方法没有返回值是编译不过去的。那么这个时候有同学就想说了,Dubbo这段拼接代码进行编译的逻辑有bug啊。鉴于公众号目前有小部分粉丝没用过Dubbo,我们先不讨论Dubbo为什么要这么做,我们反省一下自己,你这种欺骗性的方法名本身就有问题,再者,就算Dubbo把这个代码的容错性做好了又如何,你这种不规范的编码习惯,就算成功,也是偶然成功!,不信?肥朝带你再看一个案发现场。又一起案发现场在项目中,我们经常会遇到DTO、BO、DO等转换的问题,很多同学用的是Apache或者Spring的BeanUtils来做copy,我们来一组性能测试另外肥朝给大家总结了一条结论凡是和反射相关的操作,基本都是低性能的。凡是和字节码相关的操作,基本都是高性能的。由此可见,在各种POJO间转化,最高性能的肯定是直接操作get/set,但是这样写,肯定不够优雅。从性能报告明显看出较优方案是使用cglib的BeanCopiers。BeanCopiers怎么使用这个自己搜索一下就知道了,那么我们再来看一起案发现场。为了使用建造者模式,我们有同事这么做好了。然后跑一个简单的demo看到有异常一些同学就慌了,就产生了这个东西虽然性能高,但是感觉好像不稳定的样子错觉。其实并不是这东西不稳定,关键还是在于你会不会用。再说了,世界每天都在变,除了肥朝会稳定给大家输出原创之外,还有什么是稳定的呢?为此,肥朝给大家总结了以下几点使用上的常识1.当源类和目标类的属性名称、类型都相同,拷贝结果棒棒哒。2.当源对象和目标对象的属性名称相同、类型不同,那么名称相同而类型不同的属性不会被拷贝。另外注意,原始类型(int,short,char)和
2019年4月17日
其他

原理暂且不谈,定时器你当真会用?

1000))后,执行下一个任务.这种是最容易理解的,所以放在第一个来讲.用一个图来表示的话,更容易理解.如下:可以用输出日志验证上述结论12019-04-07
2019年4月8日
其他

一次StackOverflowError排查,原因竟然和Dubbo有关!

前言某天业务方的同事和我反馈,说系统出现了StackOverflowError.坦白说,Exception见得过了,但是Error倒是很少出现,此时他的心情是这样的一波猛如虎的操作我们先来看血淋淋的案发现场从异常栈中很明显发现出现了死循环,其实StackOverflowError绝大多数都是死循环、递归引起的.那么,这为什么会出现循环调用呢?我们根据这个溢出的案发现场查看源码如果你是用idea的话,他还会用图标提示你,这里会出现递归调用.那么问题来了,这里究竟为什么会循环递归调用?由于这个问题,是必然重现的,对于之前查看过我源码解析的老粉丝来说简直是so
2019年3月15日
其他

面试官问我,Redis分布式锁如何续期?懵了。

前言上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了。]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的老粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所以连夜写了本篇,希望能对他接下来的面试有所帮助.真实案例Redis分布式锁的正确姿势据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多System.out.println();等语句.其实Redis分布式锁比较正确的姿势是采用redisson这个客户端工具.具体介绍可以搜索最大的同性交友网站github.如何回答首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So
2019年3月11日
其他

面试官问我,使用Dubbo有没有遇到一些坑?我笑了。

前言17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍.根据我的面试经验而言,能在简历上写上原理、源码等关键词的,是非常具备核心竞争力的.上周和一个公众号粉丝交流面试情况如下面试的时候,把源码一波分析,令面试官虎躯一震!在一阵前戏过后,以为接下来无非就是身体的一顿抽搐一切变得索然无味,不料面试官来了句令剧情发生了反转"你对Dubbo源码这么熟悉,那请问你使用的时候,有没有遇到什么坑"我擦,毫无准备的他,菊花顿时一紧!此时就面临唬住了50K,唬不住就只能5K的局面,慌了!论如何反杀相信大家面试都遇到过类似问题,因为源码解析网上很多,很多人"考前突击"一下,但是遇到喜欢问细节的面试官,终究难逃法眼,无处遁形.遇到这个问题,我们如何反杀一波?那么我就从一次聊天记录说起,毕竟只有关注肥朝公众号,拥有真实场景的源码实战(非常重要),遇到这类问题,才不至于出现猛虎落泪的情形真实场景描述那么我们把业务相关去掉,抽取一个最简模型.我们在公司,一般都会有自己的自定义异常,然后这个自定义异常一般放在common.jar给其他模块依赖,比如我这里定义一个HelloException
2019年3月8日
其他

源码实战 | 本地可跑,上线就崩?慌了!

前言上周一好友向我反馈一个问题,他们项目在本地是可以跑的,但是在线上环境,就报错.报错日志如下:Could
2019年1月28日
其他

从Dubbo内核聊聊双亲委派机制

前言谈到Dubbo总是避不开SPI思想,因为这个是Dubbo内核中非常重要的一部分,但是SPI是个很大的话题,本篇和之前的[dubbo源码解析-简单原理、与spring融合]一样,为dubbo源码解析专题的知识预热篇.我们公司实际项目就用到了Dubbo的SPI.后面会给大家分享,我们实际项目中,是如何使用SPI,以及SPI后续我们又是如何进优化的.插播面试题你是否了解spi,讲一讲什么是spi,为什么要使用spi?对类加载机制了解吗,说一下什么是双亲委托模式,他有什么弊端,这个弊端有没有什么我们熟悉的案例,解决这个弊端的原理又是怎么样的?spi的简单介绍如果提到api相信大家都知道,spi的话,知道的人就相对少一些.简单的说,api是给使用者使用的,spi是给拓展者使用的.一个好的开源框架,必须要留一些拓展点.让参与者尽量黑盒拓展,而不是白盒修改代码,否则分支,质量,合并,冲突都会很难管理.并且框架作者能做到的功能,拓展者也一定能做到.如果从使用层面来说,就是运行时,动态给接口添加实现类.其实这有有点像IoC的思想,将装配的控制权移到程序之外如果从生活中的例子讲,就是比如浏览器插件,比如墙上的插头不够我们就接个排插,而不是伤筋动骨改插头(感觉不是很贴切,前期你暂且这么不规范的粗略理解)再多的言语都是抽象的,那么我们用代码来简单实现一下spispi的简单实现接口和具体实现类1public
2019年1月8日
其他

dubbo源码解析-简单原理、与spring融合

你说你用过mybatis,那你知道Mapper接口的原理吗?(如果回答得不错,并且提到动态代理这个关键词会继续往下问,那这个动态代理又是如何通过依赖注入到Mapper接口的呢?)
2019年1月6日
自由知乎 自由微博
其他

还有这种操作?浅析为什么要看源码

首先他会获取两个判断对象的类型,当拿一个字符串和一个数字判断的时候,因为类型不一样嘛,当mybatis发现,这个字符串是可以转换成数字的,那么就会把这个字符串转成数字,然后再和这个数字判断.
2019年1月5日