SOFA 源码分析 — 泛化调用】的更多相关文章

前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例如客户端没有 jar 包,或者是跨语言的调用,这个时候,就需要客户端使用字符串进行泛化调用. 如何使用 还是根据官方的例子来看一下: ConsumerConfig<GenericService> consumerConfig = new ConsumerConfig<GenericServi…
前言 在前面的 SOFA 源码分析 -- 服务发布过程 文章中,我们分析了 SOFA 的服务发布过程,一个完整的 RPC 除了发布服务,当然还需要引用服务. So,今天就一起来看看 SOFA 是如何引用服务的.实际上,基础逻辑和我们之前用 Netty 写的 RPC 小 demo 类似.有兴趣可以看看这个 demo-- 自己用 Netty 实现一个简单的 RPC. 示例代码 ConsumerConfig<HelloService> consumerConfig = new ConsumerCon…
注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了.Dubbo 服务调用过程比较复杂,包含众多步骤.比如发送请求.编解码.服务降级.过滤器链处理.序列化.线程派发以及响应请求等步骤.限于篇幅原因,本篇文章无法对所有的步骤一一进行分析.本篇文章将会重点分析请求的发送与接收.编解码.线程派发以及响应的发…
前言 SOFARPC 提供了多种调用方式满足不同的场景. 例如,同步阻塞调用:异步 future 调用,Callback 回调调用,Oneway 调用. 每种调用模式都有对应的场景.类似于单进程中的调用模式.在单进程中,我们可以使用 JDK 的 Future 实现异步,可以通过观察者实现回调. 那么,在 RPC 框架中,这些功能如何实现呢? 我们一个个开始看. 同步调用 Sync 每个 ConsumerConfig 都有一个 invokeType 属性,在 SOFA 中,对应的常量是 RpcCo…
前言 集群中通常一个服务有多个服务提供者.其中部分服务提供者可能由于网络,配置,长时间 fullgc ,线程池满,硬件故障等导致长连接还存活但是程序已经无法正常响应.单机故障剔除功能会将这部分异常的服务提供者进行降级,使得客户端的请求更多地指向健康节点.当异常节点的表现正常后,单机故障剔除功能会对该节点进行恢复,使得客户端请求逐渐将流量分发到该节点.单机故障剔除功能解决了服务故障持续影响业务的问题,避免了雪崩效应.可以减少人工干预需要的较长的响应时间,提高系统可用率. 这种功能叫做自动故障剔除.…
前言 SOFA 内置负载均衡,支持 5 种负载均衡算法,随机(默认算法),本地优先,轮询算法,一致性 hash,按权重负载轮询(不推荐,已被标注废弃). 一起看看他们的实现(重点还是一致性 hash). 源码分析 具体源码在 AbstractLoadBalancer 类中,子类需要实现 doSelect 方法: public abstract ProviderInfo doSelect(SofaRequest invocation, List<ProviderInfo> providerInf…
前言 SOFA-RPC 支持根据权重对服务进行预热功能,具体地址:预热权重. 引用官方文档: 预热权重功能让客户端机器能够根据服务端的相应权重进行流量的分发.该功能也常被用于集群内少数机器的启动场景.利用流量权重功能在短时间内对服务端机器进行预热,然后再接收正常的流量比重. 运行机制如下: 1.服务端服务在启动时会将自身的预热时间,预热期内权重,预热完成后的正常权重推送给服务注册中心.如上图 ServiceB 指向 Service Registry . 2.客户端在引用服务的时候会获得每个服务实…
前言 大部分框架都是事件订阅功能,即观察者模式,或者叫事件机制.通过订阅某个事件,当触发事件时,回调某个方法.该功能非常的好用,而 SOFA 内部也设计了这个功能,并且内部大量使用了该功能.来看看是如何设计的. 源码分析 核心类有 3 个: EventBus 事件总线 Event 事件,即被观察者 Subscriber 订阅者,即观察者 Subscriber 是个抽象类, 子类需要自己实现 onEvent 方法,即回调方法.还有一个是否同步执行的参数. EventBus 类实现了注册功能,反注册…
前言 在 SOFA-RPC 的官方介绍里,介绍了自定义线程池,可以为指定服务设置一个独立的业务线程池,和 SOFARPC 自身的业务线程池是隔离的.多个服务可以共用一个独立的线程池. API使用方式如下: UserThreadPool threadPool = new UserThreadPool(); threadPool.setCorePoolSize(10); threadPool.setMaximumPoolSize(100); threadPool.setKeepAliveTime(2…
前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 response 中放入数据进行透传,并可获取到链路中相应的数据. 使用方式: RpcInvokeContext.getContext().putRequestBaggage("key_request","value_request"); RpcInvokeContext.…