简历
个人信息
姓名:廖梓鉴
工作经验:6年
电话|邮箱:15970126646 | lzj960515@163.com
学历|专业:本科 | 材料物理
专业技能
- Java基础扎实,对并发编程、集合等基础框架有深入理解,掌握常见的数据结构和算法、设计模式,深度研究过ReentrantLock、Samephore、BlockingQueue、线程池等相关源码。
- 深入理解JVM底层原理,熟悉JVM各种垃圾收集器的使用以及核心参数的调优,能够使用常用的命令如jmap、jstack、jstat或者Alibaba Arthas 诊断工具对线上系统进行调优。
- 深入理解Spring的设计原理及底层架构,精读过IOC、AOP相关源码,能够对Spring生态组件进行自定义扩展。
- 深入理解MySQL的底层数据结构和事务隔离机制,能够MySQL进行性能调优。
- 熟悉SpringBoot、SpringCloud Alibaba微服务技术,研究过Nacos、Open-Feign、Gateway等部分组件源码。
- 理解Redis的核心数据结构,熟悉多级缓存架构,熟悉如缓存雪崩,缓存穿透,缓存失效,热点缓存重建等高并发场景。
- 熟悉Zookeeper选举机制及典型应用场景,如分布式注册中心,分布式锁等,研究过部分源码。
- 熟悉Elasticsearch,研究过倒排索引原理、分词算法,实现过基于Elasticsearch的低代码引擎。
- 熟悉微服务架构,主导过多个微服务系统的架构设计,解决过多种分布式问题,如分布式调用链度追踪,分布式日志,分布式任务等。
- 研究过高性能IO通信模型以及相关开源组件Netty源码,熟悉Netty线程模型。
- 研究过RabbitMQ、Kafka、RocketMQ等相关MQ技术,熟悉消息积压,消息重复消费等问题解决方案。
工作经验
重庆凯桥信息科技有限公司
工作时间:2020.10-至今
工作职位:技术委员会主席
工作描述:
-
基础设施建设
- 中间件
- 自研组件
- 知识库
-
系统架构设计与开发
-
技术难点攻破
-
线上系统性能优化
中软国际有限公司
工作时间:2019.09-2020.10
工作职位:Java开发工程师
工作描述:
- 负责组件云平台的架构设计及功能开发
- 负责微信公众号平台的系统重构及功能开发
深圳希创旺思电子科技有限公司
工作时间:2018.07-2019.6
工作职位:Java开发工程师
工作描述:
- 负责供应链系统的核心开发
项目经验
互联网医院智慧医院标准版
项目名称:互联网医院智慧医院标准版
项目介绍:为进一步缓解或解决医院三长一短问题,让患者少排队或不排队,提升患者的就医体验,我们需要建造一个高效、多医院、统一用户的医疗平台。我们希望通过互联网医院智慧医院标准版优化线下服务、融合线上与线下服务流程,为患者提供更优质的医疗服务。
技术栈:SpringBoot、SpringCloud Alibaba、Mybatis-Plus、MySQL、Redis、Elasticsearch、Sentinel、Xxl-Job、Skywalking、Docker
我的贡献:
1、系统架构设计
(1)系统整体设计
从业务层面、流量层面进行微服务划分,统一技术栈。
- 使用Nacos作为注册中心进行服务注册、服务发现
- 多节点网关提供流量统一入口
- 使用ELK进行分布式日志收集,解决日志排查困难问题
- 使用Skywalking做分布式调用链路追踪,快速定位线上问题
- 使用Xxl-Job作为分布式任务调度中心,统一管理调度任务
- 使用Sentinel做服务熔断降级
- 服务容器化部署,使用GitLab+Runner进行CI/CD
(2)挂号服务设计
在系统中,挂号业务流量大,并发高,而挂号业务依赖于从医院接口查询号源。其中有两大问题:
- 医院号源提供给多方使用,故无法简单的将所有号源缓存到系统中
- 医院接口并发小、响应慢
基于上述条件,系统设计了多级缓存
- 一级缓存缓存时间低,保证号源数量虽然存在差异,但是差异不大
- 二级缓存缓存时间长,保证缓存不会击穿。
- 同时使用分布式锁,保证某个缓存失效后只有单个线程同步号源,保证医院系统的稳定性。
- 使用Sentinel,对不同的医院设置不同的限流策略,保证系统不会因为某个医院系统故障发生雪崩。
(3)登录授权设计
为更广泛的为患者提供服务,系统支持患者从多渠道(微信、支付宝、第三方)登录。
而不同的渠道登录方式、登录信息不同,患者的产生的业务却应当是跨渠道的(在微信上产生的业务,在支付宝上也能看到)
- 系统设计平台用户池,将不同渠道的用户信息与平台用户绑定,患者开展的业务都使用平台用户完成
- 使用模板方法模式设计统一的登录流程,保证登录流程规范性。
- 使用策略模式获取不同渠道的登录信息,以区分不同渠道的特性,提高登录业务的可扩展性。
2、系统性能调优
(1) 挂号服务性能优化
服务情况:
-
数据库:院内数据库(延时40ms)
-
实例数:3个,每个实例的服务器为2核,并且被其他服务共用
-
内存:2G(年轻代与老年代比值:2:1)
-
垃圾收集器:ParNew + CMS
-
挂号流程简述:查询号源(多级缓存) -> 锁定号源 -> 支付
优化前:
- 系统可用性:0.70
- 最大平均响应时间:4500ms
- 最大响应时间:45000ms
优化手段:
- 使用skywalking查找慢接口,优化sql
- 调整请求线程池数量
- 调整流量负载比例,优化cpu使用率
- 调整内存,优化gc
优化后:
- 系统可用性:0.99
- 最大平均响应时间:60ms
- 最大响应时间:600ms
(2) 医生服务内存优化
问题:频繁出现OOM异常
优化手段:
- 使用skywalking查看服务gc情况,发现服务频繁发生full gc
- 导出服务dump日志,使用jvisualvm进行分析,定位到具体业务代码问题
- 对该业务流程的代码进行优化
3、针对开发情况对开源框架扩展
(1) 自定义路由策略
标准版作为平台级项目,常常会同时面临不同医院的不同需求,面对这样的情况,多版本同时开发是一种常态,而问题在于开发环境却只有一套,这就会导致开发人员在调试不同版本时会频繁将服务上下线,这实在太不优雅。
解决思路:扩展Gateway和Ribbon的路由策略
- 自定义
VersionLoadBalancerClientFilter用以替换Gateway中LoadBalancerClientFilter - 自定义
VersionRule用于替换Ribbon中的路由策略
达成效果:前端开发人员只需要在请求头中传入指定的版本号,路由策略将自动选择对应版本的服务进行路由。
凯桥组件库
项目介绍:kq-universal为凯桥后端组件库。以“一切可以拷贝的代码都应得到复用”为理念,将凯桥常用的工具,普遍的业务场景,进行了抽离与组件化,现已经将部分组件(近20)开源至GitHub,组件库的开发使得我们能够做到:
- 统一技术栈
- 避免重复开发,降低维护成本
- 技术规范化
技术栈:SpringBoot、Redisson、Mybatis
我的贡献:
组件设计与开发
1、数据库加解密组件
在医疗领域,数据库敏感信息必须要加密存储,而将数据加密入库,出库解密,这是一个通用且繁琐的操作,该组件通过Mybatis拦截器特性做到无侵入式将数据加密入库,查询数据时解密,极大降低了开发成本。
2、Redis组件
我们常常会使用Redis做数据缓存,做分布式锁,Redis组件规范了Redis的使用方式,并通过Redisson实现了一系列的注解式分布式锁,使用者只需在方法上增加注解,即可达成分布式锁效果。
3、延时任务组件
关于延时任务,我们总是在定时任务轮询或者消息队列中做取舍,而延时任务组件则集成了这两位的优点,基于时间轮数据结构,做到不依赖外部中间件且任务执行时间精确。
4、流程引擎组件
市面上的流程引擎可能功能复杂且比较重,也可能需要重新定制开发,该组件为凯桥业务场景而设计的流程引擎组件,充分发挥了流程引擎特性,让项目只专注与业务本身,无需关心流程相关功能。
其他组件您可在GitHub中查阅
自我评价
- 热爱技术,喜欢钻研,研究过众多开源框架源码,如Spring, Netty, Nacos等
- 热于分享,在公司的语雀知识库发布了众多文章,常常进行培训,与同事们分享技术
- 良好的编程习惯,优秀的编码能力,在公司制定开发规范,进行Code Review
- 逻辑思维敏捷,业务能力强,善于发现业务痛点,提出有效的解决方案