zoukankan      html  css  js  c++  java
  • Dubbo笔记

    第1章 网络通信协议
    1.1 文本协议与二进制协议
    ①文本协议:由一串ACSII字符组成的数据。
    优点:容易理解,方便调试。
    缺点:传输效率低(增加冗余字符用来分割);很难传输二进制文件如图片;解析复杂(需要字符串比较)。
    ②二进制协议:一串字节流,通常包括消息头(header)和消息体(body),消息头的长度固定,并且消息头包括了消息体的长度。
    优点:传输高效(没有冗余字段);解析方便(固定长度,直接比较字节)。
    缺点:定义严格(哪个位置是什么意义),场景单一,难理解(自然加密)。
     
     
    第2章 服务访问
    2.1 RPC、SOA和REST
    WebService:服务器如何向客户端提供服务,常用的方法有如下三种:
    ①PRC:远程过程调用,面向方法。即像调用本地服务方法一样调用服务器的服务方法。
    通常的实现有 XML-RPC , JSON-RPC,SOAP。
    ②SOA:面向服务的架构,面向消息。
    ③REST:Representational state transfer,表现层状态转换,面向资源。
    REST不是一种协议,它是一种架构, 一种 Web Service 能够如果满足REST的几个条件, 通常就称这个系统是 Restful 的。
    REST 的三个要素是:唯一的资源标识、简单的方法 (此处的方法是个抽象的概念)、一定的表达方式。
    REST是以资源为中心,名词即资源的地址,动词即施加于名词上的一些有限操作,表达是对各种资源形态的抽象。
    以HTTP为例, 名词即为URI(统一资源标识), 动词包括POST, GET, PUT, DELETE等(还有其它不常用的2个,所以 整个动词集合是有限的), 资源的形态(如text, html, image, pdf等)。
     
    2.2 RPC与REST的区别
    ①RPC以动词为中心,而REST以名词为中心。
    ②RPC使用基于TCP的高性能二进制协议,与实现语言依赖和高耦合,而REST基于HTTP文本协议,跨平台跨语言。
    ③RPC传输高效,适合企业内部系统,而REST适合企业对外发布服务。
     
    2.3 SOA与微服务的区别
     
     
    第3章 Dubbo服务框架
    3.1 Dubbo简介
    dubbo:阿里开源的一个java高性能服务框架,服务发布与调用采用RPC,与Spring集成。
    dubbox:当当网对dubbo的扩展,支持REST风格,支持Kryo和FST序列化实现,升级Spring至3.0。
    Spring Cloud:基于Spring Boot,提供业界标准的一套微服务架构解决方案。比如:配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态等。
     
    dubbo与spring cloud的区别:
     
    3.2 Dubbo架构组成
    节点角色说明:
    Provider:暴露服务的服务提供方。
    Consumer: 调用远程服务的服务消费方。
    Registry:服务注册与发现的注册中心。
    Monitor: 统计服务的调用次调和调用时间的监控中心。
    Container: 服务运行容器。
     
    调用关系说明:
    1、服务容器负责启动,加载,运行服务提供者。
    2、服务提供者在启动时,向注册中心注册自己提供的服务。
    3、服务消费者在启动时,向注册中心订阅自己所需的服务。
    4、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    5、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
     
    3.3 Dubbo特性
    dubbo特性有:连通性、健壮性、伸缩性、升级性。
    (1)连通性
    注册中心:负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
    监控中心:负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示。
    服务提供者:向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销。
    服务消费者:向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销。
    注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外。
    注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。
    注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。
     
    (2)健壮性
    监控中心宕掉不影响使用,只是丢失部分采样数据。
    数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务。
    注册中心是对等集群,任意一台宕掉后,将自动切换到另一台。注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。
    服务提供者无状态,任意一台宕掉后,不影响使用。服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。
     
    (3)伸缩性
    注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心。
    服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
     
    (4)升级性
    当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。
     
    3.4 Dubbo调用方式
    异步调用:dubbo基于NIO的非阻塞实现并行异步调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
    3.5 Dubbo注册中心
    dubbo提供的注册中心有4种类型:
    ①Multicast注册中心
    ②Zookeeper注册中心
    ③Redis注册中心
    ④Simple注册中心
     
    3.6 Dubbo远程通信协议
    dubbo支持的远程通信协议如下:
    ①Mina
    ②Netty
    ③Grizzly
     
    3.6 Dubbo远程调用协议
    dubbo支持的远程调用协议如下:
    ①Dubbo协议
    ②Hessian协议
    ③HTTP协议
    ④RMI协议
    ⑤WebService协议
    ⑥Thrift协议
    ⑦Memcached协议
    ⑧Redis协议
     
    3.7 Dubbo集群容错
    集群容错:在集群调用失败时,Dubbo提供了多种容错方案如下:(默认为failover重试)
    ①Failover
    失败自动切换,当出现失败,重试其它服务器。为默认容错方案。通常用于读操作,但重试会带来更长延迟。可通过retries=“2”来设置重试次数(不含第一次)。
    Failfast
    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
    Failsafe
    失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
    ④Failback
    失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
    ⑤Forking
    并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks=“2”来设置最大并行数。
    ⑥Broadcast
    广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)。通常用于通知所有提供者更新缓存或日志等本地资源信息。
     
    3.8 Dubbo负载均衡
    dubbo负载均衡策略有4种,分别如下:
    ①Random,随机,按权重设置随机概率。
    在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
    ②RoundRobin,轮循,按公约后的权重设置轮循比率。
    存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
    ③LeastActive,最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
    使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
    ④ConsistentHash,一致性Hash,相同参数的请求总是发到同一提供者。
    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
     
    3.8 Dubbo内核实现&SPI
    dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去通过SPI机制实现,jdk通过ServiceLoader类实现spi机制的服务查找功能。
     
    SPI:是一种服务发现机制,可以不需要修改代码,就能将接口从一种实现更改成另一种实现,满足可插拔原则,实现服务插件化。
    当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件内容就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里指定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader。
    例如:(该文件内容仅有一行文本:com.ywsc.fenfenzhong.spi.learn.FileSearch)
     
  • 相关阅读:
    如何知道交换机的某port接入端的IP地址
    列举系统安装的所有可用的数据库提供程序
    重建需要为人民服务
    示例DataSet的构成组件,手工打造DataSet
    2009年7月31日笔记本又换了 thinkpad w500rq3
    Python体验(04)字典dictionary
    la la love on my mind
    类的继承和封装
    Oracle10gR2在Ubuntu10.10下的安装配置及链接测试
    大容量数据传输UI无响应怎么办:异步查询大结果集!
  • 原文地址:https://www.cnblogs.com/fhwup/p/8587638.html
Copyright © 2011-2022 走看看