SOFA 源码分析— 自定义路由寻址】的更多相关文章

前言 SOFA-RPC 中对服务地址的选择也抽象为了一条处理链,由每一个 Router 进行处理.同 Filter 一样, SOFA-RPC 对 Router 提供了同样的扩展能力. 那么就看看 SOFA 是如何处理的. 如何使用 官方教程如下: @Extension(value = "customerRouter") @AutoActive(consumerSide = true) public class CustomerRouter extends Router { @Overr…
前言 在 SOFA-RPC 的官方介绍里,介绍了自定义线程池,可以为指定服务设置一个独立的业务线程池,和 SOFARPC 自身的业务线程池是隔离的.多个服务可以共用一个独立的线程池. API使用方式如下: UserThreadPool threadPool = new UserThreadPool(); threadPool.setCorePoolSize(10); threadPool.setMaximumPoolSize(100); threadPool.setKeepAliveTime(2…
前言 在前面的 SOFA 源码分析 -- 服务发布过程 文章中,我们分析了 SOFA 的服务发布过程,一个完整的 RPC 除了发布服务,当然还需要引用服务. So,今天就一起来看看 SOFA 是如何引用服务的.实际上,基础逻辑和我们之前用 Netty 写的 RPC 小 demo 类似.有兴趣可以看看这个 demo-- 自己用 Netty 实现一个简单的 RPC. 示例代码 ConsumerConfig<HelloService> consumerConfig = new ConsumerCon…
前言 SOFARPC 提供了多种调用方式满足不同的场景. 例如,同步阻塞调用:异步 future 调用,Callback 回调调用,Oneway 调用. 每种调用模式都有对应的场景.类似于单进程中的调用模式.在单进程中,我们可以使用 JDK 的 Future 实现异步,可以通过观察者实现回调. 那么,在 RPC 框架中,这些功能如何实现呢? 我们一个个开始看. 同步调用 Sync 每个 ConsumerConfig 都有一个 invokeType 属性,在 SOFA 中,对应的常量是 RpcCo…
前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 response 中放入数据进行透传,并可获取到链路中相应的数据. 使用方式: RpcInvokeContext.getContext().putRequestBaggage("key_request","value_request"); RpcInvokeContext.…
前言 通常 Web 服务器在处理请求时,都会使用过滤器模式,无论是 Tomcat ,还是 Netty,过滤器的好处是能够将处理的流程进行分离和解耦,比如一个 Http 请求进入服务器,可能需要解析 http 报头,权限验证,国际化处理等等,过滤器可以很好的将这些过程隔离,并且,过滤器可以随时卸载,安装. 每个 Web 服务器的过滤器思想都是类似的,只是实现方式略有不同. 比如 Tomcat,Tomcat 使用了一个 FilterChain 对象保存了所有的 filter,通过循环所有 filte…
前言 集群中通常一个服务有多个服务提供者.其中部分服务提供者可能由于网络,配置,长时间 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 框架,底层通信框架是 bolt ,基于 Netty 4,今天将通过 SOFA-RPC 源码中的例子,看看他是如何发布一个服务的. 示例代码 下面的代码在 com.alipay.sofa.rpc.quickstart.QuickStartServer 类下. ServerConfig serverConfig = new ServerConfig() .setProtocol("bolt") // 设置一个协议,默认bolt .setPort(9696)…
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入Antzscript脚本语言(写在之后). Github地址 博客中相关代码均可在Github上找到 目录 概述 从认识操作系统开始 初探Linux Linux文件系统概览 内存寻址 内存地址 逻辑地址 线性地址 物理地址 硬件的分段单元 段寄存器 段描述符 段选择符 参考 概述 可以参考我的另一篇…
1,我们前三篇博客了解了一下自定义View的基本方法和流程 从源码的角度一步步打造自己的TextView 深入了解自定义属性 onMeasure()源码分析 之前,我们只是学习过自定义View,其实自定义ViewGroup和自定义View的步骤差不了多少,他们的的区别主要来自各自的作用不同,ViewGroup是容器,用来包含其他控件,而View是真正意义上看得见摸得着的,它需要将自己画出来.ViewGroup需要重写onMeasure方法测量子控件的宽高和自己的宽高,然后实现onLayout方法…
前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例如客户端没有 jar 包,或者是跨语言的调用,这个时候,就需要客户端使用字符串进行泛化调用. 如何使用 还是根据官方的例子来看一下: ConsumerConfig<GenericService> consumerConfig = new ConsumerConfig<GenericServi…
前言 我们在之前的文章中已经稍微了解过 SOFA 的扩展机制,我们也说过,一个好的框架,必然是易于扩展的.那么 SOFA 具体是怎么实现的呢? 一起来看看. 如何使用? 看官方的 demo: 1.定义扩展点. @Extensible public interface Person { void getName(); } 2.定义扩展实现 @Extension("A") public class PersonA implements Person{ @Override public vo…
在使用SpringCloud的时候准备使用Zuul作为微服务的网关,Zuul的默认路由方式主要是两种,一种是在配置 文件里直接指定静态路由,另一种是根据注册在Eureka的服务名自动匹配.比如如果有一个名为service1的服 务,通过 http://www.domain.com/service1/xxx 就能访问到这个服务.但是这和我预想的需求还是有些差距. 网上有许多有关动态路由的实现方法,大致思想是不从Eureka拉取注册服务信息,而是在数据库里自己维护一 份路由表,定时读取数据库拉取路由…
你可能没有看过 RocketMQ 的架构图,没关系,一起来学习一下,RocketMQ 架构图如下: 在 RocketMQ 中,有四个角色: Producer:消息的生产者,每个 MQ 中间件都有. Consumer:消息的消费者,每个 MQ 中间件都有. NameServer:RocketMQ 的路由中心,跟 ZooKeeper 差不多. Broker:消息服务器,RocketMQ 的消息全部存储在这里. Producer 发送消息之前,先从 NameServer 中获取到 Broker 服务器…
一.MyBatis插件 插件是一种常见的扩展方式,大多数开源框架也都支持用户通过添加自定义插件的方式来扩展或者改变原有的功能,MyBatis中也提供的有插件,虽然叫插件,但是实际上是通过拦截器(Interceptor)实现的,在MyBatis的插件模块中涉及到责任链模式和JDK动态代理. 1. 自定义插件 首先我们来看下一个自定义的插件我们要如何来实现.https://mybatis.org/mybatis-3/zh/configuration.html#plugins 1.1 创建Interc…
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络连接呢? 我们从 SOFA 中寻找答案. 连接管理器介绍 先从一个小 demo 开始看: ConsumerConfig<HelloService> consumerConfig = new ConsumerConfig<HelloService>() .setInterfaceId(H…
[ES6解构赋值]:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment [Joi APi]:https://github.com/hapijs/joi/blob/v13.1.2/API.md…
1. 简介 上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory.服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由.上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析.首先,先来介绍一下服务路由是什么.服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者.Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter.脚本路由 ScriptR…
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetParameterValue方法中有这么一句代码: ModelBindingContext bindingContext = new ModelBindingContext() {                 FallbackToEmptyPrefix = (parameterDescriptor.Bi…
JUnit Rule简述 Rule是JUnit 4.7之后新加入的特性,有点类似于拦截器,可以在测试类或测试方法执行前后添加额外的处理,本质上是对@BeforeClass, @AfterClass, @Before, @After等的另一种实现,只是功能上更灵活多变,易于扩展,且方便在类和项目之间共享. JUnit的Rule特性提供了两个注解@Rule和@RuleClass,大体上说@Rule可以与@Before及@After对应,@ClassRule可以与@BeforeClass及@After…
RunListener简述 JUnit4中的RunListener类用来监听测试执行的各个阶段,由RunNotifier通知测试去运行.RunListener与RunNotifier之间的协作应用的是观察者模式,RunListener类充当观察者角色,RunNotifier充当通知者角色,有点类似于JDK中的事件监听器MouseListener在鼠标执行不同的操作时触发相应方法中封装的动作.RunListener监听的动作包括如下测试阶段: 所有测试开始前:调用testRunStarted()…
前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想. java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 package java.util; public interface Observer { void update(Observable o, Object arg); }  借鉴 JDK 封装方法的过多参数的方案 也十分直接,就是使用顶级父类 Object 做参数类型,然后自己可以定义一个参数封装的类…
转载:https://blog.csdn.net/neven7/article/details/50782451 0.背景 性能测试工具nGrinder支持在无需修改源码的情况下,对目标服务器收集自定义数据,最多支持5类: 在性能测试详细报告页,目标服务器->你的机器ip便签页下,默认只收集CPU, Memory, Received Byte/s, Sent Byte Per Secode/s等4类数据: 可能你还需要监控其它的性能统计数据,用于分析(比如load, Full Gc):本文先介绍…
我们知道,在 Laravel 世界里,外界传进来一个 Request 时,会被 Kernel 处理并返回给外界一个 Response.Kernel 在处理 Request 时,会调用 illuminate/routing 包提供的路由功能,来根据当前的 Request,转发到对应的执行逻辑(执行逻辑的形式可以为 Closure 或 Controller@Action).同时,在进入执行逻辑之前和之后,还会依次进入 Middlewares 的前置和后置处理.所以,一个 Request 由 Kern…
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑][下文简称(五),请先阅读完(五)再阅读本文],我们通过示例和log来分析了Android的事件分发机制.这些,我们只是看到了现象,如果要进一步了解事件分发机制,这是不够的,我们还需要透过现象看本质,去研究研究源码.本文将从源码(基…
一.简要说明 文章信息: 基于的 ABP vNext 版本:1.0.0 创作日期:2019 年 10 月 23 日晚 更新日期:暂无 ABP vNext 针对用户可编辑的配置,提供了单独的 Volo.Abp.Settings 模块,本篇文章的后面都将这种用户可变更的配置,叫做 参数.所谓可编辑的配置,就是我们在系统页面上,用户可以动态更改的参数值. 例如你做的系统是一个门户网站,那么前端页面上展示的 Title ,你可以在后台进行配置.这个时候你就可以将网站这种全局配置作为一个参数,在程序代码中…
前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了Flask服务的启动流程,今天我们来看下路由的内部实现机理. Flask系列文章: Flask开发初探 Flask源码分析一:服务启动 关于路由 所谓路由,就是处理请求URL和函数之间关系的程序. Flask中也是对URL规则进行统一管理的,创建URL规则有两种方式: 使用@app.route修饰器…