自定义博客皮肤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)
  • 资源 (1)
  • 收藏
  • 关注

原创 日志框架升级

日志框架升级前言最近团队一个应用做平台化改造,应用中存在多个日志实现框架,这些框架并非应用自己引入,而是依赖了的N多二方包存在中间依赖,被迫引入到应用当中。仔细梳理后,发现这些中间依赖存在log4j1、logback等。团队目标是升级到性能提升很大的log4j2,在这个过程遇到一些问题,通过查阅ATA等资料也有所收获。升级过程采坑一刚开始第一直觉是,既然是升级Log4j2,把Log4j1和Logback的相关依赖全部排除,再引入log4j2的相关依赖就好了。按照这样的思路,禁用MavenHelpe

2020-12-07 20:29:19 1204

原创 Tomcat IDEA源码调试环境搭建

Tomcat IDEA源码调试环境搭建前言前段时间把tomcat的源码下载到本地,计划看看tomcat源码,了解一下其基本原理。但是,由于种种原因半途而废了。最近突然想搭建一下源码调试环境,发现网上许多文章都无法成功运行,最终参考多篇文章,使项目可以运行,做一下笔记进行记录。1. 采坑记录以tomcat8.5.x为例,笔者是从github上获取的tomcat源码,但是tomcat的源码是通过ant构建的,idea直接打开后,把java目录标记为Sources Root,test目录标记为Test S

2020-10-05 00:59:58 848 2

原创 Linux常用指令

Linux常用指令前言笔者总结了Linux比较常用的一些命令,以Xmind的形式做了笔记。常用命令![Linux.png](https://img-blog.csdnimg.cn/img_convert/412deea5c47e6b068cdd46f81ca4de96.png#align=left&display=inline&height=8216&margin=[object Object]&name=Linux.png&originHeight=8216

2020-09-26 14:18:15 205

原创 设计理念

设计理念1. DDD架构演进1.1 DDD依赖倒置架构Vernon在它的《实现领域驱动设计》一书中提到了采用依赖倒置原则改进的方案。所谓的依赖倒置原则指的是:高层模块不应该依赖于低层模块,两者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。从图中可以看到,基础设施层位于其他所有层的上方,接口定义在其它层,基础实施实现这些接口。依赖原则的定义在DDD设计中可以改述为:领域...

2020-04-19 12:29:52 13377

原创 工程模块

工程模块1. 模块划分项目共分为7大模块,分别如下:–start: 启动模块–infrastructure:基础设施层–query:查询层–application: 应用层–**domain:领域层–shared:共享层–api:对外服务接口**2. 模块依赖关系各个模块依赖关系如下,上层模块依赖下层模块,下层模块不可依赖上层模块,否则会造成循环依赖:3. 模块介绍3....

2020-04-19 12:29:21 13672

原创 目录结构

目录结构目录层级项目采用领域驱动设计思想,汲取了几本比较权威的领域驱动相关书籍,将DDD实践至线上项目,项目基本目录结构设计如下:├── firefly-api#对外dubbo api模块│ └── src│ └── main│ └── java│ └── com│ └── souc...

2020-04-19 12:28:51 13262

原创 名词与概念

名词与概念DDDDomain Driven Design即领域驱动设计CQRSCommand Query Responsibility Seperation(命令查询职责分离)的缩写把查询数据 同程为 Query (查询), 只提供根据聚合的ID 进行查询,查询结果 以DTO 形式返回改变状态叫做 Command (命令)   , 提供Create,Upd...

2020-04-19 12:28:13 13052

原创 项目架构

项目架构前言FireTeam目前项目均采用SpringBoot、Dubbo等技术框架以及DDD(Domain Driver Design)设计思想搭建。书写这篇文档一方面是帮助新加入的小伙伴更快地熟悉项目,另一方面是形成团队规范、保持代码风格统一,接下来讲主要通过以下几个方面进行介绍:名词与概念目录结构项目模块设计理念文献领域驱动设计DDD和CQRS落地...

2020-04-19 12:25:33 13144

原创 Mysql开启bin-log采坑

Mysql开启bin-log采坑问题目前项目用到的Mysql版本基本上都在5.7以上了,笔者的Mysql在docker环境下部署的,为了学习bin-log,根据网上资料进行配置,发现无法开启bin-log。配置docker-compose配置version: "3.7"services: mysql: image: mysql:5.7 container_name:...

2020-04-14 10:08:22 14893 1

原创 基于Guava、RocketMQ的事件主线

基于Guava、RocketMQ的事件主线前言人间四月芬芳尽,产品测试一体化。2020必将是被裁入史册的一年,为了应对疫情,我司某某部门顺应开源节流号召,推出产品测试一体化体系,好多测试小伙伴纷纷下岗。回归正题,去年在老大推动下,开始采用领域驱动的方式进行开发,领域驱动有一个很重要的概念是:领域事件。领域事件是为了解耦代码,对于传统的MVC 3层结构,个人觉得也可以合理使用事件。对于事件,Sp...

2020-04-11 16:53:15 14945

原创 多租户逻辑分离预发数据与正式数据

多租户逻辑分离预发数据与正式数据1. 依赖<dependency> <groupId>com.github.rxyor</groupId> <artifactId>carp-mybatis-plus-tenant-starter</artifactId> <version>1.0.14.6</...

2020-04-08 14:21:05 14350

原创 Jmockit配合Jacoco

Jmockit配合Jacoco1. pom.xml配置<?xml version="1.0" encoding="UTF-8" ?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio...

2020-04-08 14:09:24 15215 1

原创 Redis分布式锁

Redis分布式锁介绍随着微服务的兴起,比如Spring Cloud、Dubbo的等分布式解决方案地兴起,java的jvm锁某些场景下已经不在适用。特定的场景下,往往依靠分布式锁,常见的分布式锁实现方式有Redis分布式锁以及Zookeeper分布式锁。Redis分布式锁在项目编码中更为常见,比较成熟的框架有Redisson,就实现了分布式锁。虽然项目中我们可以使用比较成熟的Redisson,...

2020-03-24 01:02:25 22775 1

原创 FrameworkEndpointHandlerMapping

FrameworkEndpointHandlerMapping介绍在Spring Security中,相关的Endpoint定义了一些接口,比如TokenEndpoint的"/oauth/token"可用于登录返回Token信息,但是总有一些特殊需求,比如不希望使用"/oauth/token",而想使用"/login"进行替代。这时候我们就可以通过Spring Security的配置进行实现,...

2020-03-22 17:29:46 26169

原创 [8] RequestCacheAwareFilter

RequestCacheAwareFilter介绍这个Filter官方解释为:“用于用户登录成功后,重新恢复因为登录被打断的请求”,被打断也是有前提条件的,支持打断后可以被恢复的异常有AuthenticationException、AccessDeniedException,这个操作是ExceptionTranslationFilter中触发的,并且RequestCacheAwareFilte...

2020-03-21 23:36:04 25779

原创 [6] OAuth2AuthenticationProcessingFilter之Bearer Token验证流程

OAuth2AuthenticationProcessingFilter简介我们通过Spring Security的认证服务获取Access Token之后就可以用于请求资源服务(业务系统)的接口了。我们需要把特定的信息放到请求头中,例如在请求头中写入Authorization: Bearer !xBYUEBY0N3o234N,Authorization为key,Bearer !xBYUEBY...

2020-03-19 18:09:23 30656

原创 [13] FilterSecurityInterceptor

FilterSecurityInterceptor简介Spring Security对于权限的控制有2种方式,1.通过ExpressionInterceptUrlRegistry进行配置,2.通过注解和切面的方式。FilterSecurityInterceptor是针对于第一种方式权限配置的控制机制,在项目或服务启动时,Spring Security会把ExpressionIntercept...

2020-03-19 16:10:49 26199 1

原创 [12] ExceptionTranslationFilter

ExceptionTranslationFilter介绍Spring Security的异常处理不能像常规Spring MVC或者Spring Boot那样进行统一异常处理,而是在过滤器上进行了层层拦截,代码阅读起来也有些费劲。而该Filter是用于处理Spring Security部分异常的,开发者可以自定义accessDeniedHandler和authenticationEntryPo...

2020-03-16 14:47:12 27444 1

原创 [10] AnonymousAuthenticationFilter

AnonymousAuthenticationFilter介绍该过滤器功能比较简单,请求经过过滤器时,判断一下SecurityContext上下文中身份认证信息是否为null,如果为null,则创建一个匿名的身份认证信息并放到SecurityContext上下文环境中。代码分析AnonymousAuthenticationFilter关键代码如下:public void doFilt...

2020-03-16 09:11:36 26020

原创 [11] SessionManagementFilter

SessionManagementFilter介绍该Filter内部包含了SessionAuthenticationStrategy和SecurityContextRepository,SessionAuthenticationStrategy是一个复合会话认证策略CompositeSessionAuthenticationStrategy,默认情况下仅包含一个ChangeSessionId...

2020-03-16 00:58:34 26417

原创 [9] SecurityContextHolderAwareRequestFilter

SecurityContextHolderAwareRequestFilter介绍Spring Security TokenEndpoint中获取token的请求,有这样一个参数:Principal。 对于一个普通HttpServletRequest,是没有Principal参数类型的。SecurityContextHolderAwareRequestFilter通过HttpServletR...

2020-03-16 00:58:08 26976

原创 [7] ClientCredentialsTokenEndpointFilter

ClientCredentialsTokenEndpointFilter介绍Spring Security对于获取TOKEN的请求(默认是"/oauth/token"),需要认证client_id和client_secret。认证client_id和client_secret可以有2种方式,一种是通过本节讲的ClientCredentialsTokenEndpointFilter,另一种是通...

2020-03-11 19:40:40 28656 1

原创 [5] LogoutFilter

LogoutFilter介绍LogoutFilter是一个登出过滤器,当请求经过LogoutFilter时,过滤器会请判断当前请求的URL是否是登出URL,如果匹配,就执行遍历执行登出handlers。默认情况下,会清空SecurityContextHolder的身份认证信息,以及发送一个登出成功的事件。代码分析我们首先看一下LogoutFilter的构造器,代码如下:public ...

2020-03-11 19:40:09 26201

原创 [4] HeaderWriterFilter

HeaderWriterFilter介绍HeaderWriterFilter是在请求前后写入一些往前请求头或者响应头写入一些信息,本身并不复杂。通过shouldWriteHeadersEagerly进行控制进行,在过滤执行前写入还是在过滤执行完写入。shouldWriteHeadersEagerly默认为false,可以通过配置添加ObjectPostProcessor的方式进行设置为tru...

2020-03-10 13:30:08 27473

原创 ObjectPostProcessor

ObjectPostProcessor介绍笔者在学习Spring Security,调试HeaderWriterFilter源码时,遇到了一个比较困惑的问题,HeaderWriterFilter在往请求头写入信息时,通过shouldWriteHeadersEagerly这个变量来控制,在调用过滤器之前写入还是调用doFilter()之后写入,默认是后者。但是既然有这个分支,就能够控制。笔者以...

2020-03-09 21:25:21 32158 1

原创 [3] SecurityContextPersistenceFilter

SecurityContextPersistenceFilter介绍我们从字面上可以看出这是一个SecurityContext持久化的过滤器,这个也是SecurityContext相关的过滤器。再一次HTTP请求经过该过滤器时,Spring Security会先从SecurityContextRepository的取认证信息,这个接口有2种实现,分别是:1)_NullSecurityCont...

2020-03-08 22:46:12 26888

原创 [2] WebAsyncManagerIntegrationFilter

WebAsyncManagerIntegrationFilter介绍字面意思这是一个Web异步管理集成过滤器,翻译成中文依然很抽象。我们从ThreadLocal讲起,ThreadLocal可以理解为一个与当前线程绑定的Map, key是当前线程,value是要存储的object。当我们在同一个线程中,可以通过get()方法获取到value。如果在A线程set(object),然后在B线程中调...

2020-03-07 00:58:10 27323

原创 [1] Spring Security Filters

Spring Security Filters前言Spring Security的配置不同,过滤链的过滤器也不尽相同,按照笔者项目的配置,Debug出Spring Security的过滤器按照过滤链的优先级如下几个:WebAsyncManagerIntegrationFilterSecurityContextPersistenceFilterHeaderWriterFilterLo...

2020-03-07 00:56:42 25608 1

原创 Spring Security Oauth2:RedisTokenStore(二)之JSON序列化

RedisTokenStore:Json序列化一. 前言Spring Security Oauth2 存储Token的方式有多种, 比如JWT、Jdbc(数据库)、Redis等,但是对于一个大型的分布式服务应用,Redis存储方式应该是最佳选择。二. 问题我们使用默认的Redis存储方式,序列化到到Redis的数据如如下所示的的结果:图1这样数据,十分不直观,我们能不能把它们序列化成J...

2020-02-26 01:24:51 34395 11

原创 Idea插件开发之Gradle

Idea插件开发之Gradle1. 前言作为Java开发者,Intellij Idea可以说是必备开发工具,Jetbrains提供了丰富的插件库。但是,有时候我们都在做重复、繁琐、无意义的操作,我们就可以自己编写插件,来简化工作。由于冠状病毒的影响,作者过年只能待在家里,研究了一下如何在Intellij Idea上开发插件,下面介绍一下采坑记录。2. 准备工作2.1 软件与环境首先需要安...

2020-02-07 22:06:21 33201 8

原创 一种短ID生成策略

一种短ID生成策略一、背景最近公司一个项目中存在一个业务场景,类似在美团上下单,去商户消费确认消费时,用户需要向商家提供一串编码来作为用户到店消费凭证,这个码我们称之为“核销码”。这个核销码需要具有这样特性:1.不能太长;2.具有一定随机性;3.具有一定的复杂度以免被太容易被伪造 4.不能重复。Snowflake算法可以在分布式环境下生成不重复的ID,百度改造后的Snowflake生成的Lon...

2019-12-10 18:05:14 29284 3

原创 Spring Cacheable(Redis)扩展实现注解式TTL

一、背景我们在项目当中经常要使用redis作为缓存,可选择的方式有:1)编程方式 2)注解方式1. 编程方式jedisredisTempateredisson…2. 注解方式spring cache系列注解通过切面自定义注解实现由于spring @Cacheable提供了多种缓存实现,有的缓存是不支持ttl的,因此@Cacheable注解当中是没有设置ttl参数的,Red...

2019-11-05 16:46:23 28493 4

原创 算法之BTree(Java版)

package com.github.rxyor.example.algorithm.btree;import java.io.Serializable;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.O...

2019-09-28 14:45:53 27466

原创 MySQL之从锁的角度看update(二)

背景笔者前段时间接了购物车的需求,其中用户有段逻辑更改购物车商品的数量后,然后更新到数据库。因为笔者项目有两台机子,nginx做负载均衡,所以更新DB的加了分布式的锁。后来笔者后知后觉,觉得完全没有必要。问题首先看笔者代码://1.根据用户ID以及商品编码定位数据ShoppingCartWaresDO waresDOFromDb = shoppingCartWaresDAO.select...

2019-09-11 19:52:46 26008

原创 MySQL事务隔离级别以及Mybatis代码演示(一)

MySql事务一、事务隔离级别1. 读未提交(read uncommited)二、演示1. 初始化表2. 读未提交(read uncommited)一、事务隔离级别1. 读未提交(read uncommited)二、演示1. 初始化表CREATE TABLE `goods` ( `id` int(11) NOT NULL COMMENT '自增主键', `name` varcha...

2019-09-04 14:50:48 27049

原创 简化Httpclient使用

简化Httpclient使用背景传统的请求方式笔者的请求方式使用背景  工欲善其事,必先利其器。最近笔者的产品又对我提出了很多的非分的需求,从数据库没有的字段也非要我导到Excel里。几千条数据,让我一个一个去查,笔者每天加班到死,手里一堆活,于是乎跟产品开始撕X。虽然表面上产品像我的死党一样,但是毕竟几千条数据,也不好查。善良的我,准备把导出的数据用java导入内存,然后用Httpclien...

2019-07-18 00:09:05 26050 2

原创 基于Redis的延时任务队列

基于Redis的延时任务队列一.背景二.整体构架设计思路构架图如下:三.代码类图DelayJob(任务详情)WaitQueue(延时队列)ReadyQueue(就绪队列)Scanner(扫描线程,轮训任务)四.使用Maven依赖spring mvc中使用一.背景  笔者先前遇到了一个订单超时关闭的问题,首先就排除了:起一任务轮训数据库的方案,太耗资源,也增加DB的负担。查阅了一些资料,Rock...

2019-07-17 16:38:54 30144 3

原创 Java 5行代码搞定Excel导入导出

Java 5行代码搞定Excel导入导出场景使用创建表格映射对象导出演示导入演示引入mavengithub场景在工作中,导出Excel的场景经常出现,比如管理后台导出的功能、批量订正数据库等,在这些场景中的表格数据往往对应数据库的一条记录,表格格式十分简单。但是,类似导入导出都要用不同的代码实现。产品经常给笔者一个Excel表格数据,导入到数据库。每次都要写一堆功能、流程类似的导入导出代码,十...

2019-07-15 13:16:57 25618 2

原创 Elasticsearch起步之elasticsearch sql使用(三)

Elasticsearch起步之elasticsearch sql使用下载ES JDBC驱动安装DataGrip配置DataGrip问题解决1. 订阅官方白金会员2. 30天试用idea编译javac命令编译配置license申请license上传license系列文章本文以ubuntu18.04、elasticsearch-7.1.1、DataGrip 2019.1.1为例下载ES JD...

2019-07-01 04:03:35 32749 1

原创 Elasticsearch起步之kibana安装(二)

Elasticsearch起步之kibana安装下载安装安装deb配置启动kibana系列文章本文以ubuntu18.04和kibana-7.1.0下载本文以deb安装方式为例,因为博主发现tar.gz安装包在ubuntu18.04 server虚拟机上安装成功,而在deepin desktop非虚拟机环境一直启动失败。所以,我这里选择deb安装方式。tar.gz的包,安装也无非解压、启...

2019-07-01 01:40:06 25629

example.zip

 但是,如果不幸的是你的服务没有使用RocketMQ,如ActiveMQ等不支持延时消息的消息中间件怎么办?可以基于Redis的SkipList(跳跃表), Redis Client的命令是zset(sorted set)、zadd 等。简而言之,就是在set key的时候,除了value还可以添加一个score, 当你取出key中取出value时可以指定取出指定范围score,本篇博文就是基于Redis跳跃表实现的。

2019-07-17

空空如也

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

TA关注的人

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