专注java技术,热爱长跑和阅读开源代码 邮箱 lebron374@163.com
Log4j2高危漏洞复现流程
Log4j2漏洞分析源码篇
JDK Proxy动态代理解析
缓存污染日常实践思考
Dubbo大纲
RocketMq Topic权限变更
RocketMq Topic创建和删除
RocketMq 订阅分组创建和删除
开篇 为了统一不同配置中心(如Zookeeper、Nacos、Etcd等)对于服务治理规则的实现,Dubbo2.7.3及之后的版本针对2.7.0以来的配置中心的部分实现进行了重构。 从实际代码来看,Dubbo Admin针对应用纬度的配置的实际生效需要在Dubbo 2.7.3及以后的版本,为了方便debug建议Dubbo的版本是dubbo-2.7.4.1。
开篇 这篇文章主要用于讲解清楚Dubbo Admin的监控数据的来源,如何通过zookeeper作为注册中心来获取实际运行中的数据进行服务治理。 这篇文章主要侧重于数据方面的获取包括consumers, configurators, routers, providers,具体如何进行服务治理后面文章会具体进行分析。
Dubbo Admin介绍 在Dubbo2.6.0版本之前,Dubbo的工程内部包含有dubbo-admin的模块,这个模块提供了Dubbo服务治理的功能,包括动态配置等。 在github上对应的发布tag上可以看到从dubbo-2.6.1开始已经单独抽离出新的模块承载dubbo-admin模块的功能。
开篇 这篇文章目的是为了将consumer在引用producer的过程中创建代理的细节。 Reference创建代理过程 public class ReferenceConfig<T> extends AbstractReferenceConfig { private T creat...
开篇 这篇文章的目的主要是为了讲解下Dubbo中路由策略功能,核心问题包括路由的更新流程和生效流程,当然这些流程都是针对interface服务级别的。 路由生成流程 public class RegistryDirectory<T> extends AbstractDirectory<T> i...
开篇 在Dubbo官方文档中关于泛化调用和泛化实现的说明,这里针对文档的案例做一些简单的说明和解释。 例子 // 引用远程服务 // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); reference.
开篇 从 2.0.5 版本开始,dubbo 开始支持通过 telnet 命令来进行服务治理。通过telnet ip port连接上server端进行调试,具体的命令可以参考Telnet 命令参考手册。
开篇 这篇文章的目的在于描述Dubbo Consumer在直连和注册中心两种场景下针对provider侧invoker的封装。整篇文章主要从单注册中心、单直连地址、多注册中心、多直连地址的角度进行分析。
开篇 这篇文章的目的主要是为了分析Consumer侧Cluster的初始化过程,并针对Consumer实际执行invoke()的过程ClusterInvoker的执行流程进行分解。 Cluster初始化过程中会梳理Cluster和ClusterInvoker的关系,了解核心的join()方法。
开篇 这篇文章用于分析Dubbo在Provider发生变化时Consumer感知变化并更新invoker的过程,这篇文章不会分析provider到invoker之间的转换过程,这部分过程会有单独的文章进行分析。
开篇 这篇文章用于分析Dubbo consumer匹配provider端URL的逻辑,一个简单的场景如在provider侧提供多版本的service的时候,consumer侧能够根据版本匹配到正确的接口并进行访问。
开篇 整个Dubbo Consumer的引用过程比较复杂,这部分的文章会比较多,这篇文章的目的是描述Consumer的订阅过程,侧重于Consumer发现Provider的URL并生成对应的invoker的过程。
开篇 在dubbo的使用过程中会在标签中会配置filter变量,但是filter具体如何生效却不是特别清楚,这篇文章就是针对Filter的加载过程进行下分析,尝试描述清楚过程。 在这篇文章中会尝试解释ProtocolFilterWrapper被调用过程,协议发布的时候都会走到ProtocolFilterWrapper,而这个类是Filter的加载入口,其核心方法在buildInvokerChain()当中。
开篇 这篇文章的目的是在于梳理Dubbo ZookeeperRegistry的注册流程,通过这个流程的分析能够延伸到更多的注册中心。 核心的关注点在于Registry和RegistryFactory对象,RegistryFactory负责动态创建Registry对象,Registry对象负责执行注册中心的注册。
这篇文章的目标是分析清楚Dubbo NettyServer的消息分发策略,会分析Handler的封装和调用过程,最后分析Dubbo NettyServer支持的所有分发策略。 前半部分会讲解清楚Handler的封装流程和调用过程,具体的关系如下图。
开篇 这篇文章的目的是尝试讲解Dubbo Protocol使用Netty Server作为服务端的服务发布过程,为了便于说明清楚,在网上找了一张Dubbo服务发布的流程图,这里我们关注Protocol到Server的部分逻辑,其他的分布其他文章。
开篇 这篇文章尝试对Dubbo服务发布和调用中关于ServiceImpl->invoker->Exporter层面的过程进行分析,希望能够回答ServiceImpl到Exporter的转化过程。 因为Netty转发部分的逻辑也是一个比较复杂的过程,所以拆解成几篇文章分开讲解,这里我们只关注服务发布过程中对象的转换以及部分调用的过程。
开篇 阅读Dubbo的服务发布的源码的时候发现有PROXY_FACTORY.getInvoker()的代码,这部分涉及了javassist动态生成源码的逻辑,因为动态生成代码所以没法直观看到逻辑,借此写一篇分析文章,便于看到这部分逻辑的人能够更好的理解。
开篇 SPI全称为Service Provider Interface,是一种服务提供机制,比如在现实中我们经常会有这种场景,就是对于一个规范定义方而言(可以理解为一个或多个接口),具体的服务实现方是不可知的(可以理解为对这些接口的实现类),那么在定义这些规范的时候,就需要规范定义方能够通过一定的方式来获取到这些服务提供方具体提供的是哪些服务,而SPI就是进行这种定义的。
开篇 本文尝试通过一个示例来讲解Adaptive机制的用法,然后会从源码的角度对其实现原理进行讲解 Adaptive机制 对应于Adaptive机制,Dubbo提供了一个注解@Adaptive,该注解可以用于接口的某个实现类上,也可以用于接口方法上。
开篇 这篇文章尝试分析Protocol的getAdaptiveExtension过程,和dubbo之ExtensionFactory获取适应扩展过程分析不一样的过程在于ExtensionFactory的扩展类是定义的AdaptiveExtensionFactory,而Protocol的适应扩展是动态生成的。
开篇 这篇文章尝试分析dubbo中getAdaptiveExtension过程,且以ExtensionFactory作为例子进行分析。 在这篇文章中我们会了解ExtensionFactory的几个对象AdaptiveExtensionFactory、SpringExtensionFactory、SpiExtensionFactory的初始化过程,然后在这个过程中一窥getAdaptiveExtension的全貌。
开篇 这篇文章的主要目的是记录下Dubbo当中NettyServer针对请求的处理过程,主要是理顺连接建立的过程和调用处理的过程。 这个解析的核心在于理解类的继承关系(可以理解为设计模式当中的装饰者模式),层层递进理解调用关系。
开篇 这篇文章主要是为了讲清楚dubbo server端在bind过程中整个调用链,之前在dubbo服务发布的流程中已经讲解过在dubbo的服务发布过程中底层最终是通过bind()方法来实现监听的。这篇文章会对bind的过程进行细化讲解,包括核心的Exchangers、HeaderExchanger、HeaderExchangeServer等类。
开篇 这篇文章的目的是为了讲解清楚dubbo负载均衡的底层实现机制,根据浏览的网上资料来看似乎随着dubbo的版本更新有一些变化,不过大概分类就是那么多,感兴趣的可以自行阅读。 负载均衡类依赖图 RoundRobinLoadBalance 说明 RoundRobinLoadBalance基于权重的轮询 如果所有provider的权重都是一致的,那么就变成轮询的状态,invokers.get(currentSequence % length)。
开篇 这篇文章的主要目的是讲清楚ClusterInvoker在多个invoker对象进行负载均衡的调用过程,也就描述从调用到负载均衡选择的调用链路,真正的负载均衡部分的逻辑在后面由单独讲解。 selector 调用时序图 说明: RegistryProtocol的doRefer()方法内部cluster.join()负责创建ClusterInvoker对象,所有的cluster的invoker的选择逻辑都在这个函数实现。
开篇 这篇文章的目的是尝试将dubbo的服务引用过程尽量描述的清楚些,主要核心在于注册consumer,订阅provider并生成reference的invoker对象。 另外,尝试通过zookeeper订阅过程回调描述清楚provider变更时consumer如何感知provider的增删操作。
说明: 图片来自dubbo剖析:一 服务发布 ServiceBean作为provider的发布入口 ServiceConfig负责创建exporter对象 RegistryProtocol负责注册URL到zookeeper DubboProtocol负责bind端口启动监听 发布过程 - 源码走读 provider的发布入口 说明: ServiceBean初始化后的afterPropertiesSet方法负责执行服务导出。
开篇 这篇文章主要的目的是想分析下dubbo优雅停机的过程,整个文章参考网上很多现成的文章,本着尊重原创的精神会在文章中备注参考信息。 针对阅读dubbo源码,我的感觉是当你一开始钻到细节当中就很容易一叶障目了,所以建议一开始着重梳理整个框架的逻辑而不要陷入细节当中。
开篇 最近因为一些原因遇到了一些jar包冲突的实际问题,包括tomcat无法加载某lib包,hadoop上mr任务依赖lib版本问题,tomcat依赖包找不到等等。 这些问题归结起来能够很好的检验几个关键问题:1、双亲委派原则的理解;2、maven依赖传递的原则;3、java classpath路径先后顺序问题。
背景介绍 tensorflow serving 在客户端和服务端之间的通信采用的是RPC/REST协议。在TFS提供的REST协议接口存在一定的局限性,REST和RPC对比如下: 1、REST在实际应用中不能支持运行过程动态模型发布。
背景介绍 TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用。更加让人眼前一亮的是,它支持模型热更新与自动模型版本管理。
背景介绍 这篇文章是tensorflow serving java api使用的参考案例,基本上把TFS的核心API的用法都介绍清楚。案例主要分为三部分: 动态更新模型:用于在TFS处于runtime时候动态加载模型。