自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

家山的专栏

走走停停

  • 博客(47)
  • 收藏
  • 关注

原创 应届生求职的几个坑

最近帮刚毕业的亲戚小Y找工作。小Y在校积极实习积累了不俗的专业经验,踊跃参加校内外比赛并多次获奖,但学校普普通通,简历要么石沉大海,要么公司不如意。这篇文章结合小Y的真实经历聊聊像小Y这样的普通应届生求职可以避开哪些坑。.........

2022-07-31 14:01:35 307

原创 我的面试总结

由于在原来的环境达到一个瓶颈,从年初开启了我的漫长的换工作之路。准备技术汇总面试会考察基础知识、架构能力、设计能力。懒没有自己总结,我收集了一些优秀博文汇总一起放在github上。地址:https://github.com/maoplus/summary技术总结列表我会不定期更新。算法算法越来越重要,甚至在面试过程中算法写不好就被一票否决了。精力有限,只刷热门算法就好了。关于热门算法汇总只看这里就够了:https://codetop.cc/#/home热...

2022-07-31 01:00:22 333

原创 glang context踩坑:context过期

目录context canceled by businesschild ctx拷贝一份context结论context canceled by business报错来自自研微服务框架。简化如下,微服务框架判断context的超时时间,若超时直接返回错误不调用远程服务。case <-ctx.Done(): return nil, makeTimeoutErr(ctx, rpcInfo, start)ctx.Done()返回的管道因为超时被关闭...

2021-08-14 10:30:36 2148

原创 IntelliJ IDEA、GoLand内存优化

目录IDE偶发性崩溃祭出ZGC注意IDE偶发性崩溃自从工作开发语言从Java切换到golang,每天就跟goland打交道,goland说白了就是idea套个壳子,都基于一个内核,基于Java开发的。为了便于理解,这里用idea指代goland。Find Usages是我最常用的功能之一,选择某个函数或者声明查看被使用的地方。Find Usages底层就是基于抽象语法树解析源码,解析sdk,解析第三方包,涉及大量文件读取、字符串解析,堆内存压力很大。尤其是同时打开多个项目、多个.

2021-08-09 00:53:30 7328 1

原创 盲盒防沉迷——订单限购的设计与实现

盲盒是什么盲盒(Blind Box):就是装着不同的手办或玩偶的一个严密盒子,消费者购买前无法通过外观分辨盒子里面的东西,只有打开才会知道自己买到了什么。盲盒一般分普通款与隐藏款,抽到隐藏款就赚了。盲盒没打开之前,不知道里面到底是什么,因为结果的不确定性,使整个过程充满神秘感,这种猎奇心理,人你兴奋,满怀期待,容易上瘾,不断的买买买。为了避免用户抽盲盒上瘾,有必要按日、周、月维度根据用户ID与身份证做支付金额的限购。...

2021-06-26 11:24:45 836

原创 使用go进行单台机器压测

目录自助压测系统的局限为什么不使用Java基于go的简单实现自助压测系统的局限公司已经有基于集群实现的自助压测系统,自助压测系统压的是整个集群, 不方便对单台进行压测,有时候只压某一台即可定位问题。为什么不使用Java压测需要模拟多线程并发,在 JVM 中线程上下文的切换是很慢的使用操作系统的 threads 的最大能力一般在万级别,主要消耗是在上下文切换的延迟。Java 只允许数千级别的 threads。Goroutines是一种由 Go 运行时系统管理的“..

2021-04-11 22:40:47 330

原创 防止Redis缓存击穿:模仿go singleflight实现

目录缓存击穿什么是缓存击穿指一个Key非常热,在不停的扛着并发,并发集中对这一个点进行访问,当这个Key在Redis失效的瞬间,持续的并发请求就穿破缓存去数据库查找,对数据库造成极大压力。Go singleflight防止缓存击穿Go singleflight常用来防止缓存击穿,简单来说就是一个key只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存中获取数据即可。详见Go singleflightJava代码简单实现有以下需要注意的功能..

2021-04-04 18:59:18 719 2

原创 订单系统分布式环境消息顺序处理

消息为什么要顺序消费一个订单会有很多种状态:待支付、已支付、待发货、交易完成等等。每一种状态的流转都依赖上一个状态,其中一些状态是不可逆的,例如不能从已支付退回待支付。订单状态流转就是一个典型的状态机场景,如图所示。订单基于状态机设计模式可以很方便实现乐观锁,在分布式环境,可能发生多个线程同时将订单从一个状态更为为另一个状态,基于MySql的MVCC多版本并发控制,只有一个线程能更改成功,基于状态机的乐观锁保证了在微服务环境下的线程安全。UPDATE order SET s...

2020-08-29 21:56:30 944

原创 Java线程优化

线程池线程与协程无锁设计自旋锁、轻量级锁

2020-07-26 22:31:03 514

原创 分库分表JVM内存泄漏定位

Table of Contents内存泄漏sharding-jdbc执行结果合并内存泄漏采用sharding-jdbc分库分表后,执行自动化测试脚本,总是遇到响应超时。查看测试环境服务器发现已经内存崩溃。由于jvm启动参数已经设置了 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath,下载jvm dump文件: heap_hprof_200617_155545.bin。这里使用Java性能分析工具jprofiler11,执行命令:..

2020-07-12 20:35:15 1060

原创 哔哩哔哩淘宝小程序盲盒抽奖实践

目录背景背景为哔哩哔哩天猫旗舰店添加类似泡泡玛特盲盒抽奖的淘宝小程序,也叫淘宝轻店铺。由于淘宝不允许直接在轻店铺中发起对第三方服务的请求,只能通过云函数转发,详见:淘宝轻店铺官方说明轻店铺客户端调用哔哩哔哩服务要经过的链路:轻店铺云函数->轻店铺云服务->奇门→SLB→ECS→OpenApi→哔哩哔哩后端服务。轻店铺云服务必须使用轻店铺奇门,奇门必须使用阿里SLB,阿里SLB只支持阿里ECS。所以我们的方案必须使用到阿里云配套方案。名词解释轻店铺:淘...

2020-07-03 00:57:20 6074 3

原创 Job轮询总结与思考

背景在业务数据没达到一定量又不想引入分布式事务框架增加复杂性,基于Job框架实现的补偿方案不失为一种简单优雅的方案。微服务环境下虽然使用了retry框架,对一些幂等的接口一次失败多次尝试,但有些场景比如下单后无库存,要保证库存在一定时间内一定能扣成功,也只能使用Job框架以一定的频率发起补偿。业界常用的分布式Job框架有Saturn与xxl-jobJob并发像Saturn跟xxl-job都有控制台页面把Job配置为单机执行,单机发生故障进行故障转移。数据量少的场景只需...

2020-05-31 00:02:02 1290

原创 首页性能优化实战

背景test数据库关联查询重构为ElasticsearchtestElasticsearch优化1缓存不过期2响应时间1毫秒

2020-05-30 22:40:20 242

原创 一步步降低代码复杂度

Table of Contents1 Sonar认知复杂度计算规则2 降低复杂度2.1 降低复杂度前的准备2.2 一个for循环只做一件事2.3 减少for循环中的if else、continue2.4 抽离try/catch2.5 for循环内容不宜过长2.6 验证重构3. 通过idea一秒钟实现重构1 Sonar认知复杂度计算规则这里的认知复杂...

2020-04-19 00:31:47 5661 1

原创 使用性能分析工具定位Spring Boot启动慢问题

背景项目最近做了大的改动,添加了大量配置,Spring Boot项目启动时间从原来的100秒变成了400秒以上。从大量无效日志中一时难以看出瓶颈所在。首先需要一款性能分析软件,测试了几款Java性能分析工具,发现性能分析工具反而成了性能瓶颈(或许是跟项目水土不服),不过最终发现Intel® VTune™ Profiler对项目性能影响甚小。性能分析VTune是 Intel 提供的一个强大的应...

2020-04-11 00:07:20 2500 1

原创 fastjson1.2.9解析带abstract方法枚举栈溢出剖析

一、案例背景一个类里面添加了枚举,通过fastjson把该类解析为json的过程中报错。二、 案例现场定义一个带abstract方法的枚举 public enum OpenSourceEnum { BILIBILI("bilibili") { @Override public Integer getUid(Integer mid, String o...

2020-04-04 22:53:26 797

原创 Spring @Async踩到的坑

背景Spring中用@Async注解标记的方法,称为异步方法,其实就相当于我们自己在当前方法里面:new Thread(()-> System.out.println("hello world !"))。按@Async注解使用的基本方法:在方法上添加@Async注解; 所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象; 调用异步方法类上需要...

2019-05-25 20:16:04 8266

原创 count(*) vs count(column) vs count(1)

概念count(*)对行的数目进行计算,包含NULL count(column)对特定的列的值具有的行数进行计算,不包含NULL值。 count(1)这个用法和count(*)的结果是一样的。Count(1) 实际上的意思是,评估Count(&lt;expression&gt;)中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。Count(&lt;express...

2019-03-13 11:15:25 612

原创 错误追踪系统Sentry在微服务环境的应用

 Table of Contents1. 什么是Sentry2. 客户端接入2.1 验证Sentry服务2.2 DSN(Data Source Name)2.3 客户端接入Sentry3. 已知问题3.1 网络问题3.2 客户端吞吐能力1. 什么是Sentry       Sentry 是一个开源的实时错误追踪系统,支持 Python、Java、Go、N...

2019-02-20 12:15:00 2114

原创 Java 8并行流自定义线程池

目录前言默认并发数不靠谱通用池耗尽自定义线程池前言         Java 8引入了并行流(Parallel Streams),流会自动通过一个通用的Fork/Join池并行地执行,这个通用Fork/Join池可以使用ForkJoinPool.commonPool()来访问。默认并发数不靠谱         通常的通用池的期望并发数的默认值是Runtime.get...

2018-12-31 17:51:26 3489

原创 交易对账系统的实现

Table of Contents对账规则对账适配器对账比对对账不匹配的处理 对账规则       公司业务接入银行存管后,由存管银行负责投资者交易清算与资金交收。涉及跟第三方交易必须通过对账来保证资金的一致性。对账一般有两种,单向对账跟双向对账。由于公司所有资金流动都以银行为准,采用单向对账的方式。单向对账:一般拿第三方支付机构或银行流水,与自己系统进行对账,防...

2018-12-17 19:09:13 4011

原创 记一次RESTful Web Service报错问题

Table of Contents1.现象2.定位问题3.分析1.现象         自从公司的服务从合作伙伴的机房切换到腾讯云,监控邮件不断收到一些接口的报错日志,典型的如下JSON parse error: Can not deserialize instance of java.lang.Integer out of START_ARRAY token报错的后...

2018-12-17 14:31:13 385 1

原创 论统一配置的重要性:Eureka集群地址闹剧

问题的根源  一个项目采用Eureka Client的方式跟服务方交互,之前运行好好的,直到运维停机维护,结果就是调不通服务,仿佛整个服务端挂了。服务端是三台服务器组成的集群,客户端通过Ribbon负载均衡调用,运维是逐个停机维护,不会一下子关闭所有的服务器,不应该出现所有服务不可用。查找问题半天,最后发现是Eureka集群地址写错了,而且从进入生产环境的第一天地址就是错的。正确的地址是...

2018-09-15 21:12:14 917

原创 Spring Cloud健康检查的陷阱

健康检查  基于Spring Boot Actuator的健康检查是Spring Cloud微服务的必备组件,用来确保我们的服务是否可用。 引入 Spring Boot Actuator后,通过http://ip:port/health ,可以看到 HealthEndPoint 给我们提供默认的监控结果,包含磁盘检测和数据库检测。如下{ "status": "UP", "d...

2018-09-15 20:22:56 8763

原创 爱上单元测试:基于Groovy的Spock框架

Spock测试框架基于Groovy并集成了Junit、TestNG、Mockito等众多测试框架的优点。 Spock编写的单元测试层次清晰,代码量少,可读性好。 Groovy无缝兼容Java:Groovy最终会编译为class文件,JVM根本不在乎class来自jJava还是Groovy文件,支持各种集成开发环境(eclipse,Intellij Ieda),尤其是Intellij idea已...

2018-05-18 00:03:10 14973 3

原创 避免过多if-else的几种方法

太多的if-else不太直观,难以维护。 以下面代码为例,展示几种替代if else的方法。String input = "three"; @Test public void testElse() { if ("one".equals(input)) { System.out.println("one"); } e...

2018-04-16 22:44:58 35117 10

原创 Guava用法总结

这里抛砖引玉列出Guava一些常用工具类,更多用法请自行挖掘。1. 缓存Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。 cache的常用参数:   1. 缓存最大大小的设置:CacheBuilder.maximumSize(long)   2. 过期时间:expireAfterAccess(long, TimeUnit) expireAfterW...

2018-04-12 22:50:08 9720

原创 Builder设计模式结合lombok减少过多传参

  建造者模式将复杂对象的创建过程简化,用来传参也很合适。lombok的主要作用是通过一些注解,消除样板式代码,更多详见 lombok官网。该框架已经内置了这种模式。  过多的传参,可读性差,尤其是参数类型一致顺序还容易写颠倒。下面以一则不友好的传参为例展示一下,如何通过lombok迅速重构。public class Mytest { public static void main...

2018-02-25 12:08:47 3112 1

原创 什么是无效的单元测试

这里仅仅从代码层面来说明无效的单元测试。不验证结果   待测试的类public class BaseService { public String getId(String key) { if (key == null) { return null; } return "value"; }}  对应的单元测试import org.junit.Test;

2018-01-01 22:27:02 906

原创 Mockito模拟同一dao函数多次调用的不同结果

在单元测试中很难创建真实的dao,Mockito能够模拟这些dao,并验证所调用的dao的行为。   同一个dao方法在一个public方法中调用多次,可以根据参数不同采用Mockito的ArgumentMatcher来处理。 如下// 查询dao.selectByPrimaryKey(1)dao.selectByPrimaryKey(2)// 插入dao.insert(object1)

2018-01-01 20:48:40 8471

原创 Java7的Zip工具类:Zip File System Provider

项目中涉及从银行下载zip类型的对账文件。基于面向谷歌的编程,搜索一下,发现好多Zip工具类还是基于 java.util.zip.ZipEntry。其实Java 7的引入的Zip工具类优雅很多: Zip File System Provider。 废话少说。下面分别展示一下Zip的增、添、遍历。import java.io.IOException;import java.net.URI;imp

2017-12-20 23:10:15 2726

原创 用算法代替正则

正则很难做到严谨,更难以维护。这里不讲算法原理,只搬运两个算法来代替正则。身份证校验-特征组合码  首先从网上粘一个常用的身份证正则,结合一个根本不存在的身份证。 String idRegex = "[1-9]\\d{13,16}[a-zA-Z0-9]{1}"; // 结果校验为true System.out.println( "999115199005180999".matches(idReg

2017-12-19 23:22:14 413

原创 对象池化工具commons-pool

关于对象池的概念这里不做过多解释,除了用来缓存数据库连接java.sql.Connection这种重量级对象也适用于其他场景。   以SimpleDateFormat 为例,这是 Java 中非常常用的一个类,用于解析和格式化日期字符串。   但是 SimpleDateFormat 在多线程环境中并不是线程安全的。详见这位仁兄的 SimpleDateFormat 的线程安全问题与 ThreadL

2017-12-10 13:09:05 749

原创 第三方支付异步通知的陷阱

用户下单后调用第三方支付付款,然后接收第三方支付的异步通知,以便确认支付是否成功。 如下图   但异步通知可能由于网络原因,或者应用服务崩溃没有接收到。为了应对这种情况需要后台创建一个定时任务去调用第三方接口,主动查询支付结果。这种情形下就涉及并发的问题,可能后台定时任务跟异步通知同时收到了支付成功结果,同时对响应数据进行处理。通常通过加锁来避免这种问题。   到了这里一切看起来很美好。代码提

2017-12-03 20:16:13 5953 3

原创 为Mysql添加全文索引提高检索速度

项目中的activemq消息都存在一个叫message_queue_history备份表里面。 经过压力测试后,测试环境的备份表message_queue_history有高达一千多万的记录。 消息记录在message列里面,测试人员每次是这样检索已发送消息的:select * from message_queue_history where message like '%关键字%'messag

2017-11-26 18:42:25 5498 3

原创 Maven test多线程陷阱

maven-surefire-plugin运行Junit测试。 一段时间后发现一些运行失败的单元测试只能通过maven test重现。 后来了解到maven-surefire-plugin默认是多线程执行Junit test的,而一些单元测试共用了相同的资源,没有实现线程安全。 重构单元测试的同时将maven-surefire-plugin配置为单线程执行Junit,避免出现线程问题

2017-11-26 18:15:01 4152

原创 一场不该出现并发的并发事故

WebService gSOAP C++ 并发

2017-11-19 20:12:56 239

原创 一则分页查询的简单优化

分页优化 mybatis java mysql

2017-11-19 18:05:57 309 1

原创 JavaMail的大坑

JavaMail 超时 卡死 参数 163.com

2017-11-12 17:36:31 5437

原创 PowerMock处理特殊的单元测试

背景代码设计并不总是尽善尽美,有些单元测试是Mockito力不从心的。 这时候就需要PowerMock ,这个框架是对Mockito增强。 下面展示几个常用场景 - mock静态方法 - 跳过私有方法 - 更改子类无法访问的父类私有field - 更改类的私有static常量 - 模拟New构造函数示例首先引入Maven依赖 <dependency>

2017-11-12 12:31:17 4570

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除