apachedubbo的简单介绍
本篇文章给大家谈谈apachedubbo,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Dubbo与SpringCloud的区别和优缺点
- 2、apache dubbo和apache什么关系
- 3、说一下Dubbo的工作原理?注册中心挂了可以继续通信吗?
- 4、Dubbo的基本使用
- 5、Dubbo的底层实现原理和机制
Dubbo与SpringCloud的区别和优缺点
以上内容均为官方定义,截图如下:
从以上定义中我们不难看出,Apache Dubbo的目标是基于RPC调用为主,并扩展相应的功能。 而SpringCloud是致力于提供分布式服务的各种工具。可以这样讲,Apache Dubbo从概念上讲只相当于SpringCloud中的feign而已。
Apache Dubbo: 诞生于阿并源里巴巴的线上需求,主要是为了应对微服务场景下高并发的处理,所以Apache Dubbo的核心关注点就是解决微服务之间调用的性能。 并且将包括服务注册/发现、负载均衡等微服务的核心内容进行了集成。最后在核心调用流程稳定的情况下完成了包括本地存根、Mock、版本控制等诸多特性的集成。
SpringCloud: SpringCloud是Spring家族中在微服务领域的关键组成部分,延续了Spring一贯的风格:为大家提供好用的工具,可以屏蔽底层实现,一站式完成业务开发。包括后面的SpringCloud Netflix和SpringCloud Alibaba等都是基于此完成工具的开发。我们可以大概数一数SpringCloud的工具内容,Ribbon【负载均衡】、Feign【HTTP服务】、Hystrix【熔断降级】、Gateway【网关】等等,从其中我们不难发现,SpringCloud对于微服务的调用的性能并不太关心,它更关心的是处理微服务调用以外的内容,虽然他勉为其难的搞了一个Feign,但是我们都知道,HTTP的调用是非常耗时的,它与RPC的调用效率完全不可同日而语。
综上所述:Apache Dubbo的目标是为了高效调用服务。SpringCloud的目标是一条龙解决微服务的治理问题,那么出发点都不同,比较的意义又在哪里呢。
事实上,目前我接触和了解的互联网大厂的项目里,单纯的使用SpringCloud的非常少。虽然不全是选用Apache Dubbo, 还有包括Thrift、Zero等微服务框架,但是Apache Dubbo的市场占有率会相对比较高,也是很多大厂项目的首选。
但是Apache Dubbo的服务治理其实并不太好用,比如熔断降级、限流等,同时Apache Dubbo还有一个比较麻烦的问题, 就运雀是没有HTTP调用的逻辑,这一点对前后端分离的项目非常不友好。
基于以上内容,其实在实际项目中, Apache Dubbo和SpringCloud相结合才是目前比较主流的使旁蔽早用方式。服务之间的调用使用Apache Dubbo。熔断、网关、限流等使用SpringCloud。尤其是在拥有了SpringCloud Alibaba以后,SpringCloud与Apache Dubbo的结合更加紧密,这才是我个人建议的使用方式。
[img]apache dubbo和apache什么关系
ApacheDubbo是一款宏碧判高性能、轻量级的开源服务框架,Apache是web服务器。
ApacheDubbo是阿里慧橡巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。
Apache是使用最广泛的Web服务器软件。Apache是_由ApacheSoftwareFoundation开发和维护的,它是一个免费提供的开源软件,它蔽改占全球所有网络服务器的67%,它可以通过使用扩展和模块进行高度定制,以满足许多不同环境的需求。
说一下Dubbo的工作原理?注册中心挂了可以继续通信吗?
答案是肯定可以的,我将从下面几点进行说明卖搜:
1.dubbo 的调用流程
2.Dubbo整体设计
3.从源码上说明注册中心挂了还是可以继续通信的
Dubbo 调用流程
架构图
流程说明:
1.Provider(提供者)绑定指定端口并启动服务
2.提供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
3.Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
4.注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
5.Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
6.Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
这么设计的意义:
Dubbo 整体设计
其协作流程如下:
从源码上说明注册中心挂了还是可以继续通信的
首先要把消费者注册到Zookeeper注册中心
然后使用RegistryDirectory 监听一下几个目录(会自动触发一次去获取这些目录上的当前数据)
当前所引入的服务的动态配置目录:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService:1.1.1:g1.configurators
比如监控providers 目录:
当有服务提供者注册,zookeeper会自动推动给订阅的消费者,然后转换为invoker存储到缓存中
我们在看调用时的代码:
我们看到 FailoverClusterInvoker 的doInvoke方法
Invoker invoker = select(loadbalance, invocation, copyInvokers, invoked);
此方法根据负载均衡器去缓存中获取一个invoker,
上面的 copyInvokers 就是上面我们缓存进去的 List
invokers = routerChain.route(getConsumerUrl(), invocation);
总结
在我们系统启动时,已经缓存了注册中心上的所有服务,后续的注册中心挂了只会影响到后续则注册,不会影响调用!
Dubbo分布式的RPC,微服务框架,
包括三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现。
Dubbo使得调用远程服务就像调用本地java服务一样简单。
参考Dubbo官方文档:包括实现细节,远程调用细节,服务提供者暴露服务。
主要流程。
1、provider向注册中心去注册
2、consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
3、consumer调用provider
4、consumer和provider都异步的通知监控中心
基于zk作为注册启斗中心:
【提供者】在【启动】时,向注册中心zk 【注册】自己提供的服务。
【消费者】在【启动】时,向注册中心zk 【订阅】自己所需的服务。
所以是可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用,消费者本地有一个生产者的列表,他会按照列表继续工作,倒是无法从注册中心去同步最新的服中旁历务列表,短期的注册中心挂掉是不要紧的,但一定要尽快修复,挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的
Dubbo的基本使用
官网地址:
如果在消费端和服务端都配置了负载均衡策略,以消费端为准。
在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不一样的。
消费者调用一个服务,分为三步:
1.消费者发送请求(饥旁网络传输)
2.服务端执行服务
3.服务端返回响应(网络传输)
如果在服务端和消费端各配置了一个timeout,那就比较复杂了,假设
1.服务执行为5s
2.消费端timeout=3s
3.服务端timeout=6s
那么消费端掉用服务时,消费端会收到超时异常(因为消费端超时了),服务端一切正常(服务端没有超时)。
官网地址:
集群容错表示:服务消费者在掉用某个服务时,这个服务有多个服务提供烂埋橡者,在经过负载均衡后选择其中一个服务提供者之后进液顷行调用,但调用报错后,Dubbo所采取的后续处理策略。
官网地址:
服务降级表示:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。
集群容错和服务降级的区别在于:
1.集群容错时整个集群范围内的容错
2.服务降级时单个服务提供者的自身容错
官网地址:
本地存根:名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在服务消费端执行的,这段逻辑一般都是由服务提供者提供,服务提供者可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。
官网地址:
本地伪装就是Mock,Dubbo中的Mock的功能相对于本地存根更简单一点,Mock其实就是Dubbo中的服务容错的解决方案。
官网地址:
如果当前服务支持参数回调,意思就是对于某个服务接口中的某个方法,如果想支持消费者在调用这个方式时能设置回调逻辑,那么该方法就是需要提供一个入参用来表示回调逻辑
因为Dubbo协议是基于长连接,所以消费者在两次调用同一个方法想指定不同的回调逻辑,那么就需要在调用时在指定一定key进行区分。
官网地址:
理解起来比较容易,主要要理解CompletableFuture,如果不理解,就直接把它理解为Future
其他异步调用方式:
官网地址:
泛化调用可以用来做服务测试。
在Dubbo中,如果某个服务想要支持泛化调用,就可以将该服务的generic属性设置为true,那对于服务消费者来说,就可以不用依赖该服务的接口,直接利用GenericService接口来进行服务调用
官网地址:
实现了GenericService接口就是泛化服务
官网地址:
github地址:
官网地址:
注意动态配置修改的是服务参数,并不能修改服务的协议,IP,PORT,VERSION,GROUP,因为这5个信息是服务的标识信息,是服务的身份证号,是不能修改的。
官网地址:
Dubbo的底层实现原理和机制
Dubbo :是一个rpc框架,soa框架
作为RPC:支持各种传输协议,如dubbo,hession,json,fastjson,底层采用mina,netty长连接进行传输!典型的provider和cusomer模式!
作为SOA:具有服务治理功能,提供服务的注册和发现!用zookeeper实现注册中心!启动时候服务端会把所有接口注册到注册中心,并森芦且订阅configurators,服务消费端订阅provide,configurators,routers,订阅逗大变更时,zk会推送providers,configuators,routers,启动时注册长连接,进行通讯!proveider和provider启动后,后台启动定时器,发送统计数据到monitor!提供各种容错机制和负载均衡策略!!
描述一个服务从发布到被消费的详细过程:
一个服务的发布暴露过程:
首先设置一个项目的别名,然后是定义注册中心和设定传输协议,之后定义服务名!服务接口以jar形式导入到provider!
一个服务发布暴露首先由spring的spacehander 把相关的xml或者注解全部转化为springBean,之后通过ServiceConfig.exerp()方法把bean传化为传输所需的url和参数注册到注册中心,发布后provder端的ref(helloImpl)通过protocl(传输协议,如dubboprotocl,hessionprotocl)转化为Invoker对象,即调用信息,包括类,方法,参数等等,再通过proxy操作(代理)如jdkproxy代理转为为Exporter对象,这就是整个的服务暴露过程!
消费过程:
一个Renfence类,通过RenfenceConfig的init 调用proxy的refer方法生产一个invoker,invoker再通过proctol转化成具体的ref(hello),进行消费
首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务山春竖消费的关键。接下来把 Invoker 转换为客户端需要的接口(如:HelloWorld)
具体参见
Exporter接口提供Invoker的调用和destroy()
public interface ExporterT {
}
#Dubbo的实现
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。
关于apachedubbo和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。