自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

只有变秃 才能变强

书写是对思维的缓存

  • 博客(349)
  • 资源 (1)
  • 问答 (2)
  • 收藏
  • 关注

原创 DIP , DI , IoC 傻傻分不清?

一张图看懂 DIP , DI , IoC 的关系Design Principle vs Design PatternIn software engineering, design principle and design pattern are not the same.Design PrincipleDesign principles provide high level guidelines to design better software applications. They do not

2020-09-05 15:57:31 377

原创 AOP,Spring AOP ,Aspectj,CGLIB 傻傻分不清?

一张图看懂 AOP,Spring AOP ,Aspect,CGLIB的关系 !Spring AOP , AspectJ , CGLIB 概念AOPAOP(Aspect Orient Programming) 作为面向对象的一种补充,广泛用于处理具有横切性质的系统级服务,如 事务,安全检查,缓存,对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建代理对象,AOP 代理可分为 静态代理 和 动态代理 两大类,静态代理在编译阶段就可以生成代理类,因此也称为 编译时增强;动态代理 在运行

2020-09-05 15:41:20 640 4

原创 Excel 导入导出太麻烦? Easy excel 了解一下 !

Easy-Excel它是什么?easy-excel 是基于 Apache POI 框架的一款扩展封装库,让我们在开发中更快速的完成导入导出的需求。 尽管很多人会提出 poi 能干这事儿为什么还要封装一层呢?easy-excel 很大程度上简化了代码、让使用者更轻松的 读、写 Excel 文档,也不用去关心格式兼容等问题,很多时候我们在代码中会写很多的 for 循环,各种 getXXXInde...

2020-04-23 18:25:56 1444

原创 浅谈测试驱动开发(TDD)

TDD 是什么TDD 是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD 的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么功能代码。TDD 的基本思路是通过测试来推动这个开发的过程,但测试开发并不是单纯的测试工作,而是把 需求分析,设计,质量控制量化的过程。TDD 的目的不仅仅是测试软件,保证代码质量仅仅是其中的一部分,更重要的是,在开发过程中帮助开发者...

2020-04-02 17:27:54 713

原创 TDD 编程实战

源码地址: https://github.com/itguang/TDD_INACTION分为java实现版本和kotlin实现版本项目介绍假想你在火星探索团队中负责软件开发。现在你要给登陆火星的探索小车编写控制程序,根据地球发送的控制指令来控制火星车的行动。初始需求火星车收到的指令分为四类:探索区域信息:告知火星车,整片区域的长度(X)和宽度(Y)有多大;初始化信息:火星车...

2019-08-24 10:00:23 3343 1

原创 详解 Spring Session 架构与设计

前言开始进行 Web 开发时,我们可能会遇到这样的情况,Web 容器(例如 Tomcat、Jetty)包含 Session 的实现,当服务器重启之后,之前的登录状态会失效需要重新登录。又或者你的应用程序部署了不止一台机器,用户在机器A上登陆之后,来到机器B又需要重新登陆,因为机器A的 Session 在机器B 是没有的。在解决这两个问题之前,我们先来重新了解下 HTTP 协议的相关知识。HT...

2019-06-06 17:22:49 4845 1

原创 使用java8实现List中对象属性的去重

使用java8实现List中对象属性的去重今天在工作的时候遇到了一个问题,就是List的去重,不想用双重for,感觉太low,不想用for+Map,感觉应该有更好的方法,于是,google之。发现java8的stream流能完美解决这个问题。 List<BookInfoVo> list比如在 BookInfoVo 中有一个 recordId 属性,现在需要对此去重....

2018-09-03 16:37:57 11200 6

原创 对账平台设计

随着公司业务的蓬勃发展,交易履约清结算业务的复杂性也在不断的增高,资金以及各种数据的一致性和准确性也变得越发重要。

2023-03-01 11:47:52 1390 1

原创 Mysql 索引基数与选择性

先看一下 wiki 定义:索引(英语:Index),是一本书籍的重要组成部分,它把书中的重要名词名称罗列出来,并给出它们相应的页码,方便读者快速查找该名词的定义和含义。在 Mysql 中,索引也叫做 “键(key)”,是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。恰当的索引对于良好的性能非常关键。当数据量较小是,不恰当的索引对性能的影响可能不明显,但是,当数据量很大时,性能可能会急剧下降。本小节我们就 Mysql 中索引的基数和选择性做一些讨论。

2022-11-29 17:40:58 733

原创 线程池使用不当总结

主线程执行join()进入阻塞状态,因为永远获取不到结果,永远无法恢复,造成服务故障。但是父任务的完成又依赖于子任务,这时由于子任务得不到线程,父任务无法完成。10个请求同时到达时,线程池被打满,子任务请求被迫进入阻塞队列。假设 executorService 线程数最大为10。拒绝策略设置为 丢弃,如果再去 get 会一直阻塞。

2022-11-24 14:23:40 385

原创 Spring 事务编程实践

Spring的事务框架将开发过程中事务管理相关的关注点进行适当的分离,通过Spring的事务框架,我们可以按照统一的编程模型来进行事务编程,却不用关心所使用的数据访问技术以及具体要访问什么 类型的事务资源。Spring 事务的设计理念的基本原则是:让 事务管理 与 数据访问,相分离。当在业务层使用事务的抽象API进行事务管理的时候,不需要关心事务将要管理的资 源是什么,对不同的事务资源的管理将由相应的框架实现类来完成。

2022-11-04 14:03:57 2195 1

转载 mat 使用指南

MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。可以用于查找内存泄露以及查看内存消耗情况。MAT是基于Eclipse开发的,是一款免费的性能分析工具。读者可以在http://www.eclipse.org/mat/下载并使用MAT。

2022-10-20 11:57:34 237

原创 JVM 调优案例分析

现象:系统日常运行正常突然发生fullgc甚至内存溢出,重启后恢复正常但是过了几天又会突然发生频繁fullgc触发告警,告警信息如下:首先发生fullgc,我们需要定位fullgc发生在jvm哪个区域?我们可以通过cat也可以通过gc日志查询发生的区域,目前有两种方式可以快速定位到gc区域:1、Cat的Problem中可以直接查询error的详细信息(时间比较久了找不到对应的cat截图了)2、通过gclog查询(大部分系统没有添加gc日志打印),常见配置如下。...

2022-08-11 16:32:24 564

原创 JVM参数调优推荐

学习开源项目的启动脚本是个不错的主意,比如ElasticSearch家的,Cassandra家的。VJTools的 jvm-options.sh,伸手党们最爱,根据自己需要稍微定制一下就行,详见 http://github.com/vipshop/vjtools。《JVM调优的"标准参数"的各种陷阱》 ,R大的文章,在JDK6时写的,期待更新。当你在网上兴冲冲找到一个可优化的参数时,先打印看看,它可能已经默认打开了,再找到一个,还是默认打开了…...

2022-08-11 16:31:32 330

原创 java List 排序

java 排序

2022-06-09 11:48:37 214 3

原创 Guava中这些Map的骚操作,让我的代码量减少了50%

https://mp.weixin.qq.com/s/4XegAIdixcAywHF9-XDZzwGuava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。今天Hydra要给大家分享的就是Guava中封装的一些关于Map的骚操作,在使用了这些功能后,不得不说一句真香。先引入依赖坐标,然后开始我们的正式体验吧~...

2022-03-10 16:39:37 313

原创 记一次API 接口定义 添加 @ApiOperation 注解触发中间件 bug 问题分析

API 接口定义 添加 @ApiOperation 注解触发中间件 bug 问题分析背景我有一个服务 A ,写了一个接口定义如下:@RequestMapping({"/config/coupon"})public interface CouponOperateTaskService { @PostMapping({"/list"}) @ApiOperation("优惠券操作任务列表") BizPageResponse<CouponOperateListRespo

2022-02-28 17:07:04 1801 1

原创 @FeignClient 上传文件时报错 解决方案

Feign 作为 Spring Cloud 中 RPC 工具,利用注解来描述接口,简化了 Java HTTP Client 的调用过程。但是在文件上传时,我们需要做一些额外的配置,不然会调用异常。背景我有一个服务 A,里面有个接口,需要接受上传的文件和一些参数, @PostMapping({"/validityPeriod/update"}) BizResponse proofValidityPeriodUpdate(@Validated ValidityPeriodUpdateRequest

2022-02-28 17:06:07 1574

原创 Redis大key 问题

Redis大key 问题背景双十一大促期间, 收到客服反馈通知,说 APP 领券接口缓慢。找到一个case,通过调用链路发现,是操作redis 缓慢,并且还搜到一些redis 异常。最后定位到原因:是发券场景下拿redis 做了一个缓存券批次的操作,记录用户当天领取的所有券批次发券场景: key = userId, value = 券批次ID 列表, 而redis 查询发现多了许多大key,体现在 一个用户领取的几千甚至上万张优惠券,导致Redis 查询缓慢,甚至异常。至于为何有的用户会领取这么多优

2022-02-21 16:11:50 9453 1

原创 Code Review 指南

Code Review 指南PPT: https://www.yuque.com/itguang/mweb/code-review-zhi-nan文章目录Code Review 指南前言CR 是什么?为什么要做 Code Review ?CR 的标准进行 CR 的一些原则CR 中需要关注什么?关注代码规范代码坏味道Duplicated Code (重复代码)Long Method (长函数)Large Class (过大的类)Long Parameter List (过长参数列)降低圈复杂度关注性能问题

2022-02-18 14:35:47 541

原创 Spring Boot 的 @Value 注解用法详解

一、前言在日常开发中,经常会遇到需要在配置文件中,存储 List 或是 Map 这种类型的数据。Spring 原生是支持这种数据类型的,以配置 List 类型为例,对于 .yaml 文件配置如下:test: list: - aaa - bbb - ccc对于 .properties 文件配置如下所示:test.list[0]=aaatest.list[1]=bbbtest.list[2]=ccc当我们想要在程序中使用时候,想当然的使用 @Value 注解去读取这

2022-01-04 17:17:53 1177

原创 由 CPU Load 过高告警引发的对 线程数和 CPU 的思考

线程池 数设置你真的会吗?可能很多人都看到过一个线程数设置的理论:CPU 密集型的程序 - 核心数 + 1I/O 密集型的程序 - 核心数 * 2这个理论看起来很合理,但实际操作起来,总是不仅如此人意。下面,我们就来看一下 线程数, CPU 的关心先说一个基本的理论,大家应该都知道:一个CPU核心,单位时间内只能执行一个线程的指令那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。下面我们用一段程序来测试下 CPU 和线程数 之间的关系。CPU 利用率测试测

2021-12-28 18:39:57 2054

原创 Brew换源

Brew换源简介Homebrew 是一款自由及开放源代码的软件包管理系统,用以简化 macOS 和 linux 系统上的软件安装过程。它拥有安装、卸载、更新、查看、搜索等很多实用的功能,通过简单的一条指令,就可以实现包管理,十分方便快捷。Homebrew 主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。名称 说明brew Homebrew 源代码仓库homebrew-core Homebrew 核心软件仓库homebr

2021-12-28 14:36:01 7289 1

原创 Jmeter 压测接口编写指北

电商领域中, 每到各种活动, 什么 618, 双十一, 双十二, 各种优惠活动就纷至沓来, 对营销工具是一个巨大的挑战, 因此, 营销相关系统的压测是保障系统稳定运行,应对突发流量的必要手段.优惠券系统作为营销工具中的一种大杀器, 其稳定性保障必不可少.下面主要介绍我负责的优惠券系统在应对双十一突发流量的压测过程:1. 压测前准备下载 压测工具: Jmeter提前统计好每个要压测接口的数据: 日常QPS, 99线, 双十一预估QPS压测线程数计算: 1000/接口99线 x 线程数 = 目标Q

2021-10-19 11:44:23 343 1

转载 使用CompletableFuture优化你的代码执行效率

使用CompletableFuture优化你的代码执行效率这篇文章详细讲解java8中CompletableFuture的特性,方法以及实例.在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值,这时候,大家可能会去尝试使用Callable中的call方法,然后用Future返回结果,如下:public static void main(String[] args) throws Exception {

2021-06-23 19:48:55 684

原创 Spring Security 与 SSO 整合思路

因为HIS登录认证采用了 Spring Security , 因此, 要想理解目前的HIS登录流程,需要对 Spring Security 有一定了解,才能在其基础上添加新功能和额外扩展。Spring Security 登录流程解析:一句话来总结Spring Security 的认证流程就是: 验证信息 (Authentication) 在 过滤器链中传播认证的过程。Spring Security 的核心组件易于理解,其基本校验流程是: 验证信息(Authentication)传递过来,验证

2021-02-21 09:49:38 2269 2

转载 消息中间件的四种投递模式对比

消息中间件的四种投递模式对比https://cloud.tencent.com/developer/article/1540042消息中间件( Message Oriented Middleware,简称MOM)在企业开发中变得越来越重要。本文介绍消息中间件中的四种消息投递模型,主要是介绍模型的核心特性,以及不同模型之前的区别。这四种模型分别是:PTP模型Pub/Sub模型Partition模型Transfer模型其中PTP模型和Pub/Sub模型在JMS规范中有定义,消息中间件Act

2021-02-19 18:34:39 300

原创 接口性能优化思路

接口性能优化思路背景HIS 这边有一个扫码取药的接口,涉及到整个就诊流程:预约–》签到–》开始就诊–》添加处方及药品–》确认处方–》确认账单–》创建交易及订单 --》付款 --》 结束就诊 --》 签退。整个流程业务非常复杂,涉及接口和远程服务也非常多,因此接口响应很慢,耗时很长。类似的涉及到整个就诊流程的操作还有很多,比如:核销,也是要走一遍上面的流程,只是在【诊中】的操作不同,可能是添加药品,也可能是添加检查,体检,诊次套餐之类。这类操作每个步骤都非常明确,常常以一个 Pipeline 的形式封

2021-01-29 17:17:15 2195 1

转载 可靠消息一致性的 2 种解决方案

讲的可太棒了: https://cloud.tencent.com/developer/article/1430020"可靠消息最终一致性"是为了解决Producer端的消息发送与本地事务执行的原子性问题,是一种柔性事务,属于异步确保型,软状态,最终一致。**问题典型场景是:**本地往DB中插入一条记录,同时往MQ中发送一条消息,必须保证二者同时成功或者同时失败。由于DB和MQ是不同的系统,可能插入DB成功,但是发消息到MQ中失败;也可能插入DB失败,但是发送消息到MQ成功。如何保证二者的一致性,就.

2021-01-14 18:32:06 718

原创 使用 Lombok @Singular 注解需要注意的 BUG

先看下面一个 java 类, 这是在业务代码中的一段真实代码,做了部分简化。@Getter@Builder@NoArgsConstructorpublic class PatientQuery { @Singular private List<Long> patientIds = Lists.newArrayList();}首先我们先分析下上面这段代码存在的问题:**第一:**添加了 Lombok 的 @Builder 注解,但是 patientIds 属性有默认

2021-01-14 12:56:35 2995

原创 Binlog 日志应用场景

Binlog 日志应用场景https://www.cnblogs.com/kingszelda/p/8362612.htmlhttps://cloud.tencent.com/developer/article/1444390什么是binlog?Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制。复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器(slave),以实现灾难恢复、水平扩展、统计分析、远程数据分发等

2021-01-12 18:46:11 293

原创 InheritableThreadLocal 的作用?

直接看总结:InheritableThreadLocal主要用于子线程创建时,需要自动继承父线程的ThreadLocal变量,方便必要信息的进一步传递。线程间传递实现原理:说到InheritableThreadLocal,还要从Thread类说起:public class Thread implements Runnable { ......(其他源码) /* * 当前线程的ThreadLocalMap,主要存储该线程自身的ThreadLocal */ T

2020-12-03 16:34:41 564

原创 Feign 和 Hytrix 在微服务上下游的请求头信息传递丢失问题

在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题。解决方案首先需要写一个 Feign请求拦截器,通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。Feign 请求拦截器public class FeignBasicAuthRequestInterceptor implements RequestInterceptor { private static

2020-11-30 22:38:26 817 1

原创 K8S 命名空间

K8S 命名空间命名空间提供的隔离命名空间只是将对象(资源)分到不同的组,只允许你对特定命名空间的对象进行操作;但实际上,命名空间不提供对正在运行的的对象的任何隔离;一个 namespace 内只允许一个 Pod, 不同namespace 内的 Pod ,是平等的,比如同一节点不同 namespace 的 Pod 可以相互通信命名空间可允许不同团队使用同一集群,就像他们使用单独的 kubernetes 集群一样获取所有命名空间kubectl get ns创建 Pod 时指定

2020-11-28 18:15:01 936

原创 记一次 Mysql 日期使用不当造成的 bug

众所周知, MySQL 中有多处表示日期的数据类型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。下表中列出了 MySQL 中的日期与时间类型。由于我在存储 生日 字段的时候,数据库不恰当的选取了 timestamp 字段,所以在我的生日字段在小于 1980 的时候就会报错:java.sql.BatchUpdateException: Data

2020-11-27 11:29:29 385

原创 字符串转 OffSetDateTime 你真的会用吗?

要创建OffsetDateTime ,需要日期 (日,月和年), 时间 (小时,分钟,秒和纳秒)和偏移量 (与UTC的差异)。如果输入只有日期,将会报错.如果只有 日期 小时,分钟和秒,也会报错.因此必须构建其余的,或者假设它们的默认值。下面是我写好的工具类,拿去用吧:public class OffSetDateTimeConverter { private static DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuil

2020-11-26 19:24:54 3889 2

原创 说说 Java 程序优雅宕机的几种策略?

在实际应用中是如何停止一个 进程呢?kill -15 pid通过该命令发送一个关闭信号给到jvm, 然后就开始执行 Shutdown Hook 了,你可以做很多:1、 关闭 socket 链接2、 清理临时文件3、 发送消息通知给订阅方,告知自己下线4、 将自己将要被销毁的消息通知给子进程5、 各种资源的释放…所谓 优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程、释放连接资源等。再比如,就是不会让调用方的请求处理了一增,一下就中断了。而处理完本次

2020-11-24 20:59:40 432

原创 布隆过滤器在爬虫的几种使用场景以及布谷鸟过滤器的优点

布隆过滤器(概率型数据结构): 某样东西一定不存在或可能存在布隆过滤器原理?把一个 key 进行好几个 hash 运算后,得到的 hash 值,对一个 bit 数组取模放进去,用 1 表示, 比如下面示例:这个 再有其他 key 到来,再用同样的 方法计算 hash 值,判断bit数组的该位置是否为 1,都为 1 表示已存在(可能误判),不为 1,表示一定不存在.应用场景:1. 判断一个数据是否在数据库存在, 不存在再插入.(爬虫场景的幂等性入库操作)(对已经爬取过的 URL 去重)2.

2020-11-18 14:25:46 472

原创 K8s 服务故障排查指南

服务是 Kubernetes的一个重要概念,也是让许多开发人员感到困扰的根源。许多开发人员为了弄清楚无法通过服务IP或FQDN连接到他们的pod的原因花费了大量时间。出于这个原因,了解一下如何排除服务故障是很有必要的:如果无法通过服务访问pod,应该根据下面的列表进行排查:首先,确保从集群内连接到服务的集群I,而不是从外部。不要通过ping服务P来判断服务是否可访问(请记住,服务的集群IP是虚拟IP,是无法ping通的)。如果已经定义了就绪探针,请确保它返回成功;否则该pod不会成为服务的

2020-11-17 22:49:08 819

原创 K8S 集群中使用一个 Loadbalancer 暴露整个集群内所有服务的设想

在 K8s 中,将服务的类型设置为 LoadBalance ,该负载均衡器就会获得一个公开的独一无二的IP,并将所有的连接重定向到 Service然后就可以通过负载均衡器的IP地址访问该服务.但是 LoadBalancer 只能为一个服务提供 一个 公共IP,现实中我们有多个服务,每个服务都暴露一个公网 IP, 太浪费资源.解决方案有两种:一: 创建一个 LoadBalancer 的 Service,这个Service 就是一个 GateWay 服务,用来进行 K8S 集群内部的 服务转发我们知

2020-11-17 22:16:41 2879

javaSE课件

世上最适合java初学者的资料,这是PPT,要视频的私聊我

2015-08-31

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

TA关注的人

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