- 博客(78)
- 资源 (2)
- 收藏
- 关注
转载 项目敏感词脱敏如何实现
因为我的项目是基于 Spring Boot 开发的,因此可以利用 Spring Boot 自带的 Jackson 自定义序列化实现,在 JSON 进行序列化渲染给前端时,进行脱敏。脱敏工具类支持用户 ID、中文姓名、身份证号、座机号、手机号、电子邮件、银行卡号等脱敏数据类型,基本覆盖了常见的敏感信息。如果使用的序列化是 Fastjson 而不是默认的 Jackson,你可以创建一个自定义的。这里以最常用的替换为例进行介绍,这也是我的项目用到的方法。脱敏工具类的脱敏规则是隐藏掉信息中的一部分关键信息用。
2024-08-13 10:33:02 73
原创 Springboot整合ShardingJdbc实现分库分表方案
shardingsphere-jdbc-core-spring-boot-starter 5.2.1中使用snakeyaml版本1.33 spring-boot-starter-web使用snakeyaml版本2.2 2.2中删除了Representer和SafeRepresenter的无参构造器,因此导致了该异常。关于搭建过程中遇到的问题(shardingsphere-jdbc-core-spring-boot-starter 5.2.1)2、在每个数据库各创建三个分表。3、创建mapper。
2024-07-15 10:22:37 464 1
转载 Redis只能做缓存?太out了!
大多数业务系统,跑在redis上,这是很多一直使用MySQL做业务系统的同学所不能想象的。看完了上面的介绍,相信你能够对redis能够实现的存储功能有个大体的了解。打开你的社交app、游戏app、视频app,看一下它们的功能,能够涵盖多少呢?我这里要强调的是,某些数据,并不是一定要落地到RDBMS才算安全,它们并不是一个强需求。那既然redis这么厉害,为什么还要有mysql、tidb这样的存储呢?关键还在于业务属性上。
2024-04-07 10:14:59 56
原创 关于log4j的那些坑
另发现,工程日志路径打印异常问题,表现为打印日志路径及文件名称异常,后详细排查了target目录,发现是由于配置文件中占位符未替换导致的,由于工程基于profile,因此我们通过修改pom文件中对应profile的build情况便可解决。至此,我们便弄明白当工程必须存在两个log4j配置文件时,文件的加载情况如何。背景:工程中同时存在log4j.xml&log4j2.xml。(为何这么加载,暂且留个疑问,等下回再去剖析,感觉略深)此时工程实际使用的日志文件为log4j.xml。经验证,问题至此已全部解决。
2023-12-29 01:14:49 787
原创 SpringBoot Admin升级boot等组件版本后无法监控微服务
spring-cloud-consul在v3.0.0(不包含M1等版本)及之上,meta数据获取不再兼容tags,因此使用该版本的cloud在于admin集成时,若监控服务存在context-path或者自定义的健康检查路径等,由于admin定义meata属性key均包含"."字符,因此大概率均会出现监控异常问题(推测结论,未完整验证所有版本)。到此,该问题排查基本结束,定义为spring-boot-admin与spring-cloud-consul版本兼容性问题。.....................
2022-07-29 10:04:11 1586 1
原创 RocketMq closeChannel: close the connection to remote address[] 排查记录
由于对netty了解并不太深刻,且name-server服务正常,目前没有分析出是何种情况触发了channel的close事件,后续将在进一步完善netty及rocketmqnetty等相关知识后再做进一步的分析。关于版本问题,由于服务client使用4.7.1版本,nameserver使用4.5.0版本,尝试降低本地版本,日志问题依然存在。由于该日志不影响服务及业务,暂时我们可以通过屏蔽该日志去解决,您可在您的log4j.xml中新增如下配置。close()方法,因此会触发上述日志的打印。...
2022-07-25 17:06:34 13746 5
转载 Consul API接口详解
consul的主要接口是RESTful HTTP API,该API可以用来增删查改nodes、services、checks、configguration。所有的endpoints主要分为以下类别: kv - Key/Value存储 agent - Agent控制 catalog - 管理nodes和services health - 管理健康监测 session - Session操作 acl - ACL创建和管理 event
2022-05-12 16:27:41 3249
转载 一次线上MySQL分页事故,搞了半夜...
目录 背景 分析 数据模拟 测试 解决方案 小结 今天给大家分享个生产事故,一个由于 MySQL 分页导致的线上事故,事情是这样的~背景一天晚上 10 点半,下班后愉快的坐在在回家的地铁上,心里想着周末的生活怎么安排。突然电话响了起来,一看是我们的一个运维同学,顿时紧张了起来,本周的版本已经发布过了,这时候打电话一般来说是线上出问题了。果然,沟通的情况是线上的一个查询数据的接口被疯狂的失去理智般的调用,这个操作直
2022-04-28 09:43:05 122
原创 关于MYSQL group by语句查询优化
1、如果对 group by 语句的结果没有排序要求,要在语句后面加 order by null;2、尽量让 group by 过程用上表的索引,确认方法是 explain 结果里没有 Using temporary 和 Using filesort;3、如果 group by 需要统计的数据量不大,尽量只使用内存临时表;也可以通过适当调大 tmp_table_size 参数,来避免用到磁盘临时表;4、如果数据量实在太大,使用 SQL_BIG_RESULT 这个提示,来告诉优化器直接使用排序算法
2021-12-08 19:25:37 661
转载 别再用 kill -9 了,这才是微服务上下线的正确姿势!
对于微服务来说,服务的优雅上下线是必要的。就上线来说,如果组件或者容器没有启动成功,就不应该对外暴露服务,对于下线来说,如果机器已经停机了,就应该保证服务已下线,如此可避免上游流量进入不健康的机器。优雅下线基础下线(Spring/SpringBoot/内置容器)首先JVM本身是支持通过shutdownHook的方式优雅停机的。Runtime.getRuntime().addShutdownHook(newThread(){@Overridepublicvoid...
2021-07-30 14:22:10 150
转载 慢SQL治理分享
一 为什么要做这个事情1 什么是慢SQL?这里指的是MySQL慢查询,具体指运行时间超过long_query_time值的SQL。我们常听常见的MySQL中有二进制日志binlog、中继日志relaylog、重做回滚日志redolog、undolog等。针对慢查询,还有一种慢查询日志slowlog,用来记录在MySQL中响应时间超过阀值的语句。大家不要被慢查询这个名字误导,以为慢查询日志只会记录select语句,其实也会记录执行时间超过了long_query_time设定..
2021-07-30 13:44:20 129
转载 消息幂等(去重)通用解决方案,真顶!
消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢失,即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件最基本的特性之一,也就是我们常说的“AT LEAST ONCE”,即消息至少会被“成功消费一遍”。举个例子,一个消息M发送到了消息中间件,消息投递到了消费程序A,A接受到了消息,然后进行消费,但在消费到一半的时候程序重启了,这时候这个消息并没有标记
2021-07-22 10:17:00 258
转载 阿里终面:为什么 SSD 不能当做内存用?
在回答这个问题之前我们先去某东上逛一圈。输入“SSD”随便找到销量比较高的一项,在商品详情页上有这样的描述:注意图片上显示的规格,读速高达 3.5GB/s,真实情况下稍差点(尤其是随机读写),但也不会很离谱,可以看到,这个速度是非常快的,基本秒传高清电影的水平。那么问题来了,既然现在的 SSD 读取速度这么快,那么可以把 SSD 当做内存来用吗?要想回答这个问题,我们先来看看内存的速度。速度差异当前采用第四代 DDR 技术的内存,其带宽基本上能到 20GB - 30GB
2021-07-16 09:17:45 859
转载 Gateway网关使用不规范,同事加班泪两行~
Spring cloud gateway是替代zuul的网关产品,基于Spring 5、Spring boot 2.0以上、Reactor, 提供任意的路由匹配和断言、过滤功能。笔者公司之前有系统也使用了Spring cloud gateway做为后台应用访问的网关,采用的版本信息为:组件 版本 其他 spring boot 2.1.7.RELEASE spring cloud Greenwich.SR2 spring cloud gateway
2021-07-14 14:05:42 376
原创 Java工程定时执行Full GC(每隔1h)
运维侧反馈阿里云ARMS监控显示服务频繁执行Full GC,且执行曲线很规律。查询gc.log日志文件显示Full GC有规律的每1h执行一次,且通过System.gc()显示触发。通过开发环境验证此问题。1、安装arthas查询是谁调用了System.gchttps://github.com/alibaba/arthas/issues/20可以看到该方法是由sun.misc.GC创建GC Daemon线程调用。执行jstack pid 也可以佐证。(关于这块目前仍然不是很清
2021-07-07 18:12:12 1844
转载 有没有字节工牌,Java并发安全的根本原因都得懂
引言并发问题一直是Java领域的高阶问题,要想掌握它不仅需要了解JVM的内存模型,更需要对计算机底层硬件有深入的理解。本文主要探讨下Java并发安全问题的根源所在,通过对根源问题对探究,加深对于Java并发安全的理解。并发安全问题分析我们都知道程序猿编写的代码都是跑在具体的硬件架构上面的,只是目前的高级语言系统屏蔽了很多底层硬件细节。但是如果想要对于并发问题有深入的理解,还是需要对底层计算机硬件系统的细节有更多的了解。因此要想分析并发安全问题的根本原因,我们需要从问题现象出发,刨根问..
2021-06-23 10:06:05 88
转载 一次 Nacos 的踩坑记录!
转载自微信公众号《程序猿DD》问题发现就在这周,我接到 MSE Nacos 用户的反馈,说线上 Nacos 不可用,服务都下线了,日志里面也是一堆报错,我下意识以为线上炸了,赶紧上线排查。本文主要记录这次问题的排查过程,以及解决方案。首先看用户反馈的报错,日志如下:并且用户反馈业务日志也出现了大量的服务地址找不到的报错,说明 Nacos 服务都下线了。我立刻查看了服务端的监控,发现用户的 MSE Nacos 集群并无异常,cpu/内存等指标有下降,并没有异常行为,排除了服务端异常的可
2021-06-23 09:55:17 873
转载 记一次因 Redis 使用不当导致应用卡死 bug 的排查及解决!
文章转载自微信公众号《程序猿DD》首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多的同事开始抱怨,于是感觉代码可能有问题,开始排查。首先发现开发的本地ide没有发现问题,应用卡死时候数据库,redis都正常,并且无特殊错误日志。开始怀疑是sandbox环境机器问题(测试环境本身就很脆!_!)于是ssh上了服务器 执行以下命令top.
2021-06-23 09:49:52 233
原创 Gateway 解析 route
Gatewy入口对象 DispatcherHandlerAbstractHandlerMapping 的 getHandlerRoutePredicateHandlerMapping 的 getHandlerInternalRoutePredicateHandlerMapping 的 lookupRoute该方法即为route 寻址方法
2021-06-21 10:10:49 447
原创 基于mysql的分库分表&读写分离实现
最近心血来潮,浏览各大网站之后总结精华,写了两套基于mysql的分库分表&读写分离的演示项目。(由于以下项目都是参照前人的经验,且逻辑实现复杂,具体分析就不写了,且看代码便好,如有兴趣和问题,可留言)项目一:基于AOP通过程序实现的读写分离项目项目地址:添加链接描述项目二:基于sharding-jdbc实现的分库分表&读写分离项目项目地址:添加链接描述...
2021-05-27 16:50:38 126
转载 Java 分布式主键生成方案 雪花算法(snowflake)
转载自:https://www.tqwba.com/x_d/jishu/237497.html如果在面试中被问及分布式唯一标识,却没有答道雪花算法,那么就有点说不过去了.关于分布式唯一标识中的雪花算法,网络上的介绍很多,它只是一个算法,可以用Python,Java等不同的语言实现它.即便是同一个语言,它的实现也有不同.美团(Leaf)百度(uid-generator)这两个也是业界比较知名的实现雪花算法的工具.然而还有一个工具类,它就是hutool工具中的雪花算法<dependenc
2021-05-24 19:40:02 709
转载 Sharding-Jdbc 分布式主键(雪花算法)
实现动机传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如Mysql的自增键,Oracle的自增序列等。数据分片后,不同数据节点生成全局唯一主键是非常棘手的问题。同一逻辑表内的不同实际表之间的自增键由于无法互相感知而生成重复主键。虽然可以通过约束主键自增长初始值和步长的方式来避免碰撞,但需引入额外的运维规则,使解决方案缺乏完整性和可扩展性。目前有许多第三方解决方案可以完美解决这个问题,如UUID等依靠特定算法自生成不重复键,或者通过引入主键生成服务等。但也正
2021-05-24 18:59:38 2293
转载 (转载)一个线程OOM,一个进程里其他线程还能正常运行吗
引言这题出自今年校招美团三面的一个真题。大致如下一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?先说一下答案,答案是还能运行不瞒大家说,真在面试中,我遇到这一题,我估计也是答错。因为我初看到这一题,内心嘿嘿一笑,觉得这题是在考察JVM的内存结构。我第一反应是OOM的常见情况堆溢出,也就是下面的这种异常java.lang.OutOfMemoryError: Java heap space先回忆一下,多线程中栈与堆是公有的还是私有的?回答如下java在多线程环境下,每个线
2021-05-07 13:50:22 355
原创 volatile关键字
简介volatile关键字保证了在多线程环境下,被修饰的变量在修改后会马上同步到主存,这样该线程对这个变量的修改就是对所有其他线程可见的,其他线程能够马上读到这个修改后的值。说明使用volatile之后,做了如下事情:1、每次修改volatile变量会立即同步到主存;2、每次读取volatile变量的值都强制从主存读取最新的值(强制JVM不可优化volatile变量,如JVM优化后变量读取会使用CPU缓存,而不从主存中读取);3、线程A写入volatile变量之前可见的变量,在线程B中读取该vo
2021-05-06 13:46:53 94
原创 Java虚拟机即时编译
从Java8开始,Java虚拟机默认采用分层编译方式。它将执行分为5个层次,分别为0层解释执行,1层执行没有profiling的C1代码,2层执行部分profiling的C1代码,3层执行全部profiling的C1代码和4层执行C2代码。通常情况下,方法会首先被解释执行,然后被3层的C1编译,最后被4层的C2编译。即时编译是有方法调用计数器和循环回边计数器触发的。在使用分层编译的情况下,触发编译的阈值是根据当前待编译的方法数目动态调整的。OSR是一种能够在非方法入口处进行解释执行和编译后代码之间切换
2021-05-06 11:44:10 131
原创 Linux根据日志关键字分组统计出现次数
shell命令:grep -rn "XXX" | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" |sort |awk '{S[$1]++} END{for(a in S) {print a,S[a]}}'说明:(其中XXX是关键字)1、获取日志信息grep -rn "XXX"2、匹配IP地址信息-oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"3、分组统计|so
2021-04-29 11:44:48 2036
原创 Sentinel规则校验(基于Gateway网关)
请求到达gateway网关后,sentinel校验基于SentinelGatewayFilter实现。Sentinel验证流程中params的获取尤为重要。文章简单记录了sentinel限流校验中重要的几个方法,具体不展开讲解了,如需帮助,请私聊。...
2021-04-20 11:14:57 376
原创 Sentinel Dashboard限流规则保存
sentinel在限流规则配置方面提供了可视化页面 sentinel dashboard,源码可从github下载,请自行搜索,此处不提供下载链接。规则持久化后首先触发GatewayFlowRuleController(源码似乎没有,请参考普通规则改造)的/new.json(或)请求,方法会调用publishRules()将本次编辑规则组装后通过远程调用请求gateway/updateRules更新远程服务内存中限流规则,该接口由远程服务UpdateGatewayRuleCommandHandler提供。
2021-04-20 10:32:51 444 1
原创 Sentinel匹配的Client IP策略(基于Gateway网关)
Sentinel匹配的Client IP策略GatewayParamParser对象中parseClientIp()private String parseClientIp(GatewayParamFlowItem item, T request) { String clientIp = this.requestItemParser.getRemoteAddress(request); String pattern = item.getPattern();
2021-04-20 09:32:55 4223
原创 解决命令行参数-D无法覆盖远程配置中心(nacos)问题
背景:今天运维在搭建k8s环境时反馈无法通过-D命令行参数修改参数配置,经排查,发现该配置位于nacos配置中心中。经验证,凡nacos配置中心配置参数均无法通过-D命令行改写。排查过程:认知中springboot项目优先级-D命令行参数是最高的,但此次验证相当打脸。网上查阅相关文档文档一并调试本地源码发现所有配置均存储在MutablePropertySources的propertySourceList中,配置优先级与对象在list中索引息息相关。经查,EnableConfigurationProp
2021-03-18 14:29:07 2780 1
翻译 Redis 缓存穿透问题及解决方案
缓存穿透问题缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。一般对于未命中的数据我们是按照如下方式进行处理的:1.缓存层不命中。2.存储层不命中,不将空结果写回缓存。3.返回空结果。/** * 缓存穿透问题 * 在数据库中未查询到数据,未存入缓存,则下次查询同样的数据时,还会查库 * @param id * @return */ public Object get
2021-02-24 11:35:34 150
翻译 Object o = new Object()占用多少个字节
对象的内存布局在java中对象的内存布局分为两种情况,非数组对象和数组对象。数组对象和非数组对象的区别就是需要额外的空间来存储数组长度length。对象头对象头又分为Mark Down和Class Pointer两部分。Mark Down:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位,gc记录信息等等,在32位系统占4字节,在64位系统占8字节。Class Pointer:用来指向对象对应的class对象(其对应的元数据对象)的内存地址。在32位系统占4字节,在64位系统占8字节。.
2021-02-24 10:59:27 620
转载 Druid The last packet successfully received from the server was xxx milliseconds ago
产生的原因:应用方的数据库连接有效期时间,大于数据库自己设置的有效期。解决方案:一、修改druid配置(如果使用druid的话)spring.datasource.druid.validationQuery=select 1spring.datasource.druid.testWhileIdle=truespring.datasource.druid.testOnBorrow=truespring.datasource.druid.testOnReturn=truePS.此方案对性能会有一定
2021-01-25 11:01:46 6081
原创 微服务篇之Sentinel限流熔断(二)— URL资源清洗
Sentinel中HTTP服务的限流默认由Sentinel-Web-Servlet包中的CommonFilter来实现,从代码中可以看到,这个Filter会把每个不同的URL都作为不同的资源来处理。在下面这段代码中,提供了一个携带{id}参数的REST风格API,对于每一个不同的{id},URL也都不一样,所以在默认情况下Sentinel会把所有的URL当做资源来进行流控。package com.yuntai.gateway.config;import org.springframework.web
2021-01-16 22:59:56 1179 2
原创 微服务篇之Sentinel限流熔断(一)— Spring MVC 自定义URL限流异常
在默认情况下,URL触发限流后会直接返回。Blocked by Sentinel(flow limiting)在实际应用中,大都采用JSON格式的数据,所以如果希望修改触发限流之后的返回结果形式,则可以通过自定义限流异常来处理,实现UrlBlockHandler并且重写blocked方法:package xxx;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;import
2021-01-16 22:43:59 806
zookeeper-3.3.6
2017-12-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人