【模块十四】分布式篇Dubbo框架篇☞参考答案

编程

一、Dubbo简介

1、是什么?

Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架

它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

2、为什么使用?

A、产生原因

随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,因此诞生了面向服务的架构体系(SOA),Dubbo这样的 布式系统的服务治理框架也随之产生。

B、作用

而dubbo在整个分布式系统的架构中,按照分层的架构来架构,使得各个层级之间最大限度的松耦合。

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      

2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

3、注册与发现原理

结构图一定要能画出来,并解释清楚每个角色,下面为Dubbo官网原理图

节点角色说明:

Container:服务运行器

Provider:暴露服务的服务提供方

Consumer:调用远程服务的服务消费方

Register:服务注册与发现的注册中心

Monitor:统计服务的调用次数和调用时间的监控中心

调用流程说明:

1.服务容器负责启动,加载,运行服务提供者。

2.服务提供者在启动时,向注册中心注册自己提供的服务。

3.服务消费者在启动时,向注册中心订阅自己所需的服务。

4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送

变更数据给消费者。

5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如

  果调用失败,再选另一台调用。

6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数

据到监控中心。

4、核心配置有哪些?

dubbo:service/

dubbo:reference/

dubbo:protocol/

dubbo:registry/

dubbo:application/

dubbo:provider/

dubbo:consumer/

dubbo:method/

5、Dubbo默认使用什么注册中心,还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

6、Dubbo推荐使用什么序列化框架,你知道的还有哪些?

推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

7、Dubbo默认使用的是什么通信框架,还有别的选择吗?

Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。

8、Dubbo有哪几种负载均衡策略,默认是哪种?

Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀;

RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题;

LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求;

ConstantHash LoadBalance: 一致性Hash策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动

9、Dubbo支持哪些协议,每种协议的应用场景,优缺点?

dubbo://(推荐),还有 hessian://, http://, webservice://, thrift://, redis://

dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议TCP,异步,Hessian序列化;

rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP。 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作。在依赖低版本的Common-Collections包,java序列化存在安全漏洞;

webservice: 基于WebService的远程调用协议,集成CXF实现,提供和原生WebService的互操作。多个短连接,基于HTTP传输,同步传输,适用系统集成和跨语言调用;

http: 基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。多个短连接,传输协议HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器JS调用;

hessian: 集成Hessian服务,基于HTTP通讯,采用Servlet暴露服务,Dubbo内嵌Jetty作为服务器时默认实现,提供与Hession服务互操作。多个短连接,同步HTTP传输,Hessian序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;

memcache: 基于memcached实现的RPC协议

redis: 基于redis实现的RPC协议

  • RPC:Remote Procedure Call 远程过程调用—实时调用

  1. 是什么?

RPC,全称为Remote Procedure Call,即远程过程调用,是一种计算机通信协议。处于网络通信协议的第五层:会话层

  1. 实现原理步骤

1、建立通信

2、服务寻址

3、网络传输

3.1、序列化

3.2、反序列化

4、服务调用

  1. 一次完整的RPC同步调用流程

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

  1. 使用到的技术

1、动态代理

        生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。

2、序列化:hessian

        为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。

* 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;

* 反序列化:将byte[]转换成Java对象的过程;

    可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack

            关于序列化工具性能比较可以参考:jvm-serializers

3、NIO

        当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

4、服务注册中心

可选技术: * Redis        * Zookeeper        * Consul        * Etcd

  1. 常用RPC框架

阿里:Dubbo

苏宁:RSF:Remote Service Framework

Facebook:Thrift

三、 Dubbo 和 Spring Cloud 有什么区别?

A.两者的模块组成

1、Dubbo主要分为服务注册中心,服务提供者,服务消费者,还有管控中心;

2、相比起Dubbo简单的四个模块,SpringCloud则是一个完整的分布式微服务框架,他有着一样的服务注册中心,服务提供者,服务消费者,管控台,断路器,分布式配置服务,消息总线,以及服务追踪等;

B.在性能上来说

由于Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合以Hession序列化完成RPC。而SpringCloud是基于Http协议+REST接口调用远程过程的,相对来说,Http请求会有更大的报文,占的带宽也会更多。

C.本质上

Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架

SpringCloud则是一个完整的分布式微服务框架

以上是 【模块十四】分布式篇Dubbo框架篇☞参考答案 的全部内容, 来源链接: utcz.com/z/512650.html

回到顶部