自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

知秋的博客

功不唐捐

  • 博客(46)
  • 收藏
  • 关注

原创 Spring-rabbit重试消费源码分析

本文深入解析了RabbitMQ与Spring Boot 3.1.x集成时RetryOperationsInterceptor的工作原理。该组件通过拦截消息消费异常实现重试机制,支持配置最大尝试次数(如3次)、退避策略(初始间隔1秒,倍增因子2.0)和最终恢复处理(转发至死信队列)。源码层面揭示了其与RetryTemplate的协作流程:当消费失败时自动重试,若达到上限则调用RepublishMessageRecoverer将消息路由至死信队列。文章还展示了如何通过@RabbitListener与自定义容器工

2025-06-14 15:24:19 656

原创 Responsive programming in Springboot Application (2)

Springboot reactive programming

2024-08-04 12:55:06 816

原创 Responsive programming in Springboot Application (1)

【代码】Responsive programming in Springboot Application (1)

2024-07-07 17:29:34 1200 7

原创 Java使用Zstandard压缩算法对字节数组进行压缩和解压缩

最近在做项目的时候,因为项目部署在国外,又是公网的环境,流量费用很贵,所以需要使用Netty对传输的数据进行压缩和解压缩,准备用Facebook的Zstandard试试性能,听说压缩性能好,还可以根据需求调整压缩比。然而在网上搜索了一阵子发现,java通过zstd对字节数组做压缩和解压缩的例子很少,仅有的几个给出的API还都是错误的,更别说跑通了,就算使用Gpt3.5和4.0给的的示例也是错误的,所以干脆写篇文章记录一下。

2023-11-02 14:06:48 1601

原创 Netty使用SslHandler实现加密通信

不积跬步,无以至千里。

2023-10-17 18:30:27 1346

原创 Zookeeper断网重连事件回调源码分析

不积跬步,无以至千里。

2023-10-14 16:17:46 1483

原创 Linux环境安装及使用Openresty:构建高性能Web应用

Openresty应用

2023-10-14 16:13:52 656

原创 Linux运行环境搭建系列-虚拟机安装

注意:需要开启CPU的虚拟化。

2023-10-14 16:12:31 356

原创 Linux运行环境搭建系列-Docker及MySQL8安装

问题:新版 MySQL 授权用户时报错 near ‘IDENTIFIED BY ‘密码’ with grant option’ at line 1。原因:因为新版的的mysql版本已经将创建账户和赋予权限的方式分开了。

2023-10-14 16:08:27 312

原创 Spring源码解析-环境变量(中)

spring源码

2022-12-14 15:29:06 502

原创 Spring源码解析-环境变量(上)

spring源码解析

2022-12-10 19:52:00 929

原创 Linux压测工具wrk安装与使用

简介wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrk。wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架。 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来自于 Tcl 的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知

2022-05-12 12:10:33 2734

原创 Gor + Apisix实现流量复制

环境准备#安装Go 1.13+$ wget https://dl.google.com/go/go1.13.linux-amd64.tar.gz$ tar -C /usr/local -zxvf go1.13.linux-amd64.tar.gz$ sudo vim /etc/profileexport GOROOT=/usr/local/goexport PATH=$PATH:$GOROOT/bin$ source /etc/profile#查看Go版本$ go version##

2022-05-12 12:06:17 1178 1

原创 xxl-job系列(3)- 几种任务调度形式

1 BEAN模式(类形式)Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。优点:不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持,可以参考示例项目 “xxl-job-executor-sample-frameless”;缺点:每个任务需要占用一个Java类,造成类的浪费;不支持自动扫描任务并注入到执行器容器,需要手动注入。步骤一:执行器项目中,开发Job类:1、开发一个继承自"com.xxl.job.core.handler.

2021-12-22 19:21:16 6273

原创 xxl-job系列(2)- 任务详解

开发第一个任务“Hello World”“GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量。前提:请确认“调度中心”和“执行器”项目已经成功部署并启动;步骤一:新建任务:登录调度中心,进入任务管理,点击“新建任务”按钮,新建示例任务。然后,点击保存。步骤二:“GLUE模式(Java)” 任务开发:点击任务操作栏 “GLUE IDE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)”

2021-12-22 18:39:19 4087

原创 xxl-job系列(1)- 快速入门

快速入门1 初始化“调度数据库”“调度数据库初始化SQL脚本” 位置为:/xxl-job/doc/db/tables_xxl_job.sql调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;如果mysql做主从,调度中心集群节点务必强制走主库;2 编译源码解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下:xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor-samples:执行器

2021-12-22 18:38:21 561

原创 高性能微服务网关APISIX - 常用插件(3)

limit-req简介限制请求速度的插件,使用的是漏桶算法。属性名称类型必选项默认值有效值描述rateinteger必须rate > 0指定的请求速率(以秒为单位),请求速率超过 rate 但没有超过 (rate + burst)的请求会被加上延时。burstinteger必须burst >= 0t请求速率超过 (rate + burst)的请求会被直接拒绝。keystring必须[“remote_addr”, “ser

2021-12-17 20:11:54 2722

原创 高性能微服务网关APISIX - 常用插件(2)

proxy-rewrite简介proxy-rewrite 是上游代理信息重写插件,支持对 scheme、uri、host 等信息的重写。属性NameTypeRequirementDefaultValidDescriptionschemestring可选“http”[“http”, “https”]不推荐使用。应该在 Upstream 的 scheme 字段设置上游的 scheme。uristring可选转发到上游的新 uri 地址。meth

2021-12-17 19:15:45 2327 1

原创 高性能微服务网关APISIX - 常用插件(1)

APISIX 常用插件(1)APISIX 插件机制Plugin 表示将在 HTTP 请求/响应生命周期期间执行的插件配置。Plugin 配置可直接绑定在 Route 上,也可以被绑定在 Service 或 Consumer上。而对于同一 个插件的配置,只能有一份是有效的,配置选择优先级总是 Consumer > Route > Service。在 conf/config.yaml 中,可以声明本地 APISIX 节点都支持哪些插件。这是个白名单机制,不在该白名单的插件配置,都将会被自动忽

2021-12-17 13:32:29 5701

原创 使用kubeadm部署Kubernetes集群(v1.20.0)

使用kubeadm部署Kubernetes集群(v1.20.0)介绍Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。环境准备服务器要求:• 建议最小硬件配置:2核CPU、2G内存、30G硬盘• 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点软件环境:软件版本操作系统CentOS 7.x 64位容器引擎Docker CE 19

2021-12-15 20:41:33 1398

原创 高性能微服务网关APISIX - API文档

Admin APIDescriptionAdmin API 是为 Apache APISIX 服务的一组 API,我们可以将参数传递给 Admin API 以控制 APISIX 节点。更好地了解其工作原理,请参阅 architecture-design 中的文档。启动 Apache APISIX 时,默认情况下 Admin API 将监听 9080 端口(HTTPS 的 9443 端口)。您可以通过修改 conf/config.yaml 文件来改变默认监听的端口。在下面出现的 X-API-KEY 指

2021-12-15 18:37:25 8945 2

原创 APISIX Dashboard 源码构建

APISIX Dashboard 源码构建注:此文档构建环境为腾讯云CentOS 7.9,虚拟机同样适用。SourceThe Dashboard project contains both manager-api and web, but web is optional.The manager-api and web will be included in this build guide product.PrerequisitesBefore using source codes to b

2021-12-15 18:29:28 2625 1

原创 Apache APISIX 源码构建

如何构建 Apache APISIX注:此文档构建环境为腾讯云CentOS7.9,虚拟机同样适用。步骤1:安装依赖# 编写依赖脚本cd /usr/local && mkdir apisix-depscd apisix-deps && vim deps.sh# 脚本内容见下方代码块# 添加权限并执行脚本,安装依赖chmod +x deps.sh && ./deps.shrm -f deps.sh#!/usr/bin/env bash

2021-12-15 16:51:03 1520

原创 Feign源码深度刨析-(7)终章:请求处理组件LoadBalancerCommand

“不积跬步,无以至千里。”Controller中调用FeignClient 接口方法,经过动态代理机制,由FeignInvocationHandler 的invoke() 方法处理,转而交给SynchronousMethodHandler 的invoke() 方法处理,继续调用LoadBalancerFeignClient 的execute() 方法return lbClient(clientName).executeWithLoadBalancer(ribbonRequest, requestCo.

2021-08-27 16:26:49 773

原创 Feign源码深度刨析-(6)动态代理核心处理器:FeignInvocationHandler

“不积跬步,无以至千里。”前面说了,FeignClientFactoryBean的getObject()方法返回的就是一个类型为FeignInvocationHandler的代理对象所有,一旦Controller 中调用feign接口的方法,实际调用的就是这个动态代理,有点尝试的都知道,对于动态代理对象的方法调用,都会经过其绑定的InvocationHandler 的invoke()方法来处理private final Map<Method, MethodHandler> dispat.

2021-08-20 18:05:30 905

原创 Feign源码深度刨析-(5)核心组件FeignClientFactoryBean(下)

“不积跬步,无以至千里。”回顾一下,前面说了,把Feign.Builder、context、HardCodedTarget 一起传入了一个loadBalance()方法里面,最后给 return 了,这个 return 的就是feign client的代理对象,然后注入给Controller的属性这篇文章来着重分析一下 loadBalance() 方法protected <T> T loadBalance(Feign.Builder builder, FeignContext cont.

2021-08-20 15:44:55 474

原创 Feign源码深度刨析-(4)核心组件FeignClientFactoryBean(中)

“不积跬步,无以至千里。”这一篇文章的话,就来看一下feign的动态代理是怎么生成的,生成的动态代理会被添加到容器中,在需要的时候被调用,实际上我们前面也说了,在Controller中自动注入的就是这里生成的动态代理对象,那么这个对象里面包含了什么组件?怎么读取application.yml中配置的跟feign相关的参数的?接着上篇的代码继续跟进,给Feign.Builder 注入一些组件(logger、encoder、decoder等)之后configureFeign(context, buil.

2021-08-19 11:42:33 433

原创 Feign源码深度刨析-(3)核心组件:FeignClientFactoryBean(上)

“不积跬步,无以至千里。”前面说了,@EnableFeignClients 这个注解往容器中导入了一个组件 FeignClientsRegistrar ,这个组件实现了 ImportBeanDefinitionRegistrar接口,那么它的 registerBeanDefinitions() 方法就会往spring容器中导入一些组件registerFeignClients(metadata, registry);这个方法会搞一个组件扫描器ClassPathScanningCandidateCom.

2021-08-18 14:40:05 675

原创 Feign源码深度刨析-(2)组件扫描器:ClassPathScanningCandidateComponentProvider

“不积跬步,无以至千里。”这篇文章,一起来看看feign的核心机制,看看是如何扫描所有包下的@FeignClient注解的接口入口就是这个registerFeignClients(metadata, registry)方法public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { ClassP.

2021-08-16 18:22:36 798 2

原创 Feign源码深度刨析-(1)初探:@EnableFeignClients

“不积跬步,无以至千里。”之前我们讲了ribbon的核心源码,其实在实际生产环境中,国内用ribbon+restTemplate去做微服务调用的甚少,因为会导致我们每次去调用人家一个接口,都要单独写一些代码,非常不简洁,所以我们这一个专题开始,研究一下feign的底层核心源码。feign这个东西呢,底层也是依赖了ribbon做负载均衡的,所以是整合了ribbon的,feign的具体用法这里就不赘述了,相信来看这篇博文的,都是熟练使用的,技术,用,是很简单的,随便百度一下,csdn其他的文章,一搜一大.

2021-08-16 12:39:28 636

原创 Ribbon源码深度刨析-(5)ServiceRequestWrapper

“不积跬步,无以至千里。”上文写到,ribbon通过其内置的IRule组件,使用指定的负载均衡算法(默认轮询)从ILoadBalancer组件的server list中会拿到一个真正要发送请求的server地址,那么接下来,就会调用网络通信组件发起http请求了。@Overridepublic <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> req.

2021-08-13 11:33:10 1343 2

原创 Ribbon源码深度刨析-(4)服务列表更新与负载均衡

“不积跬步,无以至千里。”之前我们看到了ribbon负载均衡组件里的服务列表实际上是从eureka client自己本地的缓存中获取的eureka client自己本身,是不断的去从eureka server每隔30秒更新一次注册表,拉取增量注册表所以ribbon和eureka整合的机制里,肯定得有一个组件,负责每隔一定的时间,从本地的eureka client里刷新一下服务的注册表到LoadBalancer中继续回到 DynamicServerListLoadBalancer 组件的 rest.

2021-08-12 16:29:00 573

原创 Ribbon源码深度刨析-(3)整合Eureka

“不积跬步,无以至千里。”众所周知,在springcloud体系中,Ribbon组件的功能是充当了负载均衡的作用,那么具体完成这个工作的是其内部哪个组件?答案是ILoadBalancer。ILoadBalancer loadBalancer = getLoadBalancer(serviceId);Server server = getServer(loadBalancer);从这两行源码中也可以看出,每个被调服务都会对应一个ILoadBalancer而且里面会包含服务列表,这篇文章就来重.

2021-08-11 14:44:03 411 2

原创 Ribbon源码深度刨析-(2)核心组件:RibbonLoadBalancerClient

“不积跬步,无以至千里。”接着上一篇文章,return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));显然微服务调用的逻辑都在这个LoadBalancerClient组件的execute方法中,那么这个组件是从哪里来的@Beanpublic LoadBalancerInterceptor ribbonInterceptor( LoadBala.

2021-08-09 17:37:25 749 2

原创 Ribbon源码深度刨析-(1)ribbon初探:LoadBalancerInterceptor

“不积跬步,无以至千里。”这个专题开始,来深度刨析一下作为springcloud老牌的客户端负载均衡组件,Ribbon。在项目中需要使用Ribbon,只需要使用@LoadBalanced去标注一个RestTemplate的bean即可,后续就可以在Controller中注入一个RestTemplate,调用getForObject()之类的方法了@LoadBalanced@Beanpublic RestTemplate getRestTemplate() { return new Re.

2021-08-09 14:48:31 577

原创 Eureka源码深度刨析-(11)Eureka终章:集群

“不积跬步,无以至千里。”使用在生产环境的eureka,一定没有人是“单机”的,那样的话,一个注册中心挂了,整个微服务都不可用了,当然你也别抬杠说eureka client会缓存本地注册表,再怎么说,注册中心它也是微服务集群正常工作的核心,重中之重作为eureka系列的最后一篇文章,就来探讨一下eureka的集群模式吧。首先就从eureka server的初始化看起,在EurekaBootStrap#initEurekaServerContext()中,有一块代码,是跟PeerEurekaNode.

2021-08-03 16:03:19 468

原创 Eureka源码深度刨析-(10)Eureka自我保护机制

“不积跬步,无以至千里。”eureka专题的第10篇文章,来聊聊eureka所谓的**“自我保护机制”**。提起eureka的自我保护机制,相信人人都能说两句,大概的意思,就是eureka在一段时间内,如果过期的服务实例过多,超多了一个比例,eureka server就会认为自己作为注册中心一定是网络发生了故障,导致接收不到客户端的心跳,这个时候就会进入一个保护模式,就不会再摘除任何服务实例了,然后静静地等待自己的网络恢复,巴拉巴拉… …大概就是这么个意思,这个保护机制,有些地方说生产环境建议开启.

2021-08-02 18:07:27 257

原创 Eureka源码深度刨析-(9)EurekaServer服务实例故障感知及摘除

“不积跬步,无以至千里。”如果是eureka client主要停机下线,可以去调用shutdown()方法这种优雅的方式将服务实例摘除,但实际生产中,我们开发人员一般不会主动去发送请求将服务实例下线,而是某个服务发生了故障宕机。那么eureka应对这种服务故障宕机的场景,就会采用故障检测机制进行感知,然后把故障实例摘除eureka靠什么感知故障?心跳。每个eureka client会定时向server端发送心跳,服务端记录对应服务及心跳发送时间,搞一个后台调度线程池去轮询,发现某个服务超过了一段.

2021-08-02 14:37:14 418

原创 Eureka源码深度刨析-(8)Eureka心跳续约与实例摘除机制

“不积跬步,无以至千里。”这篇文章来看看Eureka中两个重要的核心机制:心跳续约与故障摘除。心跳续约,eureka client每隔一定时间,向server发送心跳,让eureka server知道自己还活着,还可以继续对外提供服务,简言之,就是如此。这个心跳是通过一个调度线程池实现的,根据之前的经验,跟client有关的功能,找DiscoveryClient这个类,准没错,把eureka源码读完之后,会发现,DiscoveryClient里面近2000行代码,几乎涵盖了client端的所以功.

2021-07-30 11:34:56 415

原创 Eureka源码深度刨析-(7)EurekaClient增量拉取注册表

“不积跬步,无以至千里。”之前说过,Eureka client第一次启动的时候,回去一次性全量拉取server端的注册表信息,缓存在本地,后续会通过一个定时调用的线程任务,每隔一定时间(默认30s),发动请求到server端,拉取增量的注册表。这个所谓的“增量”,其实是说,跟上一次拉取相比,后续有变动的服务实例,而不是每次都全部拉取下来。这个定时调度的线程池是通过DiscoveryClient构造方法中的一个initScheduledTasks()方法初始化的// finally, init t.

2021-07-28 11:42:03 394

空空如也

空空如也

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

TA关注的人

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