本项目代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 在我们的项目中,我们没有采用默认的 Tomcat 容器,而是使用了 UnderTow 作为我们的容器.其实性能上的差异并没有那么明显,但是使用 UnderTow 我们可以利用直接内存作为网络传输的 buffer,减少业务的 GC,优化业务的表现. Undertow 的官网:https://undertow.io/ 但…
上一节我们讲述了如何使用 Undertow 作为我们的 Web 服务容器,本小节我们来分析使用 Undertow 的另一个问题,也就是如何配置 accesslog,以及 accesslog 的各种占位符. accesslog 相关配置 server: undertow: # access log相关配置 accesslog: # 存放目录,默认为 logs dir: ./log # 是否开启 enabled: true # 格式,各种占位符后面会详细说明 pattern: '{ "transpo…
1. 背景知识.需求描述与公共依赖 1.1. 背景知识 & 需求描述 Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个自己的微服务系统.那么 Spring Cloud 究竟是如何使用的呢?他到底有哪些组件? spring-cloud-commons组件里面,就有 Spring Cloud 默认提供的所有组件功能的抽象接口,有的还有默认实现.目前的 2020.0.x (按照之前的命名规则应该是 iiford),也就是spri…
Eureka 目前的状态:Eureka 目前 1.x 版本还在更新,但是应该不会更新新的功能了,只是对现有功能进行维护,升级并兼容所需的依赖. Eureka 2.x 已经胎死腹中了.但是,这也不代表 Eureka 就是不能用了.如果你需要一个简便易于部署的注册中心,Eureka 还是一个很好的选择.云服务环境中,基本上所有实例地址和微服务名称都在不断变化,也并不太需要 Eureka 所缺少的持久化特性.当你的集群属于中小规模的时候(节点小于 1000 个), Eureka 依然是一个不错的选择.…
本项目代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器. Spring Cloud LoadBalancer背景 Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,…
本项目代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器.上一节我们了解了 Spring Cloud LoadBalancer 的结构,接下来我们来说一下我们在使用 Spring Cloud LoadBalancer 要实现的功能: 我们要实现不同…
spring-cloud-commons 中参考了 spring-cloud-netflix 的设计,引入了 NamedContextFactory 机制,一般用于对于不同微服务的客户端模块使用不同的 子 ApplicationContext 进行配置. spring-cloud-commons 是 Spring Cloud 对于微服务基础组件的抽象.在一个微服务中,调用微服务 A 与调用微服务 B 的配置可能不同.比较简单的例子就是,A 微服务是一个简单的用户订单查询服务,接口返回速度很快,B…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 在我们的项目中,我们没有采用默认的 Tomcat 容器,而是使用了 UnderTow 作为我们的容器.其实性能上的差异并没有那么明显,但是使用 UnderTow 我们可以利用直接内存作为网络传输的 buffer,减少业务的 GC,优化业务的表现.其实 Tomcat 也有使用直接内存作为网络传输的 buffer 的配置…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford server: undertow: # access log相关配置 accesslog: # 存放目录,默认为 logs dir: ./log # 是否开启 enabled: true # 格式,各种占位符后面会详细说明 pattern: '{ "transportProtocol":"%{TR…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spring Boot 的 SPI 机制对 Undertow 进行订制,主要有如下两个方面: 需要在 accesslog 中打开响应时间统计. 期望通过 JFR 监控每个 Http 请求,同时占用空间不能太大. 接下来我们依次实现这两个需求: 首先,我们的框架作为基础组件,应该按照基础组件的标准来开发,使用…
本系列代码地址: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 spring-cloud-common 不再是一个纯依赖的项目,这个模块包括: spring-framework-common 的依赖 同步与异步微服务公共的依赖 同步与异步微服务公共的框架代码改造,这个我们后面分析框架以及我们设计的修改的时候,会详细分析,这里先跳过 同步与异步微服务公共的依赖包括: 代码请参考:h…
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个自己的微服务系统.那么 Spring Cloud 究竟是如何使用的呢?他到底有哪些组件? spring-cloud-commons组件里面,就有 Spring Cloud 默认提供的所有组件功…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器. Spring Cloud LoadBalancer背景 Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器.上一节我们了解了 Spring Cloud LoadBalancer 的结构,接下来我们来说一下我们在使用 Spring Cloud LoadBalancer 要实现的功能: 我们要实现不同…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们也可以了解下一般我们实现 spring cloud 自定义的基础组件,怎么去单元测试. 这里的单元测试主要测试三个场景: 只返回同一个 zone 下的实例,其他 zone 的不会返回 对于多个请求,每个请求返回的与上次的实例不同. 对于多线程的每个请求,如果重试,返回的都是不同的实例 同时,我们也需…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务映射,通过健康检查接口判断实例健康状态,然后直接使用 OpenFeign 生成对应域名的 Feign Client.Spring Cloud 生态中,对 OpenFeign 进行了封装,其中的 Feign Client 的各个组件,也是做了一定的定制化,可以实现在 OpenFeign Client…
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 我们实现的 Spring Cloud 微服务框架,里面运用了许多 Spring Cloud 组件,并且对于某些组件进行了个性化改造.那么对于某个 Spring Cloud 组件,我们一般是如何入手理解其中的原理呢?以及如何知道其中的扩展点呢?一般从下面两个方面入手: 通过 spring-boot SPI 机制查看…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 经过上一节的详细分析,我们知道可以通过 LoadBalancerClientFactory 知道默认配置类为 LoadBalancerClientConfiguration. 并且获取微服务名称可以通过 environment.getProperty(LoadBalancerClientFactory.PROPERT…
本系列代码地址: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 我们使用 Log4j2 异步日志配置,防止日志过多的时候,成为性能瓶颈.这里简单说一下 Log4j2 异步日志的原理:Log4j2 异步日志基于高性能数据结构 Disruptor,Disruptor 是一个环形 buffer,做了很多性能优化(具体原理可以参考我的另一系列:高并发数据结构(disruptor)),Lo…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在前面一节,我们利用 resilience4j 粘合了 OpenFeign 实现了断路器.重试以及线程隔离,并使用了新的负载均衡算法优化了业务激增时的负载均衡算法表现.这一节,我们开始编写单元测试验证这些功能的正确性,以便于日后升级依赖,修改的时候能保证正确性.同时,通过单元测试,我们更能深入理解 Spring Cloud. 验证重试配置 对于我们实现的重试,我们需要验证: 验证配置正确…
本系列代码地址: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 我们先来回顾下 maven 依赖中一个重要原则:最短路径原则.这在之后我们的使用中会经常用到. 举一个例子,假设我们以 spring-boot-parent 作为 parent: <parent> <groupId>org.springframework.boot</groupId> <…
本系列代码地址: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 Eureka 目前 1.x 版本还在更新,但是应该不会更新新的功能了,只是对现有功能进行维护,升级并兼容所需的依赖. Eureka 2.x 已经胎死腹中了.但是,这也不代表 Eureka 就是不能用了.如果你需要一个简便易于部署的注册中心,Eureka 还是一个很好的选择.云服务环境中,基本上所有实例地址和微服务名称…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka 客户端配置就是访问 Eureka Server 的客户端相关配置,包括 Eureka Server 地址的配置,拉取服务实例信息相关配置,当前实例注册相关配置和 http 连接相关配置.在 Spring Cloud 中,Eureka 客户端配置以 eureka.client 开头,对应配置类为 Eure…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka Server 配置是 Eureka Server 需要的一些配置,包括之前多次提到的定时检查实例过期的配置,自我保护相关的配置,同一 zone 内集群相关的配置和跨 zone 相关的配置.在 Spring Cloud 中,Eureka 客户端配置以 eureka.server 开头,对应配置类为 Eur…
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构是这样的: 不同 Region,使用不同的 Eureka 集群管理,不同 Region 之间不互相访问. 同一 Region 内,可能有不同的业务集群,不同业务集群之间也不互相访问,共用同一套业务集群. 同一业务集群内可以随意访问,同时同一业务集群会做跨可用区的容灾. 在我们这里的抽象中,zone…
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 首先,我们给出官方文档中的组件结构图: 官方文档中的组件,是以实现功能为维度的,我们这里是以源码实现为维度的(因为之后我们使用的时候,需要根据需要定制这些组件,所以需要从源码角度去拆分分析),可能会有一些小差异. 负责解析类元数据的 Contract OpenFeign 是通过代理类元数据来自动生成 HTTP API 的,那么到底解析哪些类元数据,哪些类元数据是有效的,是通过指定 Con…