Dubbo初识-入门
Apache Dubbo是一个分布式服务框架,于2019年5月,正式称为Apache的顶级项目。前身于2012年开源,但是2014年停止维护,所幸阿里巴巴2017年9月重新对Dubbo启动了维护并长期投入规划。
Apache Dubbo主要实现了多个系统之间的高性能、透明化调用,是一个RPC框架,不过相比普通RPC框架,它还提供了服务治理功能,如服务注册、监控、容错、路由等。
Apache Dubbo提供不仅限于如下功能:
- 面向接口代理的高性能RPC调用:服务以接口为力度,屏蔽远程调用底层细节;
- 智能负载均衡:内置多种负载均衡策略,智能感知节点健康状况,减少调用延迟,提升吞吐;
- 服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知;
- 高度可扩展能力:遵循微内核+插件的涉及原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现与第三方实现;
- 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,实现灰度发布、同机房优先等功能;
- 可视化的服务治理与运维:提供丰富治理、运维工具,随时查询服务元数据、服务建康状态及调用统计,实施下发路由策略、调整配置参数。
部署架构
- 注册中心:协调Consumer与Provider之间的地址注册于发现。
- 配置中心
- 存储Dubbo启动阶段的全局配置,保证配置的跨环境共享与全局一致性;
- 负责服务治理规则(路由规则、动态配置等)的存储与推送;
- 元数据中心
- 接收Provider上报的服务接口元数据,未Admin等控制台提供运维能力(如服务测试、接口文档等);
- 作为服务发现机制的补充,提供额外的接口/方法级别的配置信息的同步能力,相当于注册中心的额外扩展;
上述三个中心并不是运行Dubbo的必要条件。
从Apache Dubbo架构图可以清晰的看出,除了基本的RPC框架的只能,它的核心功能便是监控以及服务注册。
服务发现的一个核心组件是注册中心,Provider注册地址到注册中心,Consumer从注册中心读取和订阅Provider地址列表,因此,要启用服务发现,需要为Dubbo增加注册中心配置。如果不需要,可以设置未N/A,Dubbo支持多种注册中心,比如Zookeeper、Nacos、Consul等。Dubbo自身也提供了多种注册中心组件的对接。
以dubbo-spring-boot-starter使用方式为例,可如下增加注册中心配置:
# application.properties
dubboregistryaddress: zookeeper://127.0.0.1:2181
Dubbo3相比于Dubbo2引入了全新的服务发现模型——应用级服务发现,在工作原理、数据格式上不能兼容。
- Dubbo3应用级服务发现,以应用力度组织地址数据
- Dubbo2接口级服务发现,以接口力度组织地址数据
Dubbo3格式的Provider地址不能被Dubbo2的Consumer识别到,反之Dubbo2的消费者也不能订阅到Dubbo3 Provider。
应用级服务发现:
主要有以下优势:
- 适配云原生微服务变革。像Kubernetes等平台都继承了微服务概念抽象,Dubbo3的应用级服务发现是适配各种微服务体系的通用模型;
- 提升性能与可伸缩性,支持超大规模集群的服务治理。从本质上解决了注册中心地址数据的存储与推送压力,相应的Consumer侧的地址计算压力也成数量级下降。
配置参数
- dubbo:application
描述提供方的应用信息,比如应用名称、维护人、版本等,其中名称是必填项。
- dubbo:registry
配置注册中心地址,如果不需要可以设置为N/A,支持多种注册中心。
- dubbo:protocol
协议信息,默认采用Dubbo协议,还可选择如Hessian、Webservice、Thrift等。
- dubbo:service
发布的服务接口描述,interface表示接口,ref表示接口实现。
集群容错
当服务调用这调用服务提供者的接口时,如果因为网络等问题出现请求失败,为了应对这种情况而实现的机制,叫做集群容错。Dubbo提供了6中容错模式,默认为Failover Cluster。
- Failover Cluster:失败自动切换到集群中的其他机器进行重试,默认重试次数为2,可通过属性retries=2来修改,但是越大,响应延迟就越高,通常用于读操作,因为事务型操作会带来数据重复问题。
- Failfast Cluster:快速失败,即失败后立即报错,只发起一次调用,通常用于一些幂等的写操作,避免结果不确定的情况下出现数据重复问题。
- Failsafe Cluster:失败安全,出现异常时,直接忽略异常。
- Failback Cluster:失败后自动回复,在后台记录失败请求,定时重新发起。这种适用于消息通知操作,保证最终能发送成功。
- Forking Cluster:并行调用集群中的多个服务,只要其中一个成功就返回,可以通过forks=2修改最大并行数。
- Boardcast Cluster:广播模式。任意一个服务报错则表示服务调用失败。常用于通知所有服务提供者更新缓存或者更新本地资源。
配置方式,如下:
@Service(cluster="failfast") public class UserServiceImpl implements IUserService{@Value("${dubbo.application.name}")private String serviceName;@Overridepublic String getUserDetail(Stirng name){return String.format("[%s]:Hello,%s, detail info is not found.",serviceName,name)} }
在实际应用中,查询语句容错建议使用默认的Failover Cluster,而增删改操作建议使用Failfast Cluster或者使用Failover Cluster(retries="0")的策略,防止出现重复数据问题。
建议在涉及接口的时候把查询接口方法单独做成一个接口提供查询。
如果上述六种容错模式不能满足要求,也可以自行扩展。
负载均衡
负载均衡可以分为硬件负载(F5)和软件负载(Nginx)。
在Dubbo中提供了四种负载均衡策略,默认是random。同样如果四种不能满足要求,也可以基于Dubbo的SPI机制来进行拓展。
- Random:随机算法,可以针对性能较好的服务器设置较大的权重值,权重值与随机概率成正比。
- RoundRobin:轮询。按照公约后的权重设置轮询比例。
- LeastActive:最少活跃调用数,处理较慢的节点将会收到更少的请求。
- ConsistentHash:一致性hash。相同参数的请求总是发送到同一个服务提供者。
配置方式,如下:
@Service(cluster="failfast",loadbalance="roundrobin")
服务降级
服务降级是一种系统保护策略。当服务器访问压力较大时,可以把一些不必要的功能在流量较大的时间段关闭。
有多个层面的分类:
- 按照是否自动化可分为自动降级和人工降级
- 按照功能可分为读服务降级和写服务降级
人工降级一般具有一定的前置性,比如关闭评价、推荐等。
而系统降级多是由于系统出现了某些异常而自动触发的“兜底的流畅”,比如:
- 故障降级,调用的远程服务“挂了”,网络故障或者RPC服务返回异常,在业务允许的情况下可以通过设置兜底数据相应给客户端;
- 限流降级,当流量达到阙值时,后续的请求会被拦截,这类请求可以进入排队系统,比如12306,也可以直接返回降级页面,比如稍后重试等。
Dubbo提供了一种Mock配置来实现服务降级,也就是说服务提供方出现网络异常无法访问,客户端不抛出异常,而是通过降级配置返回兜底数据,操作步骤如下:
- 创建实现自动降级的接口的类,重写接口中的抽象方法实现本地数据的返回。
public class MockHelloService implements IHelloService{@Overridepublic String sayHello(String s){return "Sorry,服务暂时无法访问,返回降级数据.";} }
- 修改@Reference注解增加Mock参数,其中设置了属性cluster="failfast"
@RestController public class HelloController{@Reference(mock="com.socool.mock.MockHelloService",cluster="failfast")private IHelloService helloService;@GetMapping("/say")public String sayHello(){return helloService.sayHello("socool");} }
- 在不启动Dubbo服务端或者服务端返回的数据超过默认的超时时间,接口会相应Mock中返回的数据。
主机绑定规则
表示的是Dubbo服务对外发布的IP地址,默认情况下,Dubbo会按照以下顺序来查找并绑定主机IP地址:
- 查找环境变量中DUBBO_IP_TO_BIND属性配置的IP地址;
- 查找dubbo.protocol.host属性配置的IP地址,默认是空,如果没有配置或者不合法,则继续向下找;
- 通过LocalHost.getHostAddress获取本机IP地址,如果获取失败,继续向下找;
- 如果配置了注册中心的地址,则使用Socket通信连接到注册中心的地址后,使用for循环通过socket.getLocalAddress().getHostAddress()扫描各个网卡获取网卡IP地址;
上述过程中,任意一个步骤检测到合法的IP地址,便会默认返回将其作为对外暴露的服务IP地址。需要注意的是,获取的IP地址并不是写入注册中心的地址,默认情况下,写入注册中心的IP地址优先选择环境变量中DUBBO_IP_TO_REGISTER属性配置的IP地址,这个地址没有写入的情况下才会选择前面获取的地址并写入注册中心。
使用默认的主机绑定规则,可能会存在获取的IP地址不准确的情况,导致服务消费者与注册中心拿到的URL地址进行通信。因为Dubbo检测本地IP地址的策略是优先调用LocalHost.getHostAddress,这个方法原理是通过获取本机的hostname映射IP地址,如果它指向的是一个错误地址,那么这错误的地址会将作为注册发布的地址注册到ZooKeeper节点上,虽然Dubbo能够正常启动,但是消费者无法调用。可以通过以下方式来解决:
- 修改hosts文件中的hostname,配置正确的IP地址映射;
- 在环境变量中增加DUBBO_IP_TO_BIND或者DUBBO_IP_TO_REGISTER属性,value值为绑定的主机地址;
- 通过dubbo.protocol.host设置主机地址。
Dubbo针对不同的协议提供了默认的端口号:
- dubbo协议使用默认的是20880;
- Webservice协议使用默认的是80;
Dubbo初识-入门相关推荐
- Dubbo新手入门实例HelloWorld(zookeeper)
最近刚接触dubbo,新手入门遇到好多麻烦,网上搜来的入门demo也是各种问题,百般周折自己终于倒腾出来了,与大家共享~ 1.创建服务方项目dubbo-server,在pom.xml中构建项目依赖 & ...
- 3、Dubbo急速入门
超级思维导图:processon 一 为什么需要 dubbo 很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的 ...
- (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门
在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...
- Dubbo -- Dubbo快速入门代码编写
文章目录 1. Dubbo快速入门代码编写 1.1 需求分析 1.2 项目和模块创建 1.3 导入相关依赖 1.4 编写提供服务的接口 1.5 编写调用服务的程序 1.6 安装dubbo-servic ...
- 【Dubbo】入门搭建
文章目录 快速入门 配置Nacos注册中心 Dubbo-Spring-Cloud 概述 快速使用 dubbo-cloud-provider-api 依赖含义 参考链接 快速入门 场景:提供provid ...
- Dubbo从入门到精通(全)
目录 前言 1. 分布式系统 1.1 发展演变 1.2 PRC 2. dubbo核心概念 3. dobbo环境搭建 3.1 zookeeper 3.2 监控中心 4. 入门项目 4.1 无dubbo ...
- 分布式服务框架 dubbo/dubbox 入门示例(转)
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- 菜鸟的DUBBO进击之路(二):Dubbo初识
为什么80%的码农都做不了架构师?>>> 一:Dubbo背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用构架已无法有效应对,分布式服务构架以及流动计算构架势在必行 ...
- 分布式服务框架 dubbo/dubbox 入门示例
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- Dubbo + Zookeeper入门初探
2018年2月15日,阿里巴巴的dubbo进入了Apache孵化器,社区的加入,希望dubbo能变得更好-Registry:注册中心,相当于房产中介,服务提供者和使用者都需要在这里注册/使用服务, 我 ...
最新文章
- pox 中 openflow.webservice 组建的学习与使用
- 画时域随机信号波形_【鼎阳硬件智库原创︱测试测量】任意波形发生器的基本输出波形及其相关参数...
- linux 优雅重启进程,apache2 重启、停止、优雅重启、优雅停止
- 第三次学JAVA再学不好就吃翔(part63)--String和int的相互转换
- linux删除第二次出现的字符,linux下 怎样删除文件名中包含特殊字符的文件
- Javascript设置对象属性为只读
- oracle死锁视频教程,两个Oracle死锁解决实例
- 在ES6类中绑定事件
- 封装属性_「Python基础学习」之封装大法
- Hibernate学习基本配置
- w7电脑蓝屏怎么解决_电脑蓝屏Win32k.sys怎么办
- c语言以空格分割字符串,C语言程序要读入一行文本,以空格分隔若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。...
- Codeforces Round #327 (Div. 2) C 	Median Smoothing(找规律)
- 【数据结构】----将一个链表拆分为两个链表
- installshield脚本入门
- 锁定计算机后qq能远程吗,如何通过QQ进行远程控制(利用QQ远程协助在不同网络下远程控制电脑)...
- maven打包报错Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:cle
- 跟海外大牌正面PK,中国品牌如何出圈?
- Windows Server 2016 文件共享
- LTD营销SaaS产品-官微名片介绍
热门文章
- js颜色RGB转十六进制
- python用户画像_干货:如何构建用户画像
- 使用CentOS7搭建Nat64服务器实现IPv6网段访问IPv4地址
- Veeam 完整备份文件 (VBK) 和增量备份文件 (VIB)
- Java 随机生成中文姓名,手机号,邮编,住址
- Mac使用技巧:磁盘如何分区
- 为什么程序员喜欢用dark mode深色模式
- 推荐几个免费下载破解软件的网站
- LOGO以及手绘签名完美导入CAD
- rabbitmq,stomp.js,rabbitmq-auth-backend-http,消息调研,消息设计