谈谈对分布式事务的一点理解和解决方案
前提最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务、幂等控制、异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记录一下一些方案和思路。
分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下:
项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要不是程序本身的BUG,基本可以避免数据不一致。后面因为用户体量越发增大,基于容错、性能、功能共享等考虑,把原来的应用拆分为订单微服务和钱包微服务,两个服务之间通过非本地事务操(这里可以是HTTP或者消息队列等)进行数据同步,这个时候 ...
zuul源码分析-探究原生zuul的工作原理
前提最近在项目中使用了SpringCloud,基于Zuul搭建了一个提供加解密、鉴权等功能的网关服务。鉴于之前没怎么使用过Zuul,于是顺便仔细阅读了它的源码。实际上,Zuul原来提供的功能是很单一的:通过一个统一的Servlet入口(ZuulServlet,或者Filter入口,使用ZuulServletFilter)拦截所有的请求,然后通过内建的com.netflix.zuul.IZuulFilter链对请求做拦截和过滤处理。ZuulFilter和javax.servlet.Filter的原理相似,但是它们本质并不相同。javax.servlet.Filter在Web应用中是独立的组件,Z ...
ThreadLocal源码分析-黄金分割数的使用
前提最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到ThreadLocal之前先买个关子,先谈谈黄金分割数。本文在阅读ThreadLocal源码的时候是使用JDK8(1.8.0_181)。
黄金分割数与斐波那契数列首先复习一下斐波那契数列,下面的推导过程来自某搜索引擎的wiki:
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
JDK安全模块JCE核心Cipher使用详解
前提javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?
Cipher初始化transformation(转换模式)的一些知识补充转换模式transformation一般由三个部分组成,格式是:**算法/工作模式/填充模式(algorit ...
项目架构级别规约框架Archunit调研
背景最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范、模块分类规范、类依赖规范等,刚好接触到,正好做个调研。
很多时候,我们会制定项目的规范,例如:
硬性规定项目包结构中service层不能引用controller层的类(这个例子有点极端)。
硬性规定定义在controller包下的Controller类的类名称以”Controller”结尾,方法的入参类型命名以”Request”结尾,返回参数命名以”Response”结尾。
枚举类型必须放在common.constant包下,以类名称Enum结尾。
还有很多其他可能需要定制的规范,最终可能会输出一个文档。但是 ...
深入理解JDK中的Reference原理和源码实现
前提这篇文章主要基于JDK11的源码和最近翻看的《深入理解Java虚拟机-2nd》一书的部分内容,对JDK11中的Reference(引用)做一些总结。值得注意的是,通过笔者对比一下JDK11和JDK8对于java.lang.ref包的相关实现,发现代码变化比较大,因此本文的源码分析可能并不适合于JDK11之外的JDK版本。
Reference的简介和分类在JDK1.2之前,Java中的引用的定义是十分传统的:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。在这种定义之下,一个对象只有被引用和没有被引用两种状态。
实际上,我们更希望存在 ...
JSR310新日期API(五)-在主流框架中使用新日期时间类
前提前面的几篇文章已经基本介绍完了JSR-310日期时间类库的基本使用,这篇文章主要介绍在主流的框架中如何使用这些类库。因为涉及到数据库操作,先准备好一张表和对应的实体。
CREATE TABLE `t_user`( id BIGINT PRIMARY KEY COMMENT '主键', username VARCHAR(10) COMMENT '姓名', birthday DATE COMMENT '生日', create_time DATETIME COMMENT '创建时间', KEY idx_na ...
JSR310新日期API(四)-日期时间常用计算工具
前提这篇文章主要介绍JSR-310中日期时间类的常用计算工具,包括常规的两个日期时间实例之间的前后比较、间隔的时间量等等。
日期时间的基准类日期时间类库中提供了几个常用的计算或者度量基准类,分别是:
表示取值范围的ValueRange:内部持有四个主要的成员变量minSmallest、minLargest、maxSmallest和maxLargest,可以表示的值范围是[minSmallest/maxSmallest,minLargest/maxLargest]。
表示秒和纳秒级别的时间量Duration:TemporalAmount的实现类,内部持有一个长整型的成员seconds代表秒 ...
JSR310新日期API(三)-日期时间格式化与解析
前提前一篇文章已经比较详细地介绍了JSR-310中新增的常用的日期时间类,在实际应用中,我们也十分关注这些日期时间类的格式化操作,更加通俗来说就是字符串和日期时间类的相互转换问题。下面先回顾一下Java旧有的日期时间类和字符串之间的转换方案,然后重点分析JSR-310中新增的常用的日期时间类和字符串之间的转换方案。
SimpleDateFormatJava旧有的日期时间类格式化为字符串或者字符串基于模式(Pattern)解析为日期时间类完全依赖于java.text.DateFormat的实现类java.text.SimpleDateFormat。SimpleDateFormat的基本功能是 ...
JSR310新日期API(二)-日期时间API
JSR310新日期API(二)-日期时间API前提这篇文章主要介绍一下日期时间API中最常用的类库,分别是:
java.time.Clock:时钟。
java.time.Instant:瞬时时间,时间戳java.sql.Timestamp的替代类。
java.time.LocalDate:本地日期,ISO-8601日历系统下的日期表示,不包含时区的概念,只能表示年月日。
java.time.LocalDateTime:本地日期时间,ISO-8601日历系统下的日期时间表示,不包含时区的概念,只能表示年月日时分秒。
java.time.LocalTime:本地时间,ISO-8601日历系统下的 ...