- 博客(152)
- 收藏
- 关注

原创 中间件和业务类加载隔离
Overview我对类隔离简单的理解:在一个应用内,有类名为clazz,模块A使用了clazz,模块B也使用了clazz。模块A不会用到模块B ClassLoader加载的clazz,模块B不会用到模块A ClassLoader加载的clazz。例如下图,App用到的中间件依赖了ClassA,App也依赖了ClassA。通过类隔离后,App不会使用用中间件依赖的ClassA,中间件不会使用...
2019-04-03 15:33:40
1330
1

原创 JVM基础知识和ASM修改字节码
本文会介绍一下ASM的简单使用和一些JVM相关的知识,但是不会很详细的涵盖所有内容。为了方便理解,我会分别介绍以下内容JVM基础知识Java字节码基础知识ASM基础使用JVM 基础知识因为字节码中的指令执行和JVM相关,所以需要先介绍一下JVM基础知识。JVM 虚拟机栈对Java稍有了解的开发人员,应该都知道JVM有一个Java虚拟机栈,栈中的每一个元素被称为Frame(栈帧)...
2019-03-04 14:02:11
3513
2

原创 基于kafka interceptor监控kafka client消息延迟、数量
kafka interceptor能够拦截,所有kafka client接收或发送的消息, 基于这一点,我们可以在消息被拦截到时,进行消息统计以及相应的延时计算;需要明白一个点kafka在0.10.0版本, 开始支持每个record带一个timestamp. KafkaProducer发送的record所带有的ts比较特别, 你可以在创建ProducerRecord时,设置该recor
2018-02-05 12:26:19
2094

原创 使用zookeeper一个简单分布式demo
zookeeper是一个提供分布式程序协调服务的应用,它的命名空间类似linux系统文件路径等等。 具体描述可以参考官网 https://zookeeper.apache.org/doc/trunk/zookeeperOver.html本文将描述如何借助zookeeper构建一个简单的任务发布运行应用,使用curator。(我也是刚接触zk,如有不对的地方希望指出.谢谢)设计我将任务发布部分作为se
2017-10-22 19:12:19
3236
原创 SpringCloud Gateway获取请求响应body大小
通过上述的2个方法,request、response body的大小已经写入exchange内,只需要实现一个自定义的Filter,就可以获取到报文的大小。假设自定义的Filter命名为BodySizeFilter,它的Order需要在NettyWriteResponseFilter之前。在filter方法内,从exchange获取request、response body大小。}));} }另一种方式是基于Netty的Hander,非重写SpringCloud Gateway类。
2023-08-02 22:32:29
2860
原创 SpringCloud Gateway打印请求、响应内容和唯一流水号配置
SpringCloudGateway默认不打印请求和响应body,对于问题排查非常不友好。通过以下方式打印请求和响应body,header等内容。实现自定义netty handler,转发请求和接受响应内容时打印请求内容。package xxximport io.netty.buffer.ByteBuf;import io.netty.channel.ChannelDuplexHandler;import io.netty.channel.ChannelHandlerContext;impor
2021-11-29 19:14:39
4242
1
原创 获取eureka server自我保护是否触发
Overview客户端代码内通过某种方式获取 eureka server是否触发自我保护。由于eureka server并未提供任何API或者client sdk方式暴露该指标,只能自己寻找获取方式解决方式唯一能够获取eureka server是否开启自我保护的途径是eureka server页面,所以可以通过页面入手。自我保护被触发时页面会显示如下内容查看spring cloud eureka前端页面的实现逻辑,就能获取自我保护是否被触发。根据navbar.ftl内容,找到自我保护是否被触发
2021-09-06 20:26:14
252
原创 基于SpringCloudGateway实现跨注册中心服务发现(增强版)
文章目录Overview详细设计如何区分请求来源微服务请求处理外部请求处理跨域目标网关地址Overview第一版中跨域网关和路由网关属于2个不同类型的网关,本质上跨域也是路由的一种,路由给另一个网络域网关。所以在第二版中合并跨域和路由网关功能,成为支持服务发现的路由转发和跨注册中心调用的网关。第一版网关设计链接:https://blog.youkuaiyun.com/sweatOtt/article/details/117042429路由网关只考虑通过服务发现的方式转发请求的场景,暂不考虑其他场景。详细设计
2021-06-21 14:07:29
1174
原创 SpringCloudGateway原理——请求如何被Gateway路由转发
Gateway 总览SpringCloudGateway核心设计基于Filter,所有的核心逻辑处理都在Filter中。SpringCloudGateway官网架构图非常清晰描述了gateway的工作原理。发送到Gateway的请求会先被RoutePredicateHandlerMapping,如果请求能被接受,返回一个WebHandler。(所谓的接受,就是有配置的Route,请求满足其predicate)WebHandler处理请求,本质就是合并Route和全局Filter,对请求进行fil
2021-06-08 17:24:19
11282
2
原创 SpringCloudGateway原理——Gateway集成eureka服务发现转发请求
文章目录RouteDefinition 定义服务发现构建RouteDefinition根据服务发现规则转发请求匹配 RouteRoute 转发RouteDefinition 定义在SpringCloudGateway内,路由转发规则被定义为Route,Route通过RouteDefinitionRouteLocator#getRoutes获取。在RouteDefinitionRouteLocator内先获取RouteDefinition,即Route的定义。RouteDefinition通过Route
2021-06-07 16:35:36
1651
1
原创 Spring Cloud Ribbon 自定义服务发现
Spring Cloud Ribbon支持自定义的服务发现。服务发现时,可以实现自己的服务发现逻辑,可以配置一个或者多个服务的发现等等。继承com.netflix.loadbalancer.AbstractServerList实现自定义的服务发现获取方式,可以参考ribbon默认的实现com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList。以一个需求为例,阐述如何实现和配置自定义的服务发现。需求: 服务发现某个微服务,如果微服务不存在时
2021-05-27 16:06:21
873
4
原创 基于SpringCloudGateway实现跨注册中心服务发现
文章目录一、Overview二、TODO & NOT TODO三、详细设计1.请求由外部系统通过当前网络域的网关进行微服务调用1)如果被调用的微服务在本网络注册中心存在2)如果被调用的微服务在本网络注册中心不存在结论2.请求由网络域内微服务发起1) 被调用的微服务和发起方处于同一个网络域2) 被调用的微服务和发起方处于不同的网络域3.如何将请求转发给跨域网关概述实现方式服务发现跨域网关4.跨域网关如何确定请求转发到哪个域的API网关一、Overview由于特殊的网络架构,网络被划分为多个域,不同
2021-05-19 19:24:36
1821
3
原创 Spring Cloud Gateway 自定义打印请求和响应报文
Spring Cloud Gateway在debug级别下,默认的日志打印格式如下,不符合正常人的阅读格式,并且不好复制。83152 [reactor-http-nio-2] DEBUG r.netty.http.server.HttpServer - [id: 0x2c9d1b8b, L:/0:0:0:0:0:0:0:1:8080 - R:/0:0:0:0:0:0:0:1:55396] WRITE: 115B +-------------------------------------
2021-05-11 21:22:46
2015
原创 log4j2 大日志导致占用内存过多问题
代码里有频繁的日志打印,并且会打印大对象,单条日志较大,导致jvm被大量日志对象占用。LOG4J2-1858log4j2在2.9.0版本代码org.apache.logging.log4j.message.ParameterizedMessage@Overridepublic String getFormattedMessage() { if (formattedMessage == null) { final StringBuilder buffer = getThrea
2021-04-13 10:55:06
8083
原创 Eureka健康检查心跳和逐出清理
Eureka Client心跳和健康检查分别在独立的线程内,心跳和健康检查属于不同的功能机制。Eureka 健康检查Eureka Client会不断的通过健康检查判断自身客户端的健康状况,并定时将自身的状态注册到eureka server。Eureka和spring cloud体系里健康检查主要分为2类:参数 eureka.client.healthcheck.enabled为true下的spring cloud eureka微服务健康检查上述参数为false或者直接使用eureka(未使用sp
2021-02-11 21:40:09
601
原创 什么是 Sidecar
Sidecar 是什么将本将属于应用程序的功能拆分成单独的进程,这个进程可以被理解为Sidecar。在微服务体系内,将集成在应用内的微服务功能剥离到了sidecar内,sidecar提供了微服务发现、注册,服务调用,应用认证,限速等功能。特点:Sidecar为独立部署的进程。sidecar降低应用程序代码和底层代码的耦合度,帮助异构服务通过sidecar快速接入微服务体系。Sidecar 如何工作接下来以异构服务为基础介绍sidecar如何工作。Sidecar 代理服务注册发现下图为异构
2021-01-24 20:28:29
26300
4
原创 Spring Cloud Hystrix 熔断指标配置项
hystrix执行请求的代码逻辑如下图以下为比较重要的hystrix熔断参数。hystrix: command: default: execution: isolation: strategy: THREAD thread: timeoutInMilliseconds: 10000 circuitBreaker: requestVolumeThreshold: 30
2020-12-21 10:15:59
824
原创 Spring Cloud Hystrix 熔断实现
只分析使用@HystrixCommand注解的情况。feign结合暂时不考虑,也不考虑异步。如果要使用hystrix,可以通过@HystrixCommand注解,注释需要熔断降级的方法,hystrix会根据调用情况和配置值执行熔断、降级。@HystrixCommand注解解析就成了重要的一步,hystrix内通过AOP的方式,处理@HystrixCommand注解。@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotatio
2020-12-18 08:29:28
350
原创 Spring Cloud 应用 Hystrix 如何加载 application.yml 配置
netflix全家桶的代码不是很优雅,各种单例,静态方法调用,hystrix是我读过最屎的代码,兼职无力吐槽,恶心的一批。和其他开源项目项目,代码写的真的是一塌糊涂。application.yml Hystrix 配置如何被加载配置如何注入 Hystrix注入流程Hystrix熔断可以通过在application.yml配置相关参数,但是和常见的在application.yml的配置参数不同,hystrix的配置参数没有对应的@ConfigurationProperties配置类。(在spring
2020-12-17 16:59:00
1320
原创 SpringCloudGateway原理——Gateway集成服务发现原理(基于代码)
开始前接下来分析的spring cloud gateway功能,是接入了服务发现。Spring Cloud Gateway在接入服务发现后,核心路由逻辑和通过property是有所不同的,核心实现类是不同的。入口Spring Cloud Gateway基于WebFlux实现,在webflux中mapping定义和org.springframework.web.reactive.HandlerMapping有关。Spring Cloud Gateway可以根据请求前缀转发请求到同名的微服务,既然是ga
2020-12-16 21:01:31
1547
2
原创 Mybatis spring 结合初始化流程
本文主要介绍Mybatis配合Spring使用,spring如何发现家在mybatis接口,同时将这些接口注册为bean。mybatis配合spring一般会使用MapperScannerConfigurer类,创建对应的bean,这个类实现了BeanDefinitionRegistryPostProcessor接口实现postProcessBeanDefinitionRegistry方法,这个方法会在bean,此接口会在bean都被定义完成之后调用,用户可以自定义修改bean definition。
2020-07-08 18:05:50
367
原创 Flink on Yarn 启动方式
flink yarn 核心入口方法flink yarn集群模式运行的job,通过flink cli提交任务,对应的类为org.apache.flink.yarn.cli.FlinkYarnSessionCli。在FlinkYarnSessionCli对象内会创建org.apache.flink.yarn.YarnClusterDescriptor对象,此对象封装了创建flink yarn session逻辑。org.apache.flink.yarn.YarnClusterDescriptor#depl
2020-05-26 09:57:30
958
原创 实时日志/数据库采集处理,实时用户行为属性个人总结
好久没写博客了,做了一段时间的日志采集和流处理,总结一下自己的工作吧。本人只涉及了日志埋点流处理,监控系统相关的内容不在本文,我也没有涉及到。很有幸的是,在大数据前我负责了内部 debezium 相关的维护开发,所以本文也会介绍一下实时数据库变更流相关的内容。目录概述日志采集端几个问题解决问题其它日志处理日志拆分埋点日志处理其它数据库变更流采集实时计算平台其它概述下图是目前我经手的整个实时...
2020-03-29 16:59:42
1455
原创 flink OutputSelector 简单使用
OutputSelector能够将一条输入流拆分为多个输出流,例如常见的日志流,根据日志级别拆分,就可以通过OutputSelector实现。可以通过一下代码,实现根据日志级别拆分日志流。public class LogSelector implements OutputSelector<String> { @Override public Iterable&l...
2019-12-15 22:21:57
992
1
原创 糟糕的 filebeat
因为公司的服务器和日志所在的kafka集群不是在一个网络下,导致服务器到kafka之间日志传输率受带宽的限制,高峰期一直把带宽跑满,最近花了挺长时间来解决这个问题。问题遇到带宽跑满时,大概率就知道是压缩有问题。我们的filebeat采用了snappy压缩算法,这算法压缩率确实感人,单机发往kafka集群的流量在3Mb/s左右。第一次尝试解决问题看到snappy压缩这么感人,果断立马用了gz...
2019-10-29 21:45:33
1086
原创 kafka 增加数据目录并迁移数据到新目录
增加数据目录:kafka log.dirs能够填写多个文件目录,以逗号分割。停止kafka broker创建新的目录,修改log.dirs,添加新增的目录。启动kafkaps: 新加目录后,原有的数据并不会被重新分配到新数据目录里。新创建的topic会被放入分区文件数最少的磁盘目录。迁移数据到新的目录如果想要把原有目录里的kafka数据迁移到新的目录,步骤如下假设原有的数据目录...
2019-10-12 19:44:58
4133
2
原创 filebeat 写IO巨高的问题
在批量部署filebeat 6.2.x后,发现个位数的机器,写IO巨高,大概有20M/s。并且发现,只要开启了include正则后才会出现这个情况,注释掉正则后恢复正常。后面搜索了一下这个问题,大概是因为filebeat在写registry这份文件导致写io高。registry用来记录offset,当filebeat采集的大量日志,只有很少部分匹配正则时,会导致registry疯狂的写。可...
2019-09-17 09:57:03
2414
3
原创 HBase 入门
本文只涉及最基础的概念,做个记录基础概念Namespacenamespace类似mysql的database,一个namespace含有多个table。TableHbase表包含许多的行(Row)RowHBase的一行包含一个row key和一或多个其它列。HBase中Row会根据Row Key按照字典序排序。Row Key在表中会被作为索引。Column在HBase中,一列由c...
2019-08-28 12:16:58
516
原创 filebeat 数据采集流程
filebeat启动流程 讲解了filebeat的启动流程,filebeat在构建完crawler对象,开始采集流程。Crawler的start方法内,会启动Inputsfunc (c *Crawler) Start( pipeline beat.Pipeline, r *registrar.Registrar, configInputs *common.Config, config...
2019-07-24 15:45:27
1517
1
原创 filebeat 启动流程
因为各种各样的原因,好久没有写博客了,还是希望能够坚持下来讲解一下filebeat的启动流程吧,核心功能先不描述了0.0filebeat启动入口在main.go文件内, cmd.RootCmd.Execute()启动filebeat;func main() { if err := cmd.RootCmd.Execute(); err != nil { os.Exit(1) }}...
2019-07-24 11:12:26
4062
原创 mac 安装多个版本的 jdk
最近打算研究一下elasticsearch,看一下某些代码实现,于是拉了一下代码。吼,这个项目还真是大,拉代码就挺久。然后用idea打开,发现master竟然要jdk 11,切到6.5分支竟然也要jdk 10,自己的电脑装的是jdk8,瞬间感觉有点xxx。于是查了一下mac下怎么配置多个jdk。准备工作如果没有homebrew,先装一下homebrew。第一步brew install je...
2019-05-08 14:56:00
1585
原创 kubernetes StatefulSet 部署 elasticsearch cluster
使用Kubernetes StatefulSet部署Elasticsearch.Service 配置下面是一份elasticsearch service的配置。apiVersion: v1kind: Servicemetadata: name: es-cluster-nodespec: clusterIP: None selector: app: es-cluste...
2019-05-07 12:03:16
2788
原创 Debezium 如何处理 DDL
Mysql的数据变更(ddl, dml)在debezium都对应一个事件,不同的事件Debezium内部会有不同的处理逻辑。Debezium在内存里会维护订阅的所有表的schema信息。当有DDL事件发生时,Debezium会获取到DDL的语句,将DDL作用于内存的表,那么内存中维护的表结构就能和数据库中的表结构一致。当某个表的数据被更新时,假设是insert,Debezium捕获到变更,随后...
2019-02-27 22:05:43
3279
原创 @KafkaListener注解解密
本文会介绍一下@KafkaListener的工作流程,但是不会详细深入。@KafkaListener 如何使用spring-kafka使用基于@KafkaListener注解,@KafkaListener使用方式如下@KafkaListener(topics = "xxx")public void testListen(List<ConsumerRecord<xxx, xxx&...
2019-01-31 14:14:10
22251
4
原创 aspectj 和 lombok
前段时间要做一个本地方法调用链工具,显示方法耗等。为了竟可能的不影响性能,所以采用了aspectj 编译期织入的方式,记录一些数据。aspectj 编译期织入需要特殊的compiler,要额外添加maven plugin。代码写的差不多,能够满足需求了。然后随便找了个项目一试,发现aspectj 竟然和lombok不能一起工作,aspectj编译期会提示找不到 lombok 生成的那些方法。因为...
2019-01-13 14:25:59
1773
原创 2018简单回顾一下
生活今天是2018年的最后一天,回顾今年一整年,有太多的感慨。2018年对我来说是非常特别的一年。今年我毕业了~~,从原来的实习生转正为正式员工,一个非常大的转变。从校园到社会,真的感觉眨眼之间。算了balabala...不说了。技术2018成功的给debezium提了个pr,啊哈哈。感觉社区的2个维护者还是很友好的,给了我一些建议~~。在公司我曾经是debezium kafka系统的维...
2018-12-31 21:34:13
356
1
原创 Java 使用 JGit 执行 Git 命令
某些时候需要使用Java代码执行Git操作,可以使用JGit来实现。<dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>4.9.3.20180731100...
2018-12-27 18:00:52
6520
4
原创 Java 代码解析 mvn dependency tree 结果
com.qunhe.middleware:audit-client:jar:0.2.4.RELEASE+- org.projectlombok:lombok:jar:1.16.18:compile+- org.springframework.cloud:spring-cloud-starter-feign:jar:1.3.5.RELEASE:compile| +- org.springfr...
2018-12-27 17:49:14
4472
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人