自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 运行时替换静态类的方法

1、引入依赖 <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> </dependency> <dependency> <groupId>net.bytebuddy</grou

2022-05-21 00:22:31 839 1

原创 Profile实现环境隔离,实现只在调试环境引入swagger的配置和jar包

1、pom.xml中只在dev的profile下引入swagger相关的依赖<?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:schemaLocation="http://maven.apache.org/PO

2022-02-28 22:47:08 908

原创 使用jdk的spi机制实现接口的扩展和解耦

0、背景总所周知,SPI在很多地方都有着很好的实践,比如JDBC驱动的加载、dubbo等,SpringBoot项目的autoConfiguration也是类似的原理。这里就感觉用来做模块解耦也不错。比如我们做应用管理的一个服务,它具有应用安装、升级、扩容等功能,经常在安装、升级、扩容流程中应用要求做一些定制化的东西,比如安装数据库,需要初始化database;安装kafka,需要初始化topic;对kafka的消费者进行扩容,需要同步扩topic的分区等等。而对于做应用管理的服务来说,它不应该区别化的对待

2022-02-25 21:33:23 1573

原创 kafka获取性能监控数据

1、背景kafka开源本身实现了yammer metrics,详见https://docs.confluent.io/platform/current/kafka/monitoring.html。只要能获取到metrics的数据kafka对于维护者来说就不再是个黑盒子,每秒进出流量、broker健康度等都可以可视化。2、通过jconsole查看kafka的mbean虽然正式部署到生产环境一般不会使用jconsole,但是这一步对于调试非常有用。本地起一个zk,方便调试我直接通过idea启动kafka

2021-05-21 16:24:57 1045 3

原创 【kafka】使用jmeter压测kafka并发性能

1、idea中开发kafka并发测试需要的扩展包由于jmeter的jms模块并不支持kafka,因此需要扩展开发引入jmeter <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>5.4.1&l

2021-02-09 14:50:51 2247

原创 【kafka】kafka-manager安装部署

1、下载二进制由于只是预研就直接下载二进制,就不从源码编译了,开源也提供了直接可运行的二进制,下载链接:https://github.com/yahoo/CMAK/releases我使用的是3.0.0.4版本2、修改配置修改conf/application.confkafka-manager.zkhosts和cmak.zkhosts修改为真实的zk地址3、启动先启动zookeeperkafka和kafka-manager启动的先后顺序没要求启动kafka-manager使用bin目录下的c

2020-12-03 17:10:45 372

原创 maven依赖查找小工具

0.背景对于项目中引入的依赖,我们可以使用依赖树去分析,查找某个依赖是哪里引入的,但是若是给一份依赖的名单,如何能快速查找那些依赖不在名单呢?一个一个去搜索肯定效率低下。尤其产品安全较为严格的项目,每个引入的依赖都是严格限制的,开源软件使用需要申请并分析安全漏洞,版本升级需要重新申请,那么发布的时候如何知道我所使用的就是申请的那些呢?1.解决办法首先使用命令将依赖打印到文件中mvn dependency:tree > /tmp/tree.txt例如一个这样的依赖树[INFO] Scan

2020-10-31 23:28:27 764

原创 【日志框架】MDC实现日志中增加自定义参数

1、MDCMDC(Mapped Diagnostic Contexts)映射调试上下文,主要用在做日志链路跟踪时,动态配置用户自定义的一些信息,比如requestId、sessionId等等。MDC使用的容器支持多线程操作,满足线程安全。2、log4j2实现代码中调用MDC.putpublic class Log4j2Test { private static final Logger log = LoggerFactory.getLogger(Log4j2Test.class);

2020-10-26 21:29:58 2053

原创 【spring-kafka】使用SPEL表达式为消费者配置topic

1、KafkaListenerspring-kafka确实很方便,在方法上加@KafkaListener便实现对kafka数据的接收。从KafkaListener这个注解的各个参数注释上我们可以看出,各个参数不仅可以配置直接的值,也可以配置SPEL表达式,还是比较灵活的。2、topic配置的几种方式(1)直接设置为字符常量,不再赘述(2)application.properties中配置topictopics配置为#{’${target.topic}’.split(’,’)}(3) 通过调

2020-10-21 20:23:31 1724

原创 【log4j2日志框架】maven-shade-plugin方式打包后不打印日志

0、背景当我将log4j2相关的jar包用maven-shade-plugin方式达到另一个jar中,方便集成的时候发现,报出了无法识别log4j2各个插件的错误:参考https://www.cnblogs.com/cekaigongchengshi/articles/12789854.html 方案一,排除掉Log4j2Plugins.dat找不到自定义的滚动策略CustomRolloverStrategy,将CustomRolloverStrategy修改为默认的DefaultRolloverSt

2020-10-21 20:01:07 1706

原创 【log4j2日志框架】敏感字符过滤

0、背景zookeeper服务端所使用的日志框架被我替换为了log4j2,zk的sessionid又被负责安全的大佬评估为敏感信息,不能直接打印,所以要想一个在不修改源码的情况快速解决sessionid打印屏蔽的办法。1、log4j2的replace功能很多日志框架都有过滤替换的功能,log4j2也不例外,支持正则替换。先看zk的sessionid生成方法sessionid高位为服务id,中间为时间戳,低位为递增序列,最大值为Long的最大值。log4j2.properties的pattern

2020-10-21 19:14:24 2662 1

原创 【log4j2日志框架】修改转储日志文件权限

0.背景对于安全要求严格的系统,对于转储的压缩日志文件,要求文件权限为只读,而找遍了log4j2的资料,都没发现有这样操作,log4j2框架对于日志的默认权限都是640。不过log4j2是支持自定义日志1....

2020-10-21 18:54:45 3357

原创 将log4j的项目升级到log4j2

0.背景虽然大部分的java项目使用的都是logback,但是仍然有很多开源项目使用log4j,例如kafka、zookeeper。但是log4j已经于2012年停止更新,并且log4j扫出如下安全漏洞:https://rnd-vulncenter.huawei.com/vuln/toViewOfficialDetail?cveId=CVE-2020-9488https://rnd-vulncenter.huawei.com/vuln/toViewOfficialDetail?cveId=CVE-20

2020-10-15 19:35:25 6664 3

原创 logback日志框架学习与问题

1、简介http://logback.qos.ch/,中文网站http://www.logback.cn/logback由log4j的创始人 Ceki Gülcü设计,作为log4j框架的继任者,logback确实应用非常广泛。但是从官网的更新记录看,貌似2019年后更新速度明显缓慢了,不知道是不是要步log4j的后尘。Logback由logback core、logback classic和logback access三个模块组成。logback core为其他两个模块奠定了基础,logback c

2020-09-30 18:03:54 469

原创 使用IP连接的kafka为什么依然需要hostname

0.背景kafka的服务端和客户端之间使用IP连接,服务端也未配置任何域名,但是却出现了一个奇怪的问题。kafka客户端达到一定数量的时候,大量的连接在超时,服务端出现了许多CLOSE_WAIT状态的连接,抓包发现服务端有时候关闭完一个连接需要花费几分钟的时间,超出了客户端设置的超时时间,客户端在不断重连,服务端的CLOSE_WAIT越来越多。表现出来的问题表象就是客户端连接超时,连kafka集群内部通信也超时,ISR集合在不断的刷新,kafka无法正常对外提供服务。最终解决办法是在服务端的/etc/ho

2020-09-05 02:22:43 6507 2

原创 用byte数组传参的注意事项

先看一个dmeopublic static void main(String[] args) { String s1 = "hello world"; byte[] b = s1.getBytes(Charset.defaultCharset()); printByte(b); String s2 = new String(b, Charset.defaultCharset()); System.out.println(s2)

2020-06-23 00:23:41 3486

原创 数据脱敏工具advance-tool-datamask

1 简介对于什么是数据脱敏,以下解释来自百度百科数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。在大数据环境下隐私保护的需求越来越频繁的被提及,对于一些敏感的信息,市面上很多应用都有一...

2020-04-15 23:44:59 5066

原创 使用Redis事务的注意事项

1、使用Jedis实现事务 @Test public void testJedis(){ Jedis jedis = jedisPool.getResource(); jedis.watch("key1"); //开启事务 Transaction transaction = jedis.multi(); ...

2020-04-03 01:05:09 394

原创 springboot2.x连接zookeeper

1、引入相关依赖 <properties> <java.version>1.8</java.version> <lombok.version>1.18.12</lombok.version> <zookeeper.version>3.6.0</zookeeper.v...

2020-03-31 02:03:50 919

原创 mac上安装zookeeper

1、下载2、解压配置环境变量(1)解压tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz为了方便将文件夹名称修改为zookeepermv apache-zookeeper-3.6.0-bin zookeeper(2)配置zookeeper的环境变量vim ~/.bash_profile配置ZOOKEEPER_PATH和PATHZOOKEE...

2020-03-31 00:00:10 293

原创 分析java8的LocalDateTime类及使用的注意事项

jdk8中新增的java.time包真的是不要太棒,jdk8以前的date存在着线程不安全、api难用等问题。来看看新的date有些什么特点:1、使用不可变对象保证线程安全LocalDateTime中有两个final修饰的成员,date表示日期(年月日部分),time表示时间(时分秒部分)。 /** * The date part. */ private fina...

2020-03-30 21:20:34 1208

原创 分布式事务学习(一)初步了解

1、简介1.1、背景我们所做的项目中经常涉及到服务A调服务B、服务B调服务C这种情况,当整个调用链路中某一个服务发生异常时,需要将所涉及所有服务做的修改都回滚掉才能保证整体事务的一致性。Spring所提供的声明式事务@Transcational只能保证服务在操作自身数据库时的事务一致性,而无法保证其他服务的事务与自身保持一致。1.2、我们真的需要分布式事务吗?引入任何一个技术之前我觉得都应...

2020-03-29 23:02:30 212

原创 使用排队论实现服务节点的动态扩展

1、背景通常我们的服务器面对高并发时会采取一些限流、熔断、降级的手段,条件允许的时候采取水平扩展提升系统的吞吐量。最近脑子一热在想若是不考虑水平扩展的成本,我们是不是可以设计一款支持动态扩展的系统,当并发量大达到限流上限时自动增加服务节点,当并发量很小时自动销毁空闲节点。其实想一想我们的服务模型,与如下的排队模型很相似。其实排队论就是为解决这类问题的,原理见参考2、实现服务指标的计算动...

2020-03-28 23:55:24 1604

原创 TreeMap底层原理学习(JDK1.8)

1、TreeMap构造 public TreeMap() { comparator = null; } public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; } public TreeMap(Map<...

2020-03-25 21:51:55 454

原创 LinkedHashMap底层源码分析(JDK1.8)

1、LinkedHashMapLinkedHashMap直接继承自HashMap,底层仍然是数组+链表+红黑树的结构,重写了HashMap的get、remove、foreach等方法。LinkedHashMap.Entry继承自HashMap.Node,增加了属性before和after,增加了一些双链表相关的操作。从下图中可以看出HashMap.Node、LinkedHashMap.Ent...

2020-03-25 20:34:15 175

原创 Java消息中间件相关面试题

1、topic和queue的区别2、如何保证消息的可达性和唯一消费3、为什么要使用消息中间件?一般说法:解耦与复用异步削峰参考

2020-03-23 18:23:05 563

原创 SpringBoot2.x中加载除application.properties资源文件方式

1、@PropertySource注解方式自定义资源文件custom.properties@Configuration@PropertySource(value = "custom.properties")public class EnvironmentTest implements CommandLineRunner{ @Value("${test.param1:}") ...

2020-03-23 00:03:40 277

原创 mybatis-plus-generate中VelocityEngine初始化失败问题

mybatis-plus-generate包中提供了逆向数据库的功能,其中用到了velocity模板引擎技术。但是发现直接main函数中运行逆向代码完全没问题,一旦我想打成jar发布运行就抛出如下异常。[Thread-5] ERROR org.apache.velocity - The specified class for ResourceManager (org.apache.velocit...

2020-03-22 20:34:42 2201

原创 ConcurrentHashMap底层原理学习(JDK1.8)

其实ConcurrentHashMap与HashMap非常相似,只是将一些操作变成个了线程安全的。下面看putval方法 final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); ...

2020-03-20 20:11:11 300 2

原创 Springboot2.x全局异常处理+参数校验+多语言

1、背景通常web项目是需要三者同时协调其作用的,例如业务抛出一个账号不能为空的异常,由全局异常处理捕获后返回多语言。2、多语言配置配置messageSource,指定多语言文件的路径@Configuration@ConfigurationProperties(prefix = "spring.i18n")public class I18nConfig { private S...

2020-03-20 19:38:44 2197

原创 ThreadLocal跨线程问题

1、问题通常复杂的处理流程中,我们会使用一些异步处理的手段,那么这种场景下ThreadLocal即可能出现获取失败的问题。public class ThreadLocalTest { public static void main(String[] args) { ThreadLocal<String> threadLocal = new ThreadLo...

2020-03-20 16:51:47 1361

原创 Springboot2.x中的hibernate-validator(2)POST请求

1、ConstraintViolationException与MethodArgumentNotValidException一般情况下我们会发现对GET请求的入参做参数校验时抛出ConstraintViolationException异常,而对POST请求的RequestBody做参数校验时会抛出MethodArgumentNotValidException异常。这与Spring中绑定GET参数...

2020-03-19 00:21:06 517

原创 Springboot2.x中的hibernate-validator(1)GET请求

1、自动配置springboot中早已默认集成hibernate-validator,首先看下自动配置是如何配置validator的。ValidationAutoConfiguration@Configuration( proxyBeanMethods = false)@ConditionalOnClass({ExecutableValidator.class})@Condit...

2020-03-18 22:00:26 833

原创 Java非关系型数据库Redis相关面试题

1、Redis常见数据结构String字符串、Hash、List、Set、Zset2、zset的底层实现ziplist/skiplist参考3、持久化方案RDB:默认,周期性的保存快照方式AOF:对每条写入命令作为日志记录,以append-only模式写入日志文件。参考4、rehashrehash是指对hash表进行扩容或收缩。为了让哈希表的负载因子(load factor...

2020-03-18 16:41:53 242

原创 ThreadLocal使用场景与原理分析

1、ThreadLocal变量线程局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问。当使用ThreadLocal维护变量的时候,为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。2、使用场景每个线...

2020-03-18 15:42:09 5067

原创 Java关系型数据库相关面试题

1、手撕sql有学生表、课程表、成绩表,计算平均成绩大于等于60的学生id、学生姓名和平均成绩。select s.s_id,s.s_name,avg(sc.score)from score scleft join student s on sc.s_id=s.s_idgroup by s.s_id having avg(sc.score>=60)可能引发问题(1)几种join...

2020-03-16 21:37:10 460

原创 Java并发相关面试题

1、ConcurrentHashMap原理,如何保证线程安全参考使用CAS和synchronized保证线程安全2、红黑树原理参考3、synchronized(1)synchronized是可重入锁。可重入锁顾名思义表示可重新反复进入的锁,但仅限于当前线程。是为了解决自己锁死自己的情况。一个类中的同步方法调用另一个同步方法,假如 Synchronized 不支持重入,进入 meth...

2020-03-15 23:45:40 129

原创 HashMap底层原理学习(JDK1.8)

1、简介hashMap所继承或者实现的接口HashMap中有个Node的内部类,这其实就是一个单链表的结构和TreeNode,传说中的红黑树其他成员:transient Node<K,V>[] table; 存储hash节点的数组transient Set<Map.Entry<K,V>> entrySet; 将数组转为Set结构,方便keySe...

2020-03-15 00:30:14 181

原创 ArrayList底层原理学习

一直以来,ArrayList都是一个熟悉的陌生人一样的存在,用都会用,也知道底层是数组,再深入问细节就懵逼。1.构造方法public ArrayList()public ArrayList(int initialCapacity)public ArrayList(Collection<? extends E> c)jdk1.8中ArrayList的无参构造创建的是一个空数组,...

2020-03-14 19:20:32 160

原创 Arrays.asList创建的ArrayList并非java.util.ArrayList

项目中有遇到过对Arrays.asList生成的ArrayList进行add操作时报出UnsupportedOperationException异常。这是因为此ArrayList并非彼ArrayList。这里生成的ArrayList是Arrays的私有静态内部类。与java.util.ArrayList非常类似,都继承自AbstractList。但是仅重写了toArray、get、set、...

2020-03-14 16:21:59 224

空空如也

空空如也

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

TA关注的人

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