06 2020 档案
摘要:Javaassist 就是一个用来处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同时也可以去生成一个新的类对象,通过完全手动的方式。 引入依赖 <dependency> <groupId>org.javassist<
阅读全文
摘要:一、使用示例 (1)创建一个XxxFilter,并实现com.alibaba.dubbo.rpc.Filter 这个类 public class MyDubboFilter implements Filter { public Result invoke(Invoker<?> invoker, In
阅读全文
摘要:当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从 2.2.0 版本开始,Dubbo 默认在本地以 injvm 的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。 与本地对象上方法调用不同的是,Dubbo 本地调用会经过
阅读全文
摘要:什么是泛化调用? 泛化调用就是服务消费者端因为某种原因并没有该服务接口,这个原因有很多,比如是跨语言的,一个PHP工程师想调用某个java接口,他并不能按照你约定,去写一个个的接口,Dubbo并不是跨语言的RPC框架,但并不是不能解决这个问题,这个PHP程序员搭建了一个简单的java web项目,引
阅读全文
摘要:本地伪装通常用于在远程调用出错的情况下服务降级,即本地伪装用来做容错处理 通过将服务端设置睡眠使用得客户端调用超时,抛出异常 public String sayHello(String name) { // Dubbo 默认的超时时间是 1000 ms,这里通过睡眠 5000ms 来达到触发超时异常
阅读全文
摘要:本地存根的工作方式与 AOP 的 around advice 类似,而本地伪装的工作方式等同于 AOP 中的 after-throwing advice,也就是说,只有当远程调用发生 exception 的时候才会执行本地伪装。本地存根和本地伪装的工作流程如下图所示: 服务消费者发起调用 如果服务消
阅读全文
摘要:前言 长连接和短连接 短连接:每次通信结束后关闭连接,下次通信需要重新创建连接;优点就是无需管理连接,无需保活连接; 长连接:每次通信结束不关闭连接,连接可以复用,保证了性能;缺点就是连接需要统一管理,并且需要保活; 主流的RPC框架都会追求性能选择使用长连接,所以如何保活连接就是一个重要的话题,也
阅读全文
摘要:方法说明 oninvoke方法:必须具有与真实的被调用方法sayHello相同的入参列表:例如,oninvoke(String name) onreturn方法:至少要有一个入参且第一个入参必须与sayHello的返回类型相同,接收返回结果:例如,onreturnWithoutParam(Strin
阅读全文
摘要:Dubbo 提供了4种负载均衡实现,分别是 基于权重随机算法的 RandomLoadBalance 基于最少活跃调用数算法的 LeastActiveLoadBalance 基于hash一致性的 ConsistentHashLoadBalance 基于加权轮询算法的 RoundRobinLoadBal
阅读全文
摘要:官方介绍 为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理
阅读全文
摘要:服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者 Dubbo 目前提供了三种服务路由实现,分别为 条件路由 ConditionRout
阅读全文
摘要:前言 集群容错源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance 集群工作过程可分为两个阶段: 第一个阶段是在服务消费者初始化期间,集群 Cluster 实现类为服务消费者创建 Cluster Invoker 实例,
阅读全文
摘要:一、前言 Dubbo内核 dubbo所有功能都是基于dubbo内核之上完成的,dubbo内核由四部分构成,分别为SPI、Adaptive、Wrapper、Activate。而dubbo的内核设计原则,也是我们所熟悉的aop,ioc与动态编译compiler,这些称之为dubbo的内核原理。 Wrap
阅读全文
摘要:Adaptive是Dubbo的自适应拓展机制。自适应拓展机制是为了解决什么问题? 解决如何根据运行时参数信息动态选择需要加载的拓展的类 常用的拓展类: interface com.alibaba.dubbo.cache.CacheFactory interface com.alibaba.dubbo
阅读全文
摘要:SPI 全称为 Service Provider Interface,是一种服务发现机制 一、Java SPI 从上面可以看出Java中的SPI最大的缺点是会加载一些不必要的组件。 二、Dubbo SPI (1)基本原理 Dubbo在某个接口上加上@SPI注解后,表明该接口为可扩展接口 Extens
阅读全文
摘要:服务提供者服务暴露过程是,当服务提供者NettyServer启动完成后,向ZK注册订阅的过程 服务消费者服务暴露过程是,创建代理对象的时候,注ZK注册订阅的过程 一、服务提供方 注册服务:调用register方法,ZookeeperRegistry中的doRegister方法。zk节点上生成prov
阅读全文
摘要:一、Dubbo中的URL 一个标准的 URL 格式至多可以包含如下的几个部分 protocol://username:password@host:port/path?key=value&key=value 在 dubbo 中,也使用了类似的 URL,主要用于在各个扩展点之间传递数据,组成此 URL
阅读全文
摘要:RPC 起源 RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 "Implementing Remote Procedure Calls" 中他提到了几点: 简单:RPC 概念的语义十分清晰和
阅读全文
摘要:执行过程如下图所示 代理bean方法调用,即代理bean方法调用 我们知道demoService的bean是一个代理类,并且这个代理类继承com.alibaba.dubbo.common.bytecode.Proxy这个类,代理类中sayHello方法内部代码如下: (来源于Dubbo官网) /**
阅读全文
摘要:服务提供者初始化过程,即ServiceBean 初始化过程 一、解析配置文件 spring在解析配置文件的过程中,会找到dubbo 命名空间对应的handler,DubboNamespaceHandler public class DubboNamespaceHandler extends Name
阅读全文
摘要:服务消费者初始化过程,即生成RefrenceBean的过程 整体执行流程 备注:Dubbo 默认使用 Javassist 框架为服务接口生成动态代理类,可以使用使用阿里开源 Java 应用诊断工具 Arthas 反编译代理类 Dubbo官网提供的时序图 一、RefrenceBean生成过程 Refr
阅读全文
摘要:一、定义 ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。 概括
阅读全文
摘要:对象的内存分配,从大方向上将,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃
阅读全文
摘要:一、Java堆内存结构 JVM将堆分成了二个大区新生代(Young)和老年代(Old),新生代又被进一步划分为Eden(伊甸园空间)和Survivor(幸存者空间)区,而Survivor由Survivor1和Survivor2组成,也有些人喜欢用FromSpace和ToSpace来代替。这里为什么要
阅读全文
摘要:concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类: Unsafe(提供CAS操作) LockSupport(提供park/unpark操作,底层仍然调用是Unsafe类的park/unpark方法) 因此,LockSuppor
阅读全文
摘要:前言 摘自《深入理解Java虚拟机》一书 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。而在很多应用上,共享数据的锁定状态只会持续很短的一段时间。若实体机上有多个处理器,能让两个以上的线程同时并行执行,我们就可以让后面
阅读全文
摘要:CAS(Compare And Swap) 比较并交换 前言 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁。锁机制存在以下问题: 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。
阅读全文
摘要:一、synchronized 的原理 JVM 基于进入和推出Monitor对象来实现方法和同步代码块,但两者的实现细节不同。 synchronize 修饰的同步代码块:使用monitorenter 和 monitorexit 指令实现; synchronize 修饰的方法并没有 monitorent
阅读全文
摘要:锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁。JDK 1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。锁的状态保存在对象的头文件中,以32位的JDK为例。 每个对象一
阅读全文