在被线上大量日志输出导致性能瓶颈毒打了很多次之后总结出的经验

2021-11-01
阅读 21 分钟
4.4k
由于线上业务量级比较大(日请求上亿,日活用户几十万),同时业务涉及逻辑很复杂,线上日志级别我们采用的是 info 级别,导致线上日志量非常庞大,经常遇到因为日志写入太慢导致的性能瓶颈(各微服务每小时日志量加在一起约小 1000G)。下面将我们做的日志性能提升与精简日志的规范列出,供大家参考。我们使用的日志框...
封面图

Spring-data-redis + Lettuce 如何使用 Pipeline

2021-10-17
阅读 7 分钟
3.2k
关于 spring-data-redis 和 lettuce,笔者写过不少文章:这个 Redis 连接池的新监控方式针不戳~我再加一点佐料spring-data-redis 连接泄漏,我 TM 人傻了spring-data-redis 动态切换数据源spring-data-redis 上百万的 QPS 压力太大连接失败,我 TM 人傻了最近,私信还有留言中,网友提到 spring-data-redis 和 lettuce ...

SpringCloud升级之路2020.0.x版-28.OpenFeign的生命周期-进行调用

2021-10-17
阅读 5 分钟
1.1k
接下来,我们开始分析 OpenFeign 同步环境下的生命周期的第二部分,使用 SynchronousMethodHandler 进行实际调用,其流程可以总结为:
封面图

SpringCloud升级之路2020.0.x版-27.OpenFeign的生命周期-创建代理

2021-10-16
阅读 11 分钟
1.2k
接下来,我们开始分析 OpenFeign 的生命周期,结合 OpenFeign 本身的源代码。首先是从接口定义创建 OpenFeign 代理开始。我们这里只关心同步客户端,因为异步客户端目前还在实现中,并且在我们的项目中,异步响应式的客户端不用 OpenFeign,而是用的官方的 WebClient
封面图

The art of multipropcessor programming 读书笔记-硬件基础2

2021-10-08
阅读 3 分钟
762
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现。并根据个人的查资料以及理解的经历,给各位想更深入理解的人分享一些个人的资料

SpringCloud升级之路2020.0.x版-26.OpenFeign的组件

2021-10-07
阅读 11 分钟
1.5k
官方文档中的组件,是以实现功能为维度的,我们这里是以源码实现为维度的(因为之后我们使用的时候,需要根据需要定制这些组件,所以需要从源码角度去拆分分析),可能会有一些小差异。
封面图

The art of multipropcessor programming 读书笔记-硬件基础1

2021-10-06
阅读 5 分钟
729
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现。并根据个人的查资料以及理解的经历,给各位想更深入理解的人分享一些个人的资料

Spring Cloud Gateway 动态修改请求参数解决 # URL 编码错误传参问题

2021-10-05
阅读 3 分钟
1.6k
但是对于这些报错的请求,我们发现,发送的请求的原始 URI 中, # 被错误的 URL 编码了,变成了 %23,例如上面的请求,发到后端的是:

spring-data-redis 上百万的 QPS 压力太大连接失败,我 TM 人傻了

2021-10-04
阅读 12 分钟
1.6k
大家好,我们最近业务量暴涨,导致我最近一直 TM 人傻了。前几天晚上,发现由于业务压力激增,某个核心微服务新扩容起来的几个实例,在不同程度上,出现了 Redis 连接失败的异常:
封面图

SpringCloud升级之路2020.0.x版-25.OpenFeign简介与使用

2021-10-03
阅读 4 分钟
1k
在微服务系统中,我们经常会进行 RPC 调用。在 Spring Cloud 体系中,RPC 调用一般就是 HTTP 协议的调用。对于每次调用,基本都要经过如下步骤:

启用 Spring-Cloud-OpenFeign 配置可刷新,项目无法启动,我 TM 人傻了(下)

2021-10-02
阅读 8 分钟
1.2k
本篇文章涉及底层设计以及原理,以及问题定位,比较深入,篇幅较长,所以拆分成上下两篇:上:问题简单描述以及 Spring Cloud RefreshScope 的原理下:当前 spring-cloud-openfeign + spring-cloud-sleuth 带来的 bug 以及如何修复Spring Cloud 中的配置动态刷新其实在测试的程序中,我们已经实现了一个简单的 Bean 刷新...
封面图

启用 Spring-Cloud-OpenFeign 配置可刷新,项目无法启动,我 TM 人傻了(上)

2021-10-01
阅读 18 分钟
900
本篇文章涉及底层设计以及原理,以及问题定位,比较深入,篇幅较长,所以拆分成上下两篇:上:问题简单描述以及 Spring Cloud RefreshScope 的原理下:当前 spring-cloud-openfeign + spring-cloud-sleuth 带来的 bug 以及如何修复最近在项目中想实现 OpenFeign 的配置可以动态刷新(主要是 Feign 的 Options 配置),例...
封面图

Spring Cloud Gateway 雪崩了,我 TM 人傻了

2021-09-27
阅读 17 分钟
1.7k
本系列是 我TM人傻了 系列第六期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了获取异常信息里再出异常就找不到日志了,我TM人傻了spring-data-redis 连接泄漏,我 TM 人傻了Spring Cloud Gateway 没有链路信息,我 TM 人傻了大...
封面图

Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)

2021-09-26
阅读 6 分钟
1k
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了获取异常信息里再出异常就找不到日志了,我TM人傻了spring-data-redis 连接泄漏,我 TM 人傻了本篇文章涉及底层设计以及原理,以及问题定位和可能的...
封面图

Spring Cloud Gateway 没有链路信息,我 TM 人傻了(中)

2021-09-25
阅读 10 分钟
2.5k
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了获取异常信息里再出异常就找不到日志了,我TM人傻了spring-data-redis 连接泄漏,我 TM 人傻了本篇文章涉及底层设计以及原理,以及问题定位和可能的...
封面图

Spring Cloud Gateway 没有链路信息,我 TM 人傻了(上)

2021-09-24
阅读 16 分钟
974
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了获取异常信息里再出异常就找不到日志了,我TM人傻了spring-data-redis 连接泄漏,我 TM 人傻了本篇文章涉及底层设计以及原理,以及问题定位和可能的...
封面图

spring-data-redis 动态切换数据源

2021-08-31
阅读 12 分钟
1.4k
最近遇到了一个麻烦的需求,我们需要一个微服务应用同时访问两个不同的 Redis 集群。一般我们不会这么使用 Redis,但是这两个 Redis 本来是不同业务集群,现在需要一个微服务同时访问。
封面图

spring-data-redis 连接泄漏,我 TM 人傻了

2021-08-30
阅读 10 分钟
2.2k
本系列是 我TM人傻了 系列第四期[捂脸],往期精彩回顾:升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了获取异常信息里再出异常就找不到日志了,我TM人傻了本文基于 Spring Data Redis 2.4.9最近线上又出事儿了,新上线了一个微服务系统,上线之后就开始...
封面图

SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer

2021-08-29
阅读 5 分钟
1.1k
本系列代码地址:[链接]通过单元测试,我们也可以了解下一般我们实现 spring cloud 自定义的基础组件,怎么去单元测试。这里的单元测试主要测试三个场景:只返回同一个 zone 下的实例,其他 zone 的不会返回对于多个请求,每个请求返回的与上次的实例不同。对于多线程的每个请求,如果重试,返回的都是不同的实例同时,...
封面图

SpringCloud升级之路2020.0.x版-23.订制Spring Cloud LoadBalancer

2021-08-28
阅读 9 分钟
1.1k
我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器。上一节我们了解了 Spring Cloud LoadBalancer 的结构,接下来我们来说一下我们在使用 Spring Cloud LoadBalancer 要实现的功能:

SpringCloud升级之路2020.0.x版-22.Spring Cloud LoadBalancer核心源码

2021-08-27
阅读 9 分钟
1.3k
经过上一节的详细分析,我们知道可以通过 LoadBalancerClientFactory 知道默认配置类为 LoadBalancerClientConfiguration. 并且获取微服务名称可以通过 environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
封面图

SpringCloud升级之路2020.0.x版-21.Spring Cloud LoadBalancer简介

2021-08-26
阅读 2 分钟
1.8k
Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套...
封面图

SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群

2021-08-25
阅读 7 分钟
843
本系列代码地址:[链接]我们的业务集群结构是这样的:不同 Region,使用不同的 Eureka 集群管理,不同 Region 之间不互相访问。同一 Region 内,可能有不同的业务集群,不同业务集群之间也不互相访问,共用同一套业务集群。同一业务集群内可以随意访问,同时同一业务集群会做跨可用区的容灾。在我们这里的抽象中,zone ...
封面图

SpringCloud升级之路2020.0.x版-19.Eureka的服务端设计与配置

2021-08-24
阅读 6 分钟
983
Eureka Server 配置是 Eureka Server 需要的一些配置,包括之前多次提到的定时检查实例过期的配置,自我保护相关的配置,同一 zone 内集群相关的配置和跨 zone 相关的配置。在 Spring Cloud 中,Eureka 客户端配置以 eureka.server 开头,对应配置类为 EurekaServerConfigBean
封面图

SpringCloud升级之路2020.0.x版-18.Eureka的客户端核心设计和配置

2021-08-23
阅读 6 分钟
1k
Eureka 客户端配置就是访问 Eureka Server 的客户端相关配置,包括 Eureka Server 地址的配置,拉取服务实例信息相关配置,当前实例注册相关配置和 http 连接相关配置。在 Spring Cloud 中,Eureka 客户端配置以 eureka.client 开头,对应配置类为 EurekaClientConfigBean
封面图

一种简易但设计全面的ID生成器思考

2021-08-22
阅读 5 分钟
877
分布式系统中,全局唯一 ID 的生成是一个老生常谈但是非常重要的话题。随着技术的不断成熟,大家的分布式全局唯一 ID 设计与生成方案趋向于趋势递增的 ID,这篇文章将结合我们系统中的 ID 针对实际业务场景以及性能存储和可读性的考量以及优缺点取舍,进行深入分析。本文并不是为了分析出最好的 ID 生成器,而是分析设计...

SpringCloud升级之路2020.0.x版-16.Eureka架构和核心概念

2021-08-20
阅读 3 分钟
749
Eureka 目前 1.x 版本还在更新,但是应该不会更新新的功能了,只是对现有功能进行维护,升级并兼容所需的依赖。 Eureka 2.x 已经胎死腹中了。但是,这也不代表 Eureka 就是不能用了。如果你需要一个简便易于部署的注册中心,Eureka 还是一个很好的选择。云服务环境中,基本上所有实例地址和微服务名称都在不断变化,也并...
封面图

SpringCloud升级之路2020.0.x版-15.UnderTow 订制

2021-08-19
阅读 10 分钟
1.2k
本系列代码地址:[链接]我们使用 Spring Boot 的 SPI 机制对 Undertow 进行订制,主要有如下两个方面:需要在 accesslog 中打开响应时间统计。期望通过 JFR 监控每个 Http 请求,同时占用空间不能太大。接下来我们依次实现这两个需求:首先,我们的框架作为基础组件,应该按照基础组件的标准来开发,使用 这个系列之前介...
封面图

SpringCloud升级之路2020.0.x版-13.UnderTow 核心配置

2021-08-17
阅读 6 分钟
1.4k
本系列代码地址:[链接]Undertow 的配置可以参考 Undertow 的 Builder,并且其中也有一些默认的配置参数:Undertow {代码...} ioThreads 大小为可用 CPU 数量 * 2,即 Undertow 的 XNIO 的读线程个数为可用 CPU 数量,写线程个数也为可用 CPU 数量。workerThreads 大小为 ioThreads 数量 * 8.如果内存大小小于 64 MB,则...

SpringCloud升级之路2020.0.x版-12.UnderTow 简介与内部原理

2021-08-16
阅读 4 分钟
1.7k
在我们的项目中,我们没有采用默认的 Tomcat 容器,而是使用了 UnderTow 作为我们的容器。其实性能上的差异并没有那么明显,但是使用 UnderTow 我们可以利用直接内存作为网络传输的 buffer,减少业务的 GC,优化业务的表现。其实 Tomcat 也有使用直接内存作为网络传输的 buffer 的配置,即 Connector 使用 NIO 或者 NIO2...
封面图