java 调用 rest接口服务-调用dubbo rest接口
基础知识 为什么要用Dubbo?
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖也越来越复杂。 面向服务的体系结构(Service-Oriented Architecture,SOA)诞生,并衍生出一系列相应的技术。 比如一个服务框架,封装了服务提供、服务调用、连接处理、通信协议、序列化方法、服务发现、服务路由、日志输出等行为。 就这样,分布式系统的服务治理框架出现了,Dubbo就这样诞生了。
什么是多宝?
Dubbo是一个高性能、轻量级的开源RPC框架,提供服务自动注册、自动发现等高效的服务管理解决方案,并可与Spring框架无缝集成。
Dubbo的使用场景有哪些? Dubbo的核心功能是什么? 架构设计 Dubbo的核心组件有哪些?
Dubbo服务器注册和发现的过程是怎样的?
服务容器Container负责启动、加载和运行服务提供者。
服务提供者Provider启动时,会向注册中心注册自己提供的服务。
服务消费者Consumer启动时,会向注册中心订阅自己需要的服务。
Registry 将服务提供者的地址列表返回给消费者。 如果有变化,Registry会基于长连接将变化数据推送给消费者。
服务消费者Consumer,从提供者地址列表中,根据软负载均衡算法选择一个提供者调用,如果调用失败,再选择另一个提供者调用。
服务消费者Consumer和提供者Provider在内存中累计调用次数和调用时间,每分钟定时向监控中心Monitor发送统计数据。
Dubbo的整体架构设计有哪些层次?
接口服务层(Service):该层与业务逻辑相关,根据提供者和消费者的业务设计相应的接口和实现
配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心
服务代理层(Proxy):服务接口透明代理,生成服务客户端Stub和服务端Skeleton,以ServiceProxy为核心,扩展接口为ProxyFactory
服务注册层(Registry):封装服务地址的注册和发现,以服务URL为中心,扩展接口有RegistryFactory、Registry、RegistryService
路由层(Cluster):封装多个provider的路由和负载均衡,桥接注册中心,以Invoker为中心,扩展接口有Cluster、Directory、Router和LoadBlancce
监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口有MonitorFactory、Monitor和MonitorService
远程调用层(Protocal):封装RPC调用,以Invocation和Result为核心,扩展接口有Protocol、Invoker和Exporter
信息交换层(Exchange):封装请求响应方式,同步转异步。 以Request和Response为核心,扩展接口有Exchanger、ExchangeChannel、ExchangeClient、ExchangeServer
网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec
数据序列化层(Serialize):一些可复用的工具,扩展的接口有Serialization、ObjectInput、ObjectOutput和ThreadPool
Dubbo Monitor实现原理?
消费者端在发起调用之前会经过过滤链; provider 端在收到请求时也会经过过滤器链,然后进行真正的业务逻辑处理。 默认情况下,consumer 和provider 的过滤器链中都会有Monitorfilter。
1.MonitorFilter向DubboMonitor发送数据
2、DubboMonitor聚合数据后(默认聚合1分钟以内的统计数据),暂存在ConcurrentMap statisticsMap中,然后使用包含3个线程的线程池(线程名:DubboMonitorSendTimer)调用SimpleMonitorService遍历发送statisticsMap 1分钟统计数据,每发送一个,当前Statistics的AtomicReference会被重置
3、SimpleMonitorService将这些聚合后的数据塞进BlockingQueue队列(队列大写为100000)
4、SimpleMonitorService使用后台线程(线程名称:DubboMonitorAsyncWriteLogThread)将队列中的数据写入文件(线程以死循环的形式写入)
5、SimpleMonitorService也会使用一个线程池,线程池为1个线程(线程名称:DubboMonitorTimer)每隔5分钟将文件中的统计数据绘制成图表
分布式框架 Dubbo 还有哪些类似的分布式框架?
比较有名的是Spring Cloud。
Dubbo和Spring Cloud是什么关系?
Dubbo是SOA时代的产物,其关注点主要是服务调用、流量分发、流量监控和熔断。 Spring Cloud诞生于微服务架构时代,考虑到微服务治理的方方面面。 另外,依托于Spring和Spring Boot的优势,这两个框架一开始的目标也不一致。 Dubbo定位服务治理与Spring Cloud构建生态。
Dubbo 和 Spring Cloud 有什么区别?
Dubbo底层使用Netty等NIO框架,基于TCP协议进行传输,通过Hession序列化完成RPC通信。
Spring Cloud基于Http协议Rest接口调用远程进程通信。 相对来说,Http请求的报文会比较大,占用的带宽也比较多。 但是,REST 比 RPC 更灵活。 服务提供者和调用者仅依赖一纸契约,不存在代码层面的强依赖。 这在强调快速演进的微服务环境中比较合适。 至于通讯速度还是方便灵活,具体情况具体考虑。
Dubbo 和 Dubbox 的区别?
Dubbox是当当网在Dubbo停止维护后基于Dubbo做的一个扩展项目,比如增加Restful可以调用的服务,更新开源组件等。
注册中心 Dubbo有哪些注册中心?
推荐使用Zookeeper作为注册中心
Dubbo的注册中心集群挂了,发布者和订阅者还能通信吗?
可以进行通信。 Dubbo启动时java 调用 rest接口服务,消费者会从Zookeeper中拉取注册生产者的地址接口等数据,缓存到本地。 每次调用都是根据本地存储的地址调用。
集群Dubbo集群提供哪些负载均衡策略?
默认为随机调用。
Dubbo的集群容错解决方案有哪些?
默认的容错方案是故障转移集群。
配置Dubbo配置文件是如何加载到Spring中的?
Spring容器在启动的时候,会读取一些Spring默认的schema和Dubbo的自定义schema。 每个schema都会对应自己的NamespaceHandler,NamespaceHandler使用BeanDefinitionParser来解析配置信息,转换成需要加载的bean对象!
说说核心配置? Dubbo中设置超时时间的方式有哪些?
Dubbo超时设置有两种方式:
当服务调用超时时会发生什么?
当dubbo调用服务失败时,默认会重试两次。
Dubbo的通信协议使用什么通信框架?
默认情况下,使用 Netty 作为通信框架。
Dubbo支持哪些协议,它们的优缺点是什么? 设计模式 Dubbo 使用了哪些设计模式?
Dubbo框架在初始化和通信过程中使用了多种设计模式,可以灵活控制类加载、权限控制等功能。
工厂模式
Provider在导出服务时,会调用ServiceConfig的export方法。 ServiceConfig中有一个字段:
private static final Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi
on();
Dubbo中有很多这样的代码。 这也是一种工厂模式,只不过实现类的获取采用了JDKSPI的机制。 这种实现的优点是可扩展性强。 如果想扩展实现,只需要在类路径下添加一个文件,代码零侵入。 另外,像上面的Adaptive实现,在调用的时候可以动态判断调用哪个实现,但是由于这个实现使用了动态代理,会造成代码调试麻烦,需要分析具体的实现类是叫。
装饰模式
Dubbo 在启动和调用阶段都大量使用了装饰器模式。 以Provider提供的调用链为例。 具体的调用链码在ProtocolFilterWrapper的buildInvokerChain中完成。 具体实现注解中带group=provider的Filter,按照顺序排序。 最终调用顺序为:
EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter ->
ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->
ExceptionFilter
更准确地说,这里混合了装饰者模式和责任链模式。 比如EchoFilter的作用就是判断是否是回显测试请求,如果是则直接返回内容,这是责任链的体现。 并且和ClassLoaderFilter一样,只是在main函数上加了函数,改变了当前线程的ClassLoader,是典型的装饰器模式。
观察者模式
Dubbo的Provider在启动的时候,需要和注册中心进行交互,先注册自己的服务,然后订阅自己的服务。 订阅时采用观察者模式,开启监听器。 注册中心会每隔5秒定时检查是否有服务更新。 如果有更新,它将向服务提供商发送通知消息。 provider收到notify消息后,会运行NotifyListener的notify方法,执行listener方法。
动态代理模式
Dubbo 扩展 JDK SPI 的 ExtensionLoader 类的 Adaptive 实现是一个典型的动态代理实现。 Dubbo需要灵活控制实现类,即在调用阶段根据参数动态决定调用哪个实现类,所以先生成代理类的方法可以实现灵活调用。 生成代理类的代码是ExtensionLoader的createAdaptiveExtensionClassCode方法。 代理类的主要逻辑是获取url参数中指定参数的值,作为获取实现类的key。
运维管理服务如何兼容老版本?
版本号(version)可以用来过渡。 多个不同版本的服务注册到注册中心,不同版本号的服务之间不相互引用。 这有点类似于服务分组的概念。
Dubbo telnet 命令可以做什么?
dubbo服务发布后,我们可以使用telnet命令进行调试和管理。 Dubbo 2.0.5及以上版本提供对telnet命令的端口支持
Dubbo支持服务降级吗?
在dubbo:reference中设置mock="return null"。 也可以将mock的值改为true,然后在接口同路径下实现一个Mock类,命名规则为“接口名+Mock”后缀。然后在Mock类中实现自己的降级逻辑
Dubbo如何优雅关闭?
Dubbo使用JDK的ShutdownHook来完成优雅关机,所以如果你使用kill -9 PID等强制关机命令,它不会执行优雅关机,只有在你通过kill PID时才会执行。
SPIDubbo SPI 和 Java SPI 有什么区别?
JDK SPI:
JDK标准的SPI会一次性加载所有的扩展实现。 如果有些扩展是耗时的,那是没有用的,是资源的浪费。所以只希望加载某个实现是不现实的
多宝SPI:
1、在不改变Dubbo源码的情况下扩展Dubbo
2.延迟加载,一次只能加载你想加载的扩展实现。
3. 增加对扩展点IOC和AOP的支持,扩展点可以直接注入其setter
它扩展点。
4、Dubbo的扩展机制可以很好的支持第三方IoC容器,默认支持Spring Bean。
其他Dubbo是否支持分布式事务?
目前不支持,可以通过tcc-transaction框架实现
简介:tcc-transaction是一个开源的TCC补偿分布式事务框架
TCC-Transaction通过Dubbo的隐式传参功能避免了自身对业务代码的侵入。
Dubbo 可以缓存结果吗?
以提高数据访问速度。 Dubbo 提供声明式缓存,减少用户添加缓存的工作量
其实比普通的配置文件多了一个tag cache="true"
Dubbo必须依赖的包有哪些?
Dubbo必须依赖JDK,其他可选。
Dubbo支持哪些序列化方式?
默认使用Hessian序列化,Duddo、FastJson、Java都有自己的序列化。
Dubbo在安全方面有哪些措施? 服务调用是否阻塞?
默认是阻塞的,可以异步调用,没有返回值也可以。 Dubbo是一个基于NIO的并行调用的非阻塞实现。 客户端无需启动多线程即可完成对多个远程服务的并行调用。 与多线程相比,开销小,异步调用会返回一个Future对象。
服务提供者可以实现故障踢的原理是什么?
服务失败踢出基于zookeeper的临时节点原理。
同一个服务有多个注册时,是否可以直接连接某个服务?
可以直接点对点连接,修改配置即可,也可以直接通过telnet连接到某个服务。
Dubbo服务降级,失败如何重试?
可以在dubbo:reference中设置mock="return null"。 也可以将mock的值改为true,然后在接口同路径下实现一个Mock类,命名规则为“接口名+Mock”后缀。然后在Mock类中实现自己的降级逻辑
你在使用Dubbo的过程中遇到过哪些问题?
在注册中心找不到对应的服务,查看服务实现类是否添加了@service注解无法连接注册中心,查看配置文件中对应的测试ip是否正确
为什么 RPC 需要 RPC
http接口是在接口不多,系统间交互较少的情况下,在解决信息孤岛初期经常使用的一种通信方式。 优点是简单、直接、易于开发。 使用现成的http协议进行传输。 但是,如果是一个大型网站,内部子系统很多,接口也很多,那么RPC框架的好处就体现出来了。 首先是长链接。 没必要每次都像HTTP一样握三次手。 ,减少网络开销; 其次,RPC框架一般都有一个注册中心,具有丰富的监控和管理; 发布、下线接口、动态扩展等,对于调用者来说都是无感知的统一操作。 三是安全。 最后还有最近流行的面向服务的架构和面向服务的治理,RPC框架是一个强有力的支持。
Socket只是一种简单的网络通信方式,它只是在双方之间建立了一个通信通道。 要实现rpc的功能,需要对其进行封装,实现更多的功能。
RPC一般配合netty框架和spring自定义注解来写轻量级框架。 其实netty在内部对socket进行了封装。 较新的jdk的IO一般是NIO,即非阻塞IO。 在高并发的网站中,RPC的优势会很明显
什么是远程过程调用
RPC(Remote Procedure Call Protocol)远程过程调用协议,是一种在不知道底层网络技术的情况下,通过网络向远程计算机程序请求服务的协议。 简而言之,RPC 使程序能够像访问本地系统资源一样访问远程系统资源。 一些关键方面包括:通信协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。
简单的说,RPC就是从一台机器(客户端)通过传递参数调用另一台机器(服务器)上的函数或方法(统称为服务),并得到返回的结果。
PRC架构组件
一个基本的 RPC 架构应该至少包含以下四个组件:
1、客户端(Client):服务调用者(服务消费者)
2、客户端存根(Client Stub):存放服务器的地址信息,将客户端的请求参数数据信息打包成网络报文,然后通过网络传输发送给服务器
3、Server Stub:接收客户端发送的请求报文并解包,然后调用本地服务进行处理
4、服务器:真正的服务提供者
具体调用过程:
1、服务消费者(客户端client)通过调用本地服务来调用要消费的服务;
2、client stub收到调用请求后,负责将方法、入参等信息序列化(组装)成可以在网络上传输的消息体;
3、client stub找到远程服务地址,通过网络向server发送消息;
4、server stub收到消息后进行解码(反序列化操作);
5、server stub根据解码结果调用本地服务进行相关处理;
6、本地服务执行具体的业务逻辑,并将处理结果返回给服务器存根;
7、服务器存根将返回结果重新打包成消息(序列化)java 调用 rest接口服务,通过网络发送给消费者;
8、client stub接收消息并解码(反序列化);
9、服务消费者获取最终结果;
RPC框架的目标是将上面的2-10步进行完整的封装,即封装调用、编码/解码的过程,让用户感觉像调用本地服务一样调用远程服务。
RPC与SOA、SOAP、REST的区别
1.休息