7 carl-zhao

我要认证

I never grew up, bu i never stop growing.

等级
TA的排名 5k+

通过 Spring Event 方式优雅的抽象策略模式解决 if else 问题

策略模式是设计模式中非常常用的一种设计模式。它对修改关闭,对扩展开放。而且通过策略模式还可以减少项目中一系列的 ``if else`` 代码块。常见的策略模式也很多种写法。比如:定义一个接口,接口有不同的实现,然后定义一个工厂,把这个接口的实现以对应不同的 Key 保存到这个工厂里面,然后通过传入不同的 key 从定义好的 Map 中获取到对应接口的实例,如果需要新添加策略就直接添加新的实现就可以了。

2020-09-26 00:08:36

Spring 事务扩展机制 TransactionSynchronization

在进行数据库操作的时候,如果需要多个操作要么一起成功,要么一起失败那么就需要使用事务操作了。使用 Spring 框架只需要在方法上添加 ``@Transactional`` 注解这个方法就具有事务特性了。而且 Spring 也事务操作给开发者提供了很方便的扩展。

2020-09-19 20:42:34

由 RedisTemplate 事务 enableTransactionSupport 引发的血案

在最近的项目当中因为使用了类似字典表的数据所以我使用的 Spring Farmework 当中的 Cache 抽象,通过 Redis 来做为缓存。因为原有项目当中配置了 Redis,而且项目是基于 Spring Boot 构建的,并没有去除 Redis 的自动依赖(RedisAutoConfiguration)。导致有些 Redis 的有些类是基于项目中自己配置的 RedisTemplate,而有些又是引用的 Spring Boot 中 Redis 的自动配置生成的 RedisTemplate。所以我就把

2020-09-16 21:55:01

Netty 源码分析之 Java NIO

Java NIO(新的IO)是Java(来自Java 1.4)的可选IO API,意味着可选标准Java IO和Java连网API。Java NIO提供了一种不同于标准IO API的IO工作方式。为什么会出现 Java NIO 呢?下面我们来比较一下 Java IO 也 JDK 1.4 之后出现的 Java NIO 有什么区别.1、IO 与 NIO下面就是 IO 与 NIO 的对比:IONIO面向流面向缓冲阻塞 IO非阻塞 IO无选择器1.1 面向流与面向缓

2020-09-09 21:36:04

Spring Boot 自动配置原理解析

Spring Boot 使得创建可以“直接运行”的独立的、生产级的基于 Spring 的应用程序变得很容易。当我们直接使用 Spring Framework 集成第三方框架时,使用过的朋友都知道需要繁琐的配置。如果我们使用 Spring Boot 时,如果需要集成缓存框架 Redis 时,只需要在开发的项目中引入 Redis 相关的配置就可以 RedisTempalte 操作本地早已启动好的 Redis 服务。

2020-08-30 17:10:07

Spring Cloud Gateway 自定义 ReadBodyPredicateFactory 实现动态路由

在互网企业当中网关的重要性我就不再赘述了,相信大家都比较清楚。我们公司网关采用的是 Spring Cloud Gateway。并且是通过自定义 RouteLocator 来实现动态路由的。路由规则是请求参数里面的 bizType,比如接收 JSON 格式体的请求对象并且业务方请求的是创建支付订单接口,下面就是业务方需要传递的参数:{ "bizType" : "createOrder", .... 其它业务参数 }下面就是读取 requestBody 里面的主动参数,然后解析请求对象里面的 biz

2020-08-27 09:42:13

Spring Boot 通过 Mvc 扩展方便进行货币单位转换

由于公司是支付平台,所以很多项目都涉及到金额,业务方转递过来的金额是单位是元,而我们数据库保存的金额单位是分。一般金额的流向有以下几个方向:- 外部业务方请求我们服务,传递过来的金额单位是元,需要把元转换成分。比如:下单接口。- 内部系统之间的流转,不管是向下传递还是向上传递系统间的流程都是分,不需要扭转。比如:调用支付引擎(向下传递),支付引擎回调收单业务(向上传递)。- 向业务方返回数据,这个时候需要把分转换成元。比如:商户调用查询订单接口。

2020-08-20 23:30:19

AWS 服务报 502 错误排查结果

如下是8月18日 系统报错502 Bad GateWay问题定位、追踪、方案确认等:一、现象:1点25分左右系统报警5xx错误;二、定位:排查过程查看ELB日志确认错误来源于(商户API:查询支付结果及创建跨境支付单);查询Pinpoint、Grafana及日志系统各项指标正常;三、跟踪及分析:查看ELB监控面板发现,502错误一直都存在,分布比较零散(大概的发生概率:万分之一(一万个请求约1次502错误)]);确认调用链路确认错误区域:商户 —> ELB —> 业务系统;

2020-08-19 22:36:51

Quartz 源码分析

``Quartz`` 是运用最广的任务调度框架,它最核心的组成部分是 ``Scheduler``、``Trigger``、``JobDetail``。在 ``Scheduler`` 初始化的时候会启动线程``QuartzSchedulerThread``,当``Scheduler`` 启动的时候,也就是调用 ``Scheduler#start`` 方法,就会从 ``JobStore`` 里拿到最近需要触发的``Trigger``,以线程等待的方式等到 `` trigger`` 触发时间点,之后就是执行

2020-08-15 11:28:09

Spring Boot Cache 集成 Spring Data Redis 1.x 与 2.x 的差异

自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,在此之前一般通过AOP实现。通过 Spring Cache 可以很方便的管理我们的缓存。使用Spring Cache的好处:提供基本的Cache抽象,方便切换各种底层Cache;通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;提供事务回滚时也自动回滚缓存;支持比较复杂的缓存逻辑;内存缓存 Redis 由于它支

2020-08-13 22:41:32

Spring Framwork 扩展点总结

接口扩展描述典型场景BeanFactoryPostProcessor对 BeanDefinition 进行修改Class 定义的 Bean,@Configuration 和 @BeanBeanPostProcessor对 Spring Bean 进行修改@Resource 通过反射进行依赖注入FactoryBean使用 Class 定义 BeanSpring 3.0 出现 @Configuration 和 @Bean 的复杂度高的 Bean 创建方式XXX...

2020-08-08 12:31:49

史上最全的企业级定时任务框架 Quartz 介绍

Quartz是一个功能丰富的开源作业调度库,可以集成到几乎任何Java应用程序中——从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的调度,用于执行数十、数百甚至数万个任务;任务被定义为标准Java组件的作业,可以执行您可以为其编写的任何操作。Quartz调度器包括许多企业级特性,比如对JTA事务和集群的支持。

2020-08-02 19:03:03

Spring Cloud Gateway 之 Filter 不调用过滤链直接返回结果

Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。网关提供API全托管

2020-07-23 08:59:08

Apache Tomcat 会话机制 Cookie 与 Session

HTTP 协议是一种状态的协议,WEB 服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一个请求都是完全独立的。即使 HTTP 1.1 支持持续连接,但当用户有一段时间没有提交请求,连接也会关闭。怎么才能实现网上商店中的购物车呢:某个用户从网站的登陆页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求程序所得到的用户信息。作为 Web 服务器,必须能够采用一种机制来唯一地标识一个标识,同时记录该用户的状态。会话和会话状态Web 应用中的会话是指一个客户端

2020-07-19 12:15:41

Java ThreadPoolExecutor 使用及原理探究

Java 中的线程池是并发框架当中运行场景最多的并发工具类,基本上需要异步或者并发执行的任务都可以使用线程池。相比开发人员直接使用手动创建线程,使用线程池可以有以下几个好处。降低资源消耗。通过重复利用已经创建的线程降低线程创建和销毁造成的消极。提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行提高线程的可管理性。在 Java 中线程和操作系统里面的线程是一一对就的。所以线程是稀缺,如果无限地创建线程,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但

2020-07-12 00:04:52

Spring Boot 集成 Redis 事件通知实现订单到期自动关闭

之前写过一篇文章 RabbitMQ 延迟队列实现订单自动关闭,今天介绍另外一种方式就是通过 Redis 的过期来实现订单自动关闭。1、功能概述从 Redis 2.8.0 开始,健空间通知允许客户订阅 Pub/Sub 通道以接收影响Redis数据集的事件。可以接收到的事件的例子如下:影响给定键的所有命令。接收LPUSH操作的所有键。所有键在数据库 0 中到期。事件是使用正常的发布/订阅层的Redis,所以实现发布/订阅的客户端可以使用这个功能而不需要修改。因为 Redis 发布/订阅是 f

2020-07-11 20:20:22

优雅的进行线上数据订正

在系统开发上线过程中,难免会遇到在测试过程中没有覆盖到的场景,而且还有可能生成脏数据。这个时候就需要对错误数据进行一一修改了。如果遇到需要修改的数据量比较少,那么可以进行手动的编辑 SQL。如果数据量过大的时候,进行手动编辑 SQL 不仅耗时还很容易出现错误。做为一个 coder 我们可以使用程序来解决这个问题。

2020-07-08 22:46:43

Apollo 通过 Spring Mvc DeferredResult 实现长轮询服务推送

最近在看 Apollo 配置中心的实现原理,``Apollo`` 的发布配置推送变更消息就是用 ``DeferredResult`` 实现的。``Apollo`` 客户端会循环的向服务端发送长轮训 ``Http`` 请求,超时时间 60 秒 。当超时后返回客户端一个 ``Http Status`` 为 ``304`` 状态码的时候表明配置没有变更,客户端继续这个步骤重复发起请求。当有发布配置的时候,服务端会调用 DeferredResult.setResult 返回 ``200`` 状态码,然后轮训

2020-07-04 11:03:13

Spring Boot 集成 Mybatis Plus 简化数据库操作

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。1、为什么需要 Mybatis Plus现在主流的开源 ORM 框架主要是 Mybatis 和 JPA 这两个开源框架,下面我们就来分别看一下这两个开源框架的优势。1.1 Mybatis 的优势SQL 语句可以自由控制,更灵活,性能较高SQL 与代码分离,更于阅读和维护提供 XML 标签,支持编写动态 SQL 语句1.2 JPA 的优势JPA

2020-06-21 23:59:55

Spring Cloud Gateway 15 分钟极速入门

Spring cloud gateway 是 spring 官方基于 Spring 5.0、Spring Boot2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等

2020-05-31 22:48:09

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 领英
    领英
    绑定领英第三方账户获取
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 脉脉勋章
    脉脉勋章
    绑定脉脉第三方账户获得
  • 签到王者
    签到王者
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证(专家版)
    技术圈认证(专家版)
    博客专家完成年度认证,即可获得
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv3
    阅读者勋章Lv3
    授予在CSDN APP累计阅读博文达到30天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 原力探索
    原力探索
    参与《原力计划【第二季】——打卡挑战》的文章入选【每日精选】的博主将会获得此勋章。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。