Dubbo

解Bug之路-dubbo应用无法重连zookeeper

ⅰ亾dé卋堺 提交于 2020-04-07 10:40:16
前言 dubbo是一个成熟且被广泛运用的框架。饶是如此,在某些极端条件下基于dubbo的应用还会出现无法重连zookeeper的问题。由于此问题容易导致比较大的故障,所以笔者费了一番功夫去定位,现将排查过程写成博文分享出来。 Bug现场 这是一起在测试环境出现的故障。起因是网工做交换机切换演练,可能由于姿势不对,使得断网的时间从预估的秒级达到了分钟级。等网络恢复后,测试环境就炸开了锅,基本上所有应用再也无法提供服务,在dubbo控制台上也看不到任何提供者,他们和zk的连接都断开而且似乎完全没有重连的迹象。如下图所示: 无法快速恢复 为了不影响测试的进度,运维同学紧急进行了重启,但坑爹的是大部分系统都有启动依赖,盲目的重启只会因为xxx provider不存在而无法启动。只能从最基础的服务开始重启,慢慢恢复。如下图所示: 还好只是测试环境,但为了不让产线出现这种问题,必须一查到底,把这个Bug揪出来。 着手排查 模拟zookeeper连接断开 测试环境的好处是我们可以用各种手段去模拟复现,而不用和处理产线一样到处寻找蛛丝马迹然后进行逻辑推理(推理是一个非常烧脑的过程)。于是笔者联系了SA同学,通过iptables进行线下的断网模拟。命令如下所示: // 禁用本机和zk三台机器的流量进出 iptables -A INPUT -s zk-1-ip/32 -j DROP iptables

从头开始搭建一个dubbo+zookeeper平台

狂风中的少年 提交于 2020-04-07 07:34:39
本篇主要是来分享从头开始搭建一个dubbo+zookeeper平台的过程,其中会简要介绍下dubbo服务的作用。 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程。 其次,当服务越来越多之后,我们需要做哪些服务治理? 最后,是dubbo的架构图 注册中心的选择 dubbo支持多种类型的注册中心: Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 这里我们选择zookeeper,其实类型的优点缺点可详细查看文档。 1:zookeeper的安装,还是采用docker这一招鲜的run命令来安装zookeeper docker run -dit --name zookeeper --hostname zookeeper-host -v /data:/data -p 2181:2181 jplock/zookeeper:latest 2:安装zkui,可以参考zkui的项目地址来安装,它提供了一个管理界面,可以针对zookeepr的节点值进行CRUD操作,同时也提供了安全认证,按照如下几步就可以完成安装。 mvn clean install,执行前需要安装java环境,maven环境,执行成功后会生成一个jar文件。 将config.cfg复制到上一步生成的jar文件所在目录

Dubbo负载均衡 

痞子三分冷 提交于 2020-04-07 03:11:40
Dubbo负载均衡 dubbo在集群负载均衡时,提供了多种均衡策略,缺省值为random随机调用。 通过设置loadbalance=”“来设置负载均衡 有一下几种设置: 1.random 随机,按权重设置随机概率。 2.roundrobin 轮循,按公约后的权重设置轮循比率。 3.leastActive 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 4.consustentHash .一致性Hash,相同差数的请求总是发到同一提供者。 来源: oschina 链接: https://my.oschina.net/u/1455528/blog/798251

dubbo的负载均衡的几种算法

别等时光非礼了梦想. 提交于 2020-04-06 23:49:35
Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见: http://en.wikipedia.org/wiki/Consistent_hashing 。 缺省只对第一个参数Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用160份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes" value="320" /> 这几种算法是很常见的

Dubbo 部署

馋奶兔 提交于 2020-04-06 20:54:19
Dubbo安装只需要安装注册中心即可,Monitor不影响Dubbo使用,此处以zookeeper为例。 1. 安装zookeeper注册中心 wget http://www.apache.org/dist//zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz tar vxf zookeeper-3.4.9.tar.gz mv zookeeper-3.4.9 zookeeper cd zookeeper/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg dataDir=/usr/local/zookeeper/data cd ../bin ./zkServer.sh start ./zkServer.sh stop 2. 安装管理中心 下载war包:dubbo-admin-2.5.4.war 将dubbo-admin-2.5.4.war部署到Tomcat下,并启动Tomcat 打开 localhost:8080/dubbo-admin-2.5.4/ 管理注册中心 来源: oschina 链接: https://my.oschina.net/u/2950586/blog/761111

dubbo-admin 安装

…衆ロ難τιáo~ 提交于 2020-04-06 20:53:32
网上也能找到一些dubbo-admin的war包,但还是想亲自尝试一下。 dubbo-admin,也叫dubbo的管理控制台。 我在360网盘也上传了一个dubbo-admin包: https://yunpan.cn/cux9tTnqDUzQQ 访问密码 0094 这里根据源码下载、打包、安装。 前提:安装了git和maven;有一个注册中心,可以在本地安装一个zookeeper, 详见 zookeeper安装 。 1、下载源码:git clone https://github.com/alibaba/dubbo.git 2、编译打包: cd dubbo/dubbo-admin mvn clean install -DskipTests=true 3、使用jetty跑起来,mvn jetty:run -Ddubbo.registry.address=zookeeper://127.0.0.1:2181 使用jetty跑,只是为了演示。真正还是需要将dubbo-admin目录丢到指定的容器里面跑, 进入tagrget目录,将看到dubbo-admin-2.5.4-SNAPSHOT目录,当前dubbo的版本是2.5.4-SNAPSHOT, 运行配置见dubbo-admin-2.5.4-SNAPSHOT/WEB-INF/dubbo.properties,内容如下,可以配置注册中心

Dubbo 服务暴露与引用

妖精的绣舞 提交于 2020-04-06 20:18:16
1. Provider暴露服务 provider.xml配置: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xdi:schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="aaron-user-app" /> <!— 使用zookeeper暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient"/> <!--

漫画 | Redis常见面试问题

喜夏-厌秋 提交于 2020-04-06 19:46:55
最近,在为接下来的一场面试做准备,其中的内容包括redis,而且redis是重点内容。 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它支持存储的类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。 #!/usr/bin/env python3 import redis import sys import time r = redis.StrictRedis(host=’127.0.0.1′, port=6379, db=0) try: id = sys.argv[1] except: print(‘input argument error’) sys.exit(0) if r.llen(id) >= 5 and time.time() – float(r.lindex(id, 4)) <= 3600: print(“you are forbidden logining”) else: print(‘you are allowed to login’) r.lpush(id, time.time()) # login

dubbo消费者调用流程

有些话、适合烂在心里 提交于 2020-04-06 19:44:41
dubbo相关 说明 (官方): 在RPC中,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filter拦截点。 图中的Consumer和Provider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用Client和Server的原因是Dubbo在很多场景下都使用Provider, Consumer, Registry, Monitor划分逻辑拓普节点,保持统一概念。 而Cluster是外围概念,所以Cluster的目的是将多个Invoker伪装成一个Invoker,这样其它人只要关注Protocol层Invoker即可,加上Cluster或者去掉Cluster对其它层都不会造成影响,因为只有一个提供者时,是不需要Cluster的。 Proxy层封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用Proxy将Invoker转成接口,或将接口实现转成Invoker,也就是去掉Proxy层RPC是可以Run的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。 而Remoting实现是Dubbo协议的实现,如果你选择RMI协议,整个Remoting都不会用上

Dubbo 源码分析

风格不统一 提交于 2020-04-06 17:40:38
开篇 前面用了4 篇文章分析了 Dubbo SPI 的几种用法以及如何在 Dubbo 中应用的, Dubbo SPI 使用方法(一)- 扩展点自动包装 Dubbo SPI 使用方法(二)- 扩展点自适应 Dubbo SPI 使用方法(三)- 扩展点自动装配 Dubbo 源码分析 - Dubbo SPI 在 Protocol 层 的应用 本文通过调试 Dubbo2.7.x 源码分析 如何通过 getExtension(name) 获取一个扩展对象实例 。 正文 回顾一下 Dubbo SPI 的最基本的用法 public class App { public static void main( String[] args ) { // 第一步 ExtensionLoader<HelloService> extensionLoader = ExtensionLoader.getExtensionLoader(HelloService.class); // 第二步 HelloService helloService = extensionLoader.getExtension("helloService"); // 第三步 helloService.sayHello("xiaoming"); } } 我们直接从第二步 debug 进入 getExtension(name) 方法 1.