作者:zhaohui

Java SPI机制分析

SPI概述 SPI全称为(Service Provider Interface) ,是JDK内置的一种服务提供发现机制;主要被框架的开发人员使用,比如java.sql.Driver接口,数据库厂商实现此接口即可,当然要想让系统知道具体实现类的存在,还需要使用固定的存放规则,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类;下面以JDBC为实例来进行具体的分析。 JDBC驱动 1.准备驱动包 分别准备了mysql,postgresql和sqlserver,可以打开jar,发现每个jar包的META-IN…

阅读全文 »

Dubbo分析之Registry层

前言 紧接上文Dubbo分析之Cluster层,本文继续分析dubbo的register层;此层封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory, Registry, RegistryService; Registry接口 接口定义如下: 主要提供了注册(register),注销(unregister),订阅(subscribe),退订(unsubscribe)等功能;dubbo提供了多种注册方式分别是:Multicast ,Zookeeper,Redis以及Simple方式; Multicast:Multicast注册中心不需要启动任何中心节点,只要广播…

阅读全文 »

Dubbo分析之Cluster层

前言 紧接上文Dubbo分析之Protocol层,本文继续分析dubbo的cluster层,此层封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster, Directory, Router, LoadBalance; Cluster接口 整个cluster层可以使用如下图片概括: 各节点关系: 这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息; Directory代表多个Invoker,可以把它看成List ,但与List不同的是,它的值可能是动态变化的,比如注册中…

阅读全文 »

Dubbo分析之Protocol层

前言 紧接着上文Dubbo分析之Exchange层,继续分析protocol远程调用层,官方介绍:封装RPC调用,以Invocation, Result为中心,扩展接口为Protocol, Invoker, Exporter; Protocol接口类分析 Protocol可以说是Dubbo的核心层了,在此基础上可以扩展很多主流的服务,比如:redis,Memcached,rmi,WebService,http(tomcat,jetty)等等;下面看一下接口类源码: 主要定义了2个接口,一个是暴露远程服务,另一个是引用远程服务,其实就是服务端和客户端;dubbo提供了对多种服务的扩展,可以查看M…

阅读全文 »

Dubbo分析之Exchange 层

系列文章 Dubbo分析Serialize层 Dubbo分析之Transport层 Dubbo分析之Exchange 层 前言 紧接着上文Dubbo分析之Transport层,本文继续介绍Exchange层,此层官方介绍为信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer;下面分别进行介绍 Exchanger分析 Exchanger是此层的核心接口类,提供了connect()和bind()接口,分别返回ExchangeClien…

阅读全文 »

Dubbo分析之Transport层

前言 上一篇文章Dubbo分析之Serialize层,介绍了最底层的序列化/反序列化层,本文继续分析Serialize层的上一层transport网络传输层,此层使用了现有的一些通讯开源框架(ex:netty,mina,grizzly)来做底层通讯,上文也做了简单介绍,本文将做更深入的了解; Transporter类分析 dubbo为通讯框架提供了统一的bind和connet接口,方便进行管理和扩展,封装在接口类:Transporter中: 提供了bind和connect接口,分别对应这服务器端和客户端,具体有哪些实现类,如下图所示: 以默认使用的netty框架为例,代码如下: 具体的服务器端…

阅读全文 »

关于Jackson默认丢失Bigdecimal精度问题分析

问题描述 最近在使用一个内部的RPC框架时,发现如果使用Object类型,实际类型为BigDecimal的时候,作为传输对象的时候,会出现丢失精度的问题;比如在序列化前为金额1.00,反序列化之后为1.0,本身值可能没有影响,但是在有些强依赖金额的地方,会出现问题; 问题分析 查看源码发现RPC框架默认使用的序列化框架为Jackson,那简单,看一下本地是否可以重现问题; 1.准备数据传输bean 为了更好的看出问题,分别准备了2个bean; 2.准备测试类 分别对Bean1和Bean2进行序列化和反序列化操作,然后查看结果; 3.显示结果 4.结果分析 结果可以发现两个问题: 1.在序列化的…

阅读全文 »

Dubbo分析Serialize层

Dubbo整体设计 关于Dubbo的整体设计可以查看官方文档,下图可以清晰的表达Dubbo的整体设计: 1.图例说明 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口; 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系; 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类; 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法; 2.各层说明 config 配置层:对外配置接口…

阅读全文 »