本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Log4j2 异步日志配置,防止日志过多的时候,成为性能瓶颈.这里简单说一下 Log4j2 异步日志的原理:Log4j2 异步日志基于高性能数据结构 Disruptor,Disruptor 是一个环形 buffer,做了很多性能优化(具体原理可以参考我的另一系列:高并发数据结构(disruptor)),Lo…
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个自己的微服务系统.那么 Spring Cloud 究竟是如何使用的呢?他到底有哪些组件? spring-cloud-commons组件里面,就有 Spring Cloud 默认提供的所有组件功…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 zuul,选用了 Spring Cloud Gateway 作为内部网关.为何选择 Spring Cloud Gateway 而不是 nginx 还有 Kong 的原因是: 项目组对于 Java 更加熟悉,并且对于 Project Reactor 异步编程也比较熟悉,这个比较重要 需要在网关中使用我…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford spring-cloud-common 不再是一个纯依赖的项目,这个模块包括: spring-framework-common 的依赖 同步与异步微服务公共的依赖 同步与异步微服务公共的框架代码改造,这个我们后面分析框架以及我们设计的修改的时候,会详细分析,这里先跳过 同步与异步微服务公共的依赖包括: 代码请参考:h…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Spring Cloud Gateway 中可能发生链路信息丢失的问题. 主要冲突 - Project Reactor 与 Java Logger MDC 之间的设计冲突 Poject Reactor 是基于异步响应式设计的编程模式的实现,它的主要实现思路是先编写执行链路,最后 sub 执行整个链路.但…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 源代码文件:https://github.com/HashZhang/spring-cloud-scaffold/blob/master/spring-cloud-iiford/pom.xml 1. 使用 log4j2 异步日志所需要的依赖:需要排除默认的日志实现 logback,增加 log4j2 的依赖,并且添加…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Log4j2 异步日志核心通过 RingBuffer 实现,如果某一时刻产生大量日志并且写的速度不及时导致 RingBuffer 满了,业务代码中调用日志记录的地方就会阻塞.所以我们需要对 RingBuffer 进行监控.Log4j2 对于每一个 AsyncLogger 配置,都会创建一个独立的 RingBuffer…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Undertow 的配置可以参考 Undertow 的 Builder,并且其中也有一些默认的配置参数: Undertow private Builder() { ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2); workerTh…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构是这样的: 不同 Region,使用不同的 Eureka 集群管理,不同 Region 之间不互相访问. 同一 Region 内,可能有不同的业务集群,不同业务集群之间也不互相访问,共用同一套业务集群. 同一业务集群内可以随意访问,同时同一业务集群会做跨可用区的容灾. 在我们这里的抽象中,zone…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 网关由于是所有外部用户请求的入口,记录这些请求中我们需要的元素,对于线上监控以及业务问题定位,是非常重要的.并且,在这些元素中,链路信息也是非常重要的.通过链路信息,我们可以找到请求调用全链路相关的日志.并且,网关也是大部分请求链路起始的地方,记录请求中的元素的同时,也要带上链路信息. 我们需要在网关记录每个请求的: HTTP 相关元素: URL 相关信息 请求信息,例如 HTTP HE…