自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

bruce128的专栏

更多的时候是在排查解决问题

  • 博客(261)
  • 资源 (1)
  • 收藏
  • 关注

原创 高性能Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都是用的reactor反应堆模型。前置知识。

2024-02-23 15:24:32 1275

原创 初级程序员常见问题

到今年已经工作十一个年头了,把这些年自己出现在自己身上或者同事身上的问题记录下来。

2023-10-26 17:24:01 207

原创 InnoDB底层存储结构探秘

B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树1)有n棵子树的节点中含有n个关键字(即每个关键字对应一棵子树);2)所有叶子节点中包含了全部关键字的信息, 及指向含这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大顺序链接;3)所有的非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字4)除根节点外,其他所有节点中所含关键字的个数必须>=⌈m/2⌉(注意:B-树是除根以外的所有非终端节点至少有⌈m/2⌉棵子树)上图是所示为一棵3阶的。

2022-11-27 17:00:17 880

原创 业务架构浅谈

一、序章  一般的工程师接触到的是 应用架构 ,传统的MVC分层架构、事件驱动架构等等。第一次接触业务架构这个概念是在来到商品发布团队之后。商品发布是一个业务属性很重的系统,承载了淘宝、天猫、盒马、魅力惠、汽车、虚拟、SCM自营、苹果、村淘、公益、教育等诸多业务(业务多的围起来可以绕地球一圈)的商品发布功能。头半年对“业务架构”还是很懵逼的,随着慢慢的熟悉业务,研究框架代码,才对我们的业务架构.........

2022-07-13 16:44:47 5092 6

原创 redis rdb持久化源码分析

毕业7年后一直是Java选手,第一次这么认真的看C的源码。一、 redis的持久化方式redis是支持持久化的内存数据库(memcached不支持持久化)。其持久化的方式有两种,aof和rdb。rdb是一种快照式(snapshot)的持久化,直接把redis的内存整体写入磁盘文件。触发rdb持久化有两种方式,直接客户端调用bgsave命令或者固定时间内的写命令达到配置文件里的配置触发rdb持久...

2020-02-24 07:14:50 718 2

原创 应用部署技术发展简史

互联网企业生产环境的应用部署,大致分三个阶段。单物理机部署多个应用,虚拟机部署,容器化部署。一、物理机部署时代这是所有早期物联网公司必然经历的一个阶段。一台服务器,至少32核CPU、64G内存,如果只部署一个应用,那就太浪费了。于是,多个应用进程,DB,缓存进程等等都部署在同一个机器上。这种部署方式有一个最大的痛点:进程间资源抢占。如果一个进程耗用了100%的CPU资源,其他的进程无法...

2018-07-13 01:19:09 2901 3

原创 JDK1.8 JVM运行时数据区域划分

一、JDK1.8 JVM内存模型概览这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。二、各区域介绍1. 程序计数器每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执...

2018-02-26 20:53:55 56476 47

原创 剖析金额不能用浮点数表示的原因

近期支援双十一红包项目。参与到了一个涉及到钱的项目,开发自然十分的谨慎。先抛出我有问题的代码,作用是把以分为单位的金额转成以元为单位的字符串。long adjustFee;String.valueOf(adjustFee / 100.0);  很自信的以为这行代码简洁明了的完成了使命。@壹双 同学review了我的代码后,指出这段代码会造成精度丢失的问题。先演示一个demo,构造一个浮点数丢失精度

2016-09-13 21:28:52 8785 9

原创 字符串的公共前缀对Mysql B+树查询影响回溯分析

年前项目组接微信公众号。上线之后,跟微信相关的用cid列的查询会话的SQL变慢了几十倍!思考这个问题思考了很久,从出现以来一直是我心头的一个结。cid这一列是建了索引的,普通的cid列更新都没问题,为何只有微信的有问题?相同的前缀又是如何影响索引的? 分析过程 1.explain下微信cid的查询,微信的cid会以mid-qqwanggou001为前缀插入数据...

2016-03-15 09:39:30 5441 10

原创 用ForkJoin框架为归并排序提速

写完之后,想到这个程序仅仅利用到了一个cpu核心,如果数据量很大的情况下,会造成计算资源的浪费。这个需要计算多个子任务的分治算法,明显可以用Fork/Join框架提速。当数据量小于1024个的时候不再进行切割,否则任务太多,提速效果十分差。当小于1024个的时候,偷懒用了工具库的快排。我的电脑是i7 4核心8线程,跑了10000, 100000, 1000000, 10000000, 100000000个数据对别单线程和多线程版本,运行结果。当数据量较大时,提速明显。归并排序典型的分治思想的算法。

2024-05-14 16:57:58 247

原创 camel丢失请求body问题排查

项目组要和被收购的公司做接口对接,使用camel进行集成。在使用的过程当中,我们几个小伙伴都遇到了一个相同的问题:请求request body的内容失踪了。

2023-12-18 19:25:15 1036

原创 MyPerf4J3.4+Influxdb2.7+grafana10.0接入方法监控

MyPerf4J的官方接入文档:https://github.com/LinShunKang/MyPerf4J。metrics.exporter配置成,注意后面别带冒号,我把后面的冒号复制过来后,排查了很久influxdb.database务必配置成,否则grafana要改动的地方很多debug = true,方便排查问题二 应用程序配置应用启动参数添加两项配置启动应用程序, 通过respStatus判断跟influxDB交互是否成功InfluxDB下载最新版本后启动influxdb,登

2023-10-20 10:42:19 531 1

原创 mac版postman升级后数据恢复办法

找到升级之前的的最新的backup.json,然后在postman里import这个文件。所有升级前的collections都恢复了,但是environment恢复失败。postman升级了一下,所有的collections都丢失了。在finder里找到这个路径。

2023-10-11 09:37:38 3042

原创 mysql join语句优化实战

生产环境的大表join语句性能经常很差。这里给出大表join语句的优化思路。

2023-09-28 10:45:09 215

原创 系统高可用建设

以前面试遇到的一个开放问题,当时回答的很片面。把工作十一年的经验进行汇总,系统性的梳理了一下。从事故发生前,事故发生时,事故发生后的角度进行梳理。高可用,就意味着事故恢复的时间要足够的短。

2023-09-27 13:55:26 96

原创 技术leader踩坑笔记:引入变化

人的习惯都是有惰性的,大家都喜欢用自己习惯的行为模式做事,如果要改变,就得重新适应环境。大到企业战略转型,小到仅仅是改变一个会议的方式,只要是引入变化,就会触发情绪反应,人们总是需要一个接受的过程。以为是好心,以为是办好事,以为自己责任心十分到位,以为是但是实践的过程,并不丝滑。新晋技术管理者要跳出资深开发的视野做事情,多站在项目的四类不同干系人的视角看问题,抓住他们的痛点,在大部分人接受的情况下达成共识。为了解决现状,引入一个新举措,作为新的技术leader,我的出发点没有问题。毕竟是基本的人性嘛。

2023-09-26 11:08:42 144

原创 JetBrains Annotations:将NPE杀死在编译期

搞过java开发的一定遇到过NullPointerException。这是个让人很头疼的问题。JetBrains 开发了一个注解库,通过在 IDE 里面提示开发者处理那些可能为 null 的值来解决这个问题,这个注解库就是JetBrains Annotations。代码写完时,test(name)这一行即飘红。编译并运行call方法,无法编译通过。

2023-09-20 18:02:30 277

原创 redis cluster集群搭建

然后copy到其他文件夹,记得改端口号,还有cluster-config-file的值,这个值不能重,必须唯一,否则无法启动。依然是3个主节点,但是7001已经失联,8002从slave变成了master。–cluster-replicas 1表示每个master一个slave。7001文件夹创建配置文件redis.conf。先停掉一个master 7001。启动6个独立的redis实例。确认是否全部启动成功。

2023-09-07 20:26:24 636

原创 K8S容器OOM killed排查

docker耗用完内存前,堆内存并没有达到上限,于是没有触发老年代GC,内存没有降下去。如果容器OOM killed,容器里的jvm进程没有Full GC,那么肯定是MaxRAMPercentage参数太高,导致堆内存没有用到上限,无法触发堆内存(老年代)GC。当实例内存超过95%时,对比top显示的的jvm进程内存和ps stats输出的docker实例内存信息,其余进程耗用的内存忽略不计。遂将内存增加到4GB。4 由于堆内存没有的到达上限,但是整个jvm进程内存超出了容器的内存限制。

2023-08-30 09:20:09 2054

原创 springboot 2.6.6接入prometheus

springboot是2.6.6版本,刚开始用的是simpleclient客户端

2023-07-03 22:55:32 766

原创 Nacos中map类型的配置

需要用nacos往bean里面注入一个map对象。如果直接用nacos的话,需要新开一个****.json的配置文件,个人觉得太麻烦。结合Spring EL表达式的功能,简单的实现了这个功能。java代码nacos配置。

2023-05-16 16:46:40 3511 2

原创 aop切面调用失效问题排查

应用里有较多的地方访问外部供应商接口,由于公网网络不稳定或者外部接口不稳定(重启,发版,ip切换)的原因,经常报502或者504错误。网上搜索有很多帖子反馈@Retryable注解不生效,不生效的点在于:切面切的方法,是在所在的类里被另外的方法调用的,而不是被外部类直接调用。不仅仅是@Retryable有这个问题,所有的切面实现的功能,如果这样调用都有问题。通过生成的类可以发现,如果直接调用没被代理的方法,那么调用的是父类SayHello的方法,也就是没被加强的方法。查看动态生成的类(第三个)

2023-05-04 23:08:42 1576

原创 业务架构与业务中台

在强大中台的有力支撑下,前端在进行业务运营和创新时会变得非常高效且灵活,企业可以根据最新的市场动态展开各种尝试和调整,一旦发现并验证了新的市场机遇,就可以调集中台的强大能力迅速跟进,抢占市场。系统真正运行的时候,取到的是组件和扩展点的对象,并不是代码。这样,代码复用,业务数据隔离。当新业务需要接入时,定义好一个业务身份,同时实现需要的SPI接口,即可完成业务的接入,同时做到业务的隔离。能够快速的支持新业务接入,让新的业务一起共建甚至新业务的同学独立的在XPF框架上接入他们的业务,是我们的目标之一。

2023-03-24 17:43:56 1693

原创 No value specified for parameter 15排查过程

mybatis打印出的SQL的问号有30个,而下面的参数只有29个。一次写两条记录,一条有值一条没值,再排查对应字段的typehandler。, 那一定是15(从0号开始)号位的参数缺失。如果参数为空,直接return了。

2022-09-09 11:14:50 1205

原创 Mybatis中用typehandler优雅的解决枚举类型的读写

表字段是码值的时候,一般会有一个枚举(enum)类对应。我们可以把DO类的对应字段定义为枚举类型,用mybatis的typehandler来处理读写。通过枚举类强管控码值的变化,就不会随着时间的推移,代码的可读性和可维护性大大降低了。5 insert或者update的时候需要在字段后面带上typehandler。1 枚举字段类型定义, 我们的目标是直接把这个类型入库,并正确的读取出来。这样做之后,就只需要维护枚举类型,数据库字段和DO类的注释都不需要了。2 typehandler定义, 需要继承。

2022-08-19 17:35:52 610

原创 全链路参数透传

背景现在的系统大多是基于SOA的分布式应用。跨服务调用的时候,存在线程上线文里的重要信息如traceId,租户id无法传递给下一个应用。要解决的问题内部系统通过RocketMQ交互时,traceId如何透传到消息消费应用内部系统通过Dubbo调用时, traceId如何透传到服务提供方解决方案1 rocketMQ异步透传解决方案发消息时,通过切面拦截 DefaultMQProducer.send 方法,将traceId从threadLocal写入Message的properties里面

2022-03-28 10:40:12 3184

原创 MacOS Monterey根路径下创建目录的办法

Monterey版本根路径下创建文件夹apps,提示只读文件系统➜ / mkdir appsmkdir: apps: Read-only file system按以下方式可以解决:关机以安全模式启动mac,具体方法见Apple官方文档 https://support.apple.com/zh-cn/HT201262。M1芯片和X86芯片的安全模式启动方法不一样。找到终端工具,并执行 csrutil disable关掉mac的sip机制重启电脑查看sip,发现已被禁用。但是此时依旧无法

2022-02-12 15:44:22 3625

原创 deploy父项目的pom文件

在父项目下执行deploy时,会把整个项目所有子模块都deploy到私服,包括web模块。在deploy后加 -N可以解决mvn deploy -Dmaven.test.skip=true -N-N 的解释-N,–non-recursive Do not recurse into sub-projects不会递归到子项目里执行当前命令...

2022-02-10 17:48:13 1702

原创 Mac更换SSD笔记

我的MacbookPro是2015款15寸的,256GB,用了将近5年,最近越发觉得容量不够用。准备材料m.2到苹果的SSD转接卡,淘宝上20一个m.2接口nvme协议的固态盘,我的是三星的970Evo 1TB规格拆机工具,两把螺丝刀,买转接卡配套带的提前把Mac用time machine备份到另一个硬盘上换硬盘用5角螺丝刀拆开后盖,灰特别重,用卫生纸稍微擦下灰尘,用六角螺丝刀卸下原装的固态盘。先把新的固态盘和转接卡连接好,要听到咔嚓一声响,否则,一会儿开机会遇到屏幕显示带问号的文

2020-12-03 13:28:38 1492

原创 人脸识别DEMO

前言写了一个用摄像头捕捉人脸匹配已知人脸的算法。包含两个主要的过程,人脸捕捉和人脸匹配。用的是github上的开源库 face_recognition。Recognize and manipulate faces from Python or from the command line with the world’s simplest face recognition library.这个人脸识别库号称天下第一简洁。使用前进行安装pip3 install face_recognition还

2020-07-08 17:57:40 915

原创 redis aof持久化源码分析

redis的aof持久化方式有两个重要的组成部分增量写命令同步到磁盘aof文件全量重写一、增量同步1. 增量写命令追加到缓冲区redis有个缓冲区,未被写入磁盘的命令首先被存入缓冲区,达到条件后再写入磁盘struct redisServer { // sds 是redis定义的char数组 sds aof_buf; /* AOF buffer, written bef...

2020-02-29 20:17:52 834 2

原创 spring bean初始化耗时统计

spring bean 的生命周期实例化(instantiate), 用构造器创建一个对象字段赋值(populate)初始化(initialize), 执行bean配置里的init方法或者InitializingBean#afterPropertiesSet方法销毁(destruct)实例化和字段赋值一般都很快,但是一些重型的bean被IOC容器创建时,需要调用远程服务或者执行耗时的...

2020-02-20 23:30:06 3741 5

原创 antlr简单表达式语言入门

一、基本介绍antlr是一款适合拿来开发领域特定语言(DSL)的工具。它可以根据开发人员定义的词法和文法生成词法分析器(lexer)程序,语法分析器(parser)程序。如果没有antlr这样的工具,就要自己写底层的词法分析,语法分析,语义分析,中间代码生成等复杂的工作。antlr降低了dsl开发的复杂度。ANTLR (ANother Tool for Language Recognitio...

2020-02-18 13:18:51 1999

原创 dubbo服务导出的本质

当注册中心是zookeeper的时候,服务导出其实是在/root/interface/providers下创建一个临时节点,这个节点的路径就是服务的url。而取消注册就是将该节点删除。 // 服务注册 @Override public void doRegister(URL url) { try { // 创建临时节点 zkCl...

2020-01-08 11:24:04 463

原创 dubbo扩展点的延迟加载机制

dubbo的架构是微内核+插件(dubbo里是扩展,extension)的形式,现代操作系统、maven、Spring等都是这个架构,其优点是易于扩展。通常微内核不带有业务功能,而是负责完整的生命周期里的流程的执行和业务组件的容器。任何原有的功能都可以重新按自己的业务需求定制化。dubbo启动时,并不会加载所有的扩展到内存方法区,而是要用的时候再加载。dubbo的延迟加载时动过一种动态代理的方式...

2020-01-07 18:23:43 893

原创 Hadoop MapReduce 入门实例

一、准备工作从hadoop官网下载了最新的3.1.2版本的hadoop配置hadoop相关的环境变量export HADOOP_HOME=/work/dev_tools/hadoop-3.1.2export PATH=$HADOOP_HOME/bin:$PATHexport HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar二、MapReduc...

2019-09-04 03:15:27 300

原创 Mybatis只有接口没有实现类的原理

问题背景mybaits相对于Ibatis的一大区别就是,不用自己写接口实现类。Ibatis的实现类十几年来做着重复的工作,拼接statementId,然后执行sql。十分没有营养的代码。mybaits干脆不用手工写实现类了,框架帮我们完成了这件事情。实现原理mybatis使用了动态代理技术生成实现类。动态代理的具体手段有两种:jdk自带和cglib。对比jdk自带cglib...

2019-08-19 23:49:17 4601

原创 Java程序员的第一个Python小程序:京东畅销书榜爬虫

毕业后的5年多时间里一直在Java的生态系统里游走,很少触碰其他非Java技术栈。职业安全感隐隐的警告我不能一直停留在自己的舒适区里。时下最火的莫过于AI, 而AI时代带火了Python,那就学学Python。学习一门技术最好的方法是:learning by doing. 在实践中学习。我选择了爬虫作为自己的第一个练手小项目。爬的是京东的计算机与互联网图书销量榜。 html结构分析 ...

2018-06-09 00:16:53 2923 8

原创 计算机术语对照表

看Java框架的外文文档有一段时间了,积累了一些计算机专业术语(terminology)。同时在学习机器学习,也积累了一些机器学习相关的专业术语。这些都不包括普通的英语词汇。分享一下,有不对之处还请诸君指正。后面会定期更新约定大于配置:Convention over configurationMkdir : “make directory” 的缩写词。ECMA:这个组织的目标是评估,开发...

2018-05-28 00:27:38 12643

原创 Reflections框架,类扫描神器

一、 项目背景我们的工程是一个很大的插件化架构的工程。实现某个接口或者带有特定注解的类,都视为一个插件。系统启动前,要在工程依赖的所有的jar包中,扫描指定接口或注解的全部子类,并做进一步的处理。二、 Reflections框架简介 Reflections one-stop-shop object Reflections scans your classpath, inde...

2018-05-20 23:32:35 6916

archetype-catalog

archetype-catalog.xml

2016-10-18

空空如也

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

TA关注的人

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