- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 日志框架升级
日志框架升级前言最近团队一个应用做平台化改造,应用中存在多个日志实现框架,这些框架并非应用自己引入,而是依赖了的N多二方包存在中间依赖,被迫引入到应用当中。仔细梳理后,发现这些中间依赖存在log4j1、logback等。团队目标是升级到性能提升很大的log4j2,在这个过程遇到一些问题,通过查阅ATA等资料也有所收获。升级过程采坑一刚开始第一直觉是,既然是升级Log4j2,把Log4j1和Logback的相关依赖全部排除,再引入log4j2的相关依赖就好了。按照这样的思路,禁用MavenHelpe
2020-12-07 20:29:19
1352
原创 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
1084
2
原创 Linux常用指令
Linux常用指令前言笔者总结了Linux比较常用的一些命令,以Xmind的形式做了笔记。常用命令的缩写把查询数据 同程为 Query (查询), 只提供根据聚合的ID 进行查询,查询结果 以DTO 形式返回改变状态叫做 Command (命令) , 提供Create,Upd...
2020-04-19 12:28:13
13118
原创 项目架构
项目架构前言FireTeam目前项目均采用SpringBoot、Dubbo等技术框架以及DDD(Domain Driver Design)设计思想搭建。书写这篇文档一方面是帮助新加入的小伙伴更快地熟悉项目,另一方面是形成团队规范、保持代码风格统一,接下来讲主要通过以下几个方面进行介绍:名词与概念目录结构项目模块设计理念文献领域驱动设计DDD和CQRS落地...
2020-04-19 12:25:33
13189
原创 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
14997
1
原创 基于Guava、RocketMQ的事件主线
基于Guava、RocketMQ的事件主线前言人间四月芬芳尽,产品测试一体化。2020必将是被裁入史册的一年,为了应对疫情,我司某某部门顺应开源节流号召,推出产品测试一体化体系,好多测试小伙伴纷纷下岗。回归正题,去年在老大推动下,开始采用领域驱动的方式进行开发,领域驱动有一个很重要的概念是:领域事件。领域事件是为了解耦代码,对于传统的MVC 3层结构,个人觉得也可以合理使用事件。对于事件,Sp...
2020-04-11 16:53:15
15054
原创 多租户逻辑分离预发数据与正式数据
多租户逻辑分离预发数据与正式数据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
14420
原创 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
15381
原创 Redis分布式锁
Redis分布式锁介绍随着微服务的兴起,比如Spring Cloud、Dubbo的等分布式解决方案地兴起,java的jvm锁某些场景下已经不在适用。特定的场景下,往往依靠分布式锁,常见的分布式锁实现方式有Redis分布式锁以及Zookeeper分布式锁。Redis分布式锁在项目编码中更为常见,比较成熟的框架有Redisson,就实现了分布式锁。虽然项目中我们可以使用比较成熟的Redisson,...
2020-03-24 01:02:25
22818
1
原创 FrameworkEndpointHandlerMapping
FrameworkEndpointHandlerMapping介绍在Spring Security中,相关的Endpoint定义了一些接口,比如TokenEndpoint的"/oauth/token"可用于登录返回Token信息,但是总有一些特殊需求,比如不希望使用"/oauth/token",而想使用"/login"进行替代。这时候我们就可以通过Spring Security的配置进行实现,...
2020-03-22 17:29:46
26295
原创 [8] RequestCacheAwareFilter
RequestCacheAwareFilter介绍这个Filter官方解释为:“用于用户登录成功后,重新恢复因为登录被打断的请求”,被打断也是有前提条件的,支持打断后可以被恢复的异常有AuthenticationException、AccessDeniedException,这个操作是ExceptionTranslationFilter中触发的,并且RequestCacheAwareFilte...
2020-03-21 23:36:04
25920
原创 [6] OAuth2AuthenticationProcessingFilter之Bearer Token验证流程
OAuth2AuthenticationProcessingFilter简介我们通过Spring Security的认证服务获取Access Token之后就可以用于请求资源服务(业务系统)的接口了。我们需要把特定的信息放到请求头中,例如在请求头中写入Authorization: Bearer !xBYUEBY0N3o234N,Authorization为key,Bearer !xBYUEBY...
2020-03-19 18:09:23
30928
原创 [13] FilterSecurityInterceptor
FilterSecurityInterceptor简介Spring Security对于权限的控制有2种方式,1.通过ExpressionInterceptUrlRegistry进行配置,2.通过注解和切面的方式。FilterSecurityInterceptor是针对于第一种方式权限配置的控制机制,在项目或服务启动时,Spring Security会把ExpressionIntercept...
2020-03-19 16:10:49
26400
1
原创 [12] ExceptionTranslationFilter
ExceptionTranslationFilter介绍Spring Security的异常处理不能像常规Spring MVC或者Spring Boot那样进行统一异常处理,而是在过滤器上进行了层层拦截,代码阅读起来也有些费劲。而该Filter是用于处理Spring Security部分异常的,开发者可以自定义accessDeniedHandler和authenticationEntryPo...
2020-03-16 14:47:12
27559
1
原创 [10] AnonymousAuthenticationFilter
AnonymousAuthenticationFilter介绍该过滤器功能比较简单,请求经过过滤器时,判断一下SecurityContext上下文中身份认证信息是否为null,如果为null,则创建一个匿名的身份认证信息并放到SecurityContext上下文环境中。代码分析AnonymousAuthenticationFilter关键代码如下:public void doFilt...
2020-03-16 09:11:36
26094
原创 [11] SessionManagementFilter
SessionManagementFilter介绍该Filter内部包含了SessionAuthenticationStrategy和SecurityContextRepository,SessionAuthenticationStrategy是一个复合会话认证策略CompositeSessionAuthenticationStrategy,默认情况下仅包含一个ChangeSessionId...
2020-03-16 00:58:34
26605
原创 [9] SecurityContextHolderAwareRequestFilter
SecurityContextHolderAwareRequestFilter介绍Spring Security TokenEndpoint中获取token的请求,有这样一个参数:Principal。 对于一个普通HttpServletRequest,是没有Principal参数类型的。SecurityContextHolderAwareRequestFilter通过HttpServletR...
2020-03-16 00:58:08
27348
原创 [7] ClientCredentialsTokenEndpointFilter
ClientCredentialsTokenEndpointFilter介绍Spring Security对于获取TOKEN的请求(默认是"/oauth/token"),需要认证client_id和client_secret。认证client_id和client_secret可以有2种方式,一种是通过本节讲的ClientCredentialsTokenEndpointFilter,另一种是通...
2020-03-11 19:40:40
28917
1
原创 [5] LogoutFilter
LogoutFilter介绍LogoutFilter是一个登出过滤器,当请求经过LogoutFilter时,过滤器会请判断当前请求的URL是否是登出URL,如果匹配,就执行遍历执行登出handlers。默认情况下,会清空SecurityContextHolder的身份认证信息,以及发送一个登出成功的事件。代码分析我们首先看一下LogoutFilter的构造器,代码如下:public ...
2020-03-11 19:40:09
26317
原创 [4] HeaderWriterFilter
HeaderWriterFilter介绍HeaderWriterFilter是在请求前后写入一些往前请求头或者响应头写入一些信息,本身并不复杂。通过shouldWriteHeadersEagerly进行控制进行,在过滤执行前写入还是在过滤执行完写入。shouldWriteHeadersEagerly默认为false,可以通过配置添加ObjectPostProcessor的方式进行设置为tru...
2020-03-10 13:30:08
27593
原创 ObjectPostProcessor
ObjectPostProcessor介绍笔者在学习Spring Security,调试HeaderWriterFilter源码时,遇到了一个比较困惑的问题,HeaderWriterFilter在往请求头写入信息时,通过shouldWriteHeadersEagerly这个变量来控制,在调用过滤器之前写入还是调用doFilter()之后写入,默认是后者。但是既然有这个分支,就能够控制。笔者以...
2020-03-09 21:25:21
32326
1
原创 [3] SecurityContextPersistenceFilter
SecurityContextPersistenceFilter介绍我们从字面上可以看出这是一个SecurityContext持久化的过滤器,这个也是SecurityContext相关的过滤器。再一次HTTP请求经过该过滤器时,Spring Security会先从SecurityContextRepository的取认证信息,这个接口有2种实现,分别是:1)_NullSecurityCont...
2020-03-08 22:46:12
27020
原创 [2] WebAsyncManagerIntegrationFilter
WebAsyncManagerIntegrationFilter介绍字面意思这是一个Web异步管理集成过滤器,翻译成中文依然很抽象。我们从ThreadLocal讲起,ThreadLocal可以理解为一个与当前线程绑定的Map, key是当前线程,value是要存储的object。当我们在同一个线程中,可以通过get()方法获取到value。如果在A线程set(object),然后在B线程中调...
2020-03-07 00:58:10
27533
原创 [1] Spring Security Filters
Spring Security Filters前言Spring Security的配置不同,过滤链的过滤器也不尽相同,按照笔者项目的配置,Debug出Spring Security的过滤器按照过滤链的优先级如下几个:WebAsyncManagerIntegrationFilterSecurityContextPersistenceFilterHeaderWriterFilterLo...
2020-03-07 00:56:42
25653
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
34897
11
原创 Idea插件开发之Gradle
Idea插件开发之Gradle1. 前言作为Java开发者,Intellij Idea可以说是必备开发工具,Jetbrains提供了丰富的插件库。但是,有时候我们都在做重复、繁琐、无意义的操作,我们就可以自己编写插件,来简化工作。由于冠状病毒的影响,作者过年只能待在家里,研究了一下如何在Intellij Idea上开发插件,下面介绍一下采坑记录。2. 准备工作2.1 软件与环境首先需要安...
2020-02-07 22:06:21
33387
8
原创 一种短ID生成策略
一种短ID生成策略一、背景最近公司一个项目中存在一个业务场景,类似在美团上下单,去商户消费确认消费时,用户需要向商家提供一串编码来作为用户到店消费凭证,这个码我们称之为“核销码”。这个核销码需要具有这样特性:1.不能太长;2.具有一定随机性;3.具有一定的复杂度以免被太容易被伪造 4.不能重复。Snowflake算法可以在分布式环境下生成不重复的ID,百度改造后的Snowflake生成的Lon...
2019-12-10 18:05:14
29647
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
28785
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
27553
原创 MySQL之从锁的角度看update(二)
背景笔者前段时间接了购物车的需求,其中用户有段逻辑更改购物车商品的数量后,然后更新到数据库。因为笔者项目有两台机子,nginx做负载均衡,所以更新DB的加了分布式的锁。后来笔者后知后觉,觉得完全没有必要。问题首先看笔者代码://1.根据用户ID以及商品编码定位数据ShoppingCartWaresDO waresDOFromDb = shoppingCartWaresDAO.select...
2019-09-11 19:52:46
26100
原创 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
27134
原创 简化Httpclient使用
简化Httpclient使用背景传统的请求方式笔者的请求方式使用背景 工欲善其事,必先利其器。最近笔者的产品又对我提出了很多的非分的需求,从数据库没有的字段也非要我导到Excel里。几千条数据,让我一个一个去查,笔者每天加班到死,手里一堆活,于是乎跟产品开始撕X。虽然表面上产品像我的死党一样,但是毕竟几千条数据,也不好查。善良的我,准备把导出的数据用java导入内存,然后用Httpclien...
2019-07-18 00:09:05
26107
2
原创 基于Redis的延时任务队列
基于Redis的延时任务队列一.背景二.整体构架设计思路构架图如下:三.代码类图DelayJob(任务详情)WaitQueue(延时队列)ReadyQueue(就绪队列)Scanner(扫描线程,轮训任务)四.使用Maven依赖spring mvc中使用一.背景 笔者先前遇到了一个订单超时关闭的问题,首先就排除了:起一任务轮训数据库的方案,太耗资源,也增加DB的负担。查阅了一些资料,Rock...
2019-07-17 16:38:54
30266
3
原创 Java 5行代码搞定Excel导入导出
Java 5行代码搞定Excel导入导出场景使用创建表格映射对象导出演示导入演示引入mavengithub场景在工作中,导出Excel的场景经常出现,比如管理后台导出的功能、批量订正数据库等,在这些场景中的表格数据往往对应数据库的一条记录,表格格式十分简单。但是,类似导入导出都要用不同的代码实现。产品经常给笔者一个Excel表格数据,导入到数据库。每次都要写一堆功能、流程类似的导入导出代码,十...
2019-07-15 13:16:57
25655
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
33094
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
25685
example.zip
2019-07-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人