一、dubbo是什么?

dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案。说白了其实dubbo就是一个远程调用的分布式框架。

二、dubbo的核心服务是什么?

Dubbo的作用以及介绍

特性 描述
透明远程调用 就像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入;
负载均衡机制 Client端LB,可在内网替代F5等硬件负载均衡器;
容错重试机制 服务Mock数据,重试次数、超时机制等;
自动注册发现 注册中心基于接口名查询服务提 供者的IP地址,并且能够平滑添加或删除服务提供者;
性能日志监控 Monitor统计服务的调用次调和调用时间的监控中心;
服务治理中心 路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等手动配置。
自动治理中心 无,比如:熔断限流机制、自动权重调整等;

三、看一下dubbo架构图

四、服务提供者暴露一个服务的详细过程:

如果你仔细观察dubbo的启动日志你会发现,dubbo的provider启动主要是以下几个过程

1.首先provider启动时,先把想要提供的服务暴露在本地。

2.然后再把服务暴露到远程。

3.启动netty服务,建立长连接。

4.连接到注册中心zk上。

5.然后监控zk上的消费服务。

五、服务消费者消费一个服务的详细过程

首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口。

六、下面来看本地暴露于远程暴露的区别:

本地暴露是暴露在本机JVM中,调用本地服务不需要网络通信.

远程暴露是将ip,端口等信息暴露给远程客户端,调用远程服务时需要网络通信.

七、什么情况下适用dubbo协议,什么时候适用rmi协议?

Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是dubbo协议是官网推荐使用的,dubbo 缺省协议是dubbo协议,采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。RMI协议采用阻塞式(同步)短连接和 JDK 标准序列化方式。适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。后面会对其他几种协议详细介绍,这里就不赘述了。

八、Dubbo主要的配置项有哪些,作用是什么?

provider配置

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />

consumer配置

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />

九、Dubbo有几种容错机制

什么是容错机制?容错机制指的是某中系统控制在一定范围的一种允许或包容犯错情况的发生,举个简单的例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统回弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。

在分布式架构下,网络,硬件,应用都可以发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的某一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果

1.failsafe 失败安全,可以认为是把错误吞掉(记录日志)

2.failover(默认)  重试其他服务器;retries(2)重试的次数,默认为2次

3.failback   失败后自动恢复

4.forking forks. 设置并行数

5.Broadcast 广播,任意一台报错,则执行的方法报错,通过cluster方式,配置制定的容错方案

十、dubbo的服务降级

降级的目的是为了保证核心服务可用

降级可以有几个层面的分类:自动降级,人工降级;按照功能可以分为:读服务降级和写服务降级;

1.对一些非核心服务进行人工降级,在大促之前通过降级开关关闭那些推荐内容,评价等对主流程序没有影响的功能

2.故障降级,比如调用的远程服务挂了,网络故障,或者RPC服务返回异常。那么可以直接降级,降级的方案比如设置默认值,采用兜底数据(系统推荐的行为广告挂了,可以提前准备静态页面做返回)等等

3.限流降级,在秒杀这种流量比较集中并且流量特别大的情况下,因为突发访问量特别大可能导致系统支撑不了。这个时候可以采用限流来限制访问量。当达到阈值时,后续的请求被降级,比如进入排队页面,比如跳转到错误页面(活动火爆,请稍后重试)

Dubbo的降级方式:Mock

实现步骤

1.在client端创建一个testmock类,实现对应的IGphello的接口(需要对哪个接口进行mock,就实现哪个)名称必须以mock结尾

2.在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的testmock

3.模拟错误(设置timeout)模拟超时异常,运行测试代码即可访问到testmock这个类,当服务端故障解除以后,调用过程将恢复正常

十一、dubbo的优先级配置

配置优先级别

1.以timeout为例,显示了配置的查找顺序,其他retries,loadbalance等类似。

(1)方法级优先,接口级次之,全局配置在次之

(2)如果级别一样,则消费方优先,提供方次之

(3)其中,服务提供方配置,通过URL经由注册中心传递给消费方

2.建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。

dubbo高可用之zookeeper宕机、Dubbo直连、负载均衡、服务降级、集群容错

1. zookeeper宕机

我们接下来讨论一下如果zookeeper宕机对我们的服务提供者消费者有什么影响

现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。

原因

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

高可用:通过设计,减少系统不能提供服务的时间

例子:

我们在消费者中睡眠20秒,然后我们在这20秒时间内停掉注册中心,看看第二次消费能否成功

public class App
{ public static void main( String[] args ) throws Exception
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "classpath:customer.xml" });
final IUserService demoService = (IUserService) context.getBean("userService");
System.out.println(demoService.getUser());
System.out.println("程序运行第一次......");
Thread.sleep(1000*20);
System.out.println(demoService.getUser());
System.out.println("程序运行第二次......");
System.in.read(); }
}

接下来我们一次启动服务提供者 消费者 然后停掉服务注册中心

可以看到

我们的服务消费者在注册中心宕机后让然可以调用服务提供者提供的服务。但是注册中心宕机后我们不能再注册新的服务。

2. Dubbo直连

在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。

注意 为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。我们可以在开发的时候使用此方式进行调试

<dubbo:reference id="userService" interface="com.yz.dubbo.api.IUserService" check="false" version="1.0.0" url="dubbo://127.0.0.1:20882"></dubbo:reference>

我们启动我们的服务注册中心与服务提供者消费

发现我们的消费者并没有注册到服务注册中心,但是我们仍然可以调用服务提供者提供的服务

我们实现了跨注册中心 直连服务提供者

3. 负载均衡

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

负载均衡策略

  • Random LoadBalance

    随机,按权重设置随机概率。

  • RoundRobin LoadBalance

    轮询,按公约后的权重设置轮询比率。

  • LeastActive LoadBalance

    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  • ConsistentHash LoadBalance

    一致性 Hash,相同参数的请求总是发到同一提供者。

接下来我们测试一下默认的随机方式

<dubbo:service interface="com.yz.dubbo.api.IUserService" ref="userService1" version="1.0.0" loadbalance="random"></dubbo:service>

我们启动多个服务提供者,并指定不同的端口号,在实现中通过来区分不同的提供者

System.out.println("被调用了1............");
System.out.println("被调用了2............");

接下来我们启动多个服务提供者来模拟,并通过Admin控制台中的 倍权 半权 来调节权重 ,结果如下

接下来我们启动服务消费者模拟消费者多次消费

我们模拟了六次可以看到控制台输出

被调用了0............
被调用了0............
被调用了1............
被调用了0............
被调用了0............
被调用了0............

实现了调用多个服务提供者,并实现了负载均衡

4. 服务降级

当我服务器的压力比较大的时候,我们可以通过服务降级功能 临时屏蔽某个出错的非关键服务,并定义降级后的返回策略,屏蔽掉不重要的服务如广告服务等,来降低核心业务的压力

  • mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  • 还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

我们可以直接在Admin控制台来操作服务降级,服务消费者中的屏蔽相当于不发起远程调用,

容错相当于对该服务的方法调用在失败后,再返回 null 值

屏蔽

我们屏蔽我们的应用yzcustomer

发现提供者并没有调用且返回null

容错

我们容错我们的应用yzcustomer,并手动使我们的提供者出错,启动服务提供者和消费者

发现在调用服务提供者出错时,返回null

5. 集群容错

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

Failover Cluster

失败自动切换,当出现失败,重试其它服务器 。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster

失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

集群模式配置

按照以下示例在服务提供方和消费方配置集群模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />

最新文章

  1. 三、oracle数据库成功安装步骤 Oracle数据源配置
  2. [SharePoint 2013] Automatic deployment script
  3. 不安装Oracle客户端情况下使用PL/SQL 远程连接数据库
  4. Linux下OpenSSL的安装与使用
  5. Openwrt 初探
  6. [转帖] CvMat,Mat和IplImage之间的转化和拷贝
  7. CSS也可以改变图片幅面尺寸
  8. 简述tcp协议对http性能的影响及优化
  9. WPF中动态更新TextBlock文字中的超链接,文本
  10. Sicily 4495. Print permutations
  11. [置顶] Java开源代码研究总结
  12. laravel sum 多个字段
  13. HashMap中的散列函数、冲突解决机制和rehash
  14. WPF:间接支持虚拟化的ListBox
  15. C#基础知识总结(五)
  16. scrapy中的xpath用法和css的用法
  17. OOP和面向对象
  18. C语言 二维数组(指针)动态分配和释放(转)
  19. c#:对两个字符串大小比较(不使用c#/java内部的比较函数),按升序排序
  20. Logistic回归分析简介

热门文章

  1. bzoj2521 [Shoi2010]最小生成树
  2. Python基础篇(格式化输出,运算符,编码):
  3. EnumPrinters
  4. Linux下tree的使用介绍
  5. Tornado中异步框架的使用
  6. spring 获取url参数
  7. Mybatis配置——自动使用驼峰命名 属性映射字段(默认为false)
  8. Mysql学习笔记(003)-案例讲解基础查询
  9. 【leedcode】950. Reveal Cards In Increasing Order
  10. PHP curl_pause函数