1、RCP基本原理

1.1RPC两个核心模块:通讯,序列化(反序列化)
86014db43929a825d8001904b87accf.png
1.2服务和服务之间的远程调用技术: Feign(http->应用层) dubbo(rpc->网络层)
1.3rpc 性能要优于 http 调用性能,因为作用层级越高,封装越深,效率就更高
拓展:需记忆—》工作网络7层模型
12、Dubbo - 图2

2、掌握Dubbo运行流程

Dubbo 一个基于 rpc协议实现的分布式远程调用的服务框架
bf95f0d1e3c3d292b20c4845119edf2.png

3、掌握Dubbo配置-超时、重试、灰度发布、启动检查等

3.1超时优先级:默认调用超时时间1s
1、同级别下:消费方(@DubboReference)>提供方(@DubboService)
2、不同级别下:方法上的超时配置>接口>通用配置
配置原则设计目的:
1、先配置服务提供方相关配置;
2、如果服务提供方的配置不能满足消费方的配置,则可以在消费方优化

3.2实现序列化接口:
1、自定义的对象即(pojo包)需实现序列化接口,因为Dubbo是基于RCP协议实现,要实现序列化接口才能才在网络层传输;
2、String级基本常用数据类(short long integer等)均已实现序列化接口

3.3重试机制:
出现的前提:当请求失败时,才会触发重试机制
1、Dubbo默认重试次数为2次,可在服务提供方的注解上@DubboService(retries=…);
2、如需自定义重试次数,建议次数不能超过2次,因为当下互联网的并发量很大,重试次数就等于几倍量增长;
3、配置重试次数时,要考虑幂等性原则,即新增POST类型,建议把重试次数设置为0,否则可能会有多条相似记录。

3.4幂等性原则:
相同的URL无论请求多少次,请求结果都是一致的;
常见幂等性:查询GET(根据id多次查询结果均一致)、删除DELETE、表单式提交的修改PUT
非幂等性:新增POST,数量上(+1或-1)的修改PUT

3.5灰度发布(多版本):
解决不兼容版本的升级问题:
逐渐把低版本的请求转到新版本的服务实现,类似公测;

3.6上下文信息:
RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。A->B->C A访问B的上下文信息,不会传递到B访问C的信息当中

3.7隐式传参:项目三中使用传递jwt数据
消费方:RPCContext.getContext.setAttachment(key,value)
提供方:RPCContext.getContext.getAttachment(key)

4、Dubbo高可用

**面试题:
1、如果nacos注册中心宕机,是否还可以消费dubbo暴露的服务?
解答:要区分是生产环境还是开发环境?

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

2、注册中心是否可以替换? 如果可以替换那么可以用什么来替换? 为什么?
可以替换,nacos/zookeeper/redis;

3、redis作为注册中心的原因是什么? 数据结构是什么? 怎么实现?
redis的发布订阅功能可以实现注册中心功能;Hash数据结构
Key map key map value
当前服务的权限定类名+类型 服务ID 过期时间
image.png

5、Dubbo负载均衡有几种,默认是什么

Dubbo负载均衡有4种,默认是权重随机
5.1权重随机(Random LoadBalance):随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

5.2权重轮询(RoundRobin LoadBalance):轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

5.3最少活跃数(LeastActive LoadBalance):最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

5.4一致Hash(ConsistentHash LoadBalance):一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

代码上修改:@DubboReference(loadbalance=”roundrobin”)

6、Dubbo服务熔断降级如何实现,容错机制有几种

6.1服务熔断降级:在高并发情况下,部分非关键服务出错后,可临时采取屏蔽措施,并可自定义服务降级策略返回前端,以友好的信息安抚用户;
6.2Dubbo实现服务熔断降级原理:
—mock=force:return null 即消费方对该服务方法调用返回值是null,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
—mock=fail:return null 消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。**==用来容忍不重要服务不稳定时对调用方的影响。

6.3Dubbo容错机制有6种,默认是failover;
Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。
Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。
Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

7、SpringCloud 和 Dubbo 区别(面试题)

Dubbo SpringCloud
服务注册中心 Zookeeper Spring Cloud Netfix Eureka
服务调用方式 RPC REST API
服务监控 Dubbo-monitor Spring Boot Admin
熔断器 不完善 Spring Cloud Netflix Hystrix
服务网关 Spring Cloud Netflix Zuul
分布式配置 Spring Cloud Config
服务跟踪 Spring Cloud Sleuth
数据流 Spring Cloud Stream
批量任务 Spring Cloud Task
信息总线 Spring Cloud Bus

1、SpringCloud和Dubbo都是主流的微服务架构.
—SpringCloud是Apache下的Spring体系下的微服务解决方案.
— Dubbo是阿里系统中分布式微服务治理框架.
2、技术方面对比
—SpringCloud功能远远超过Dubbo, Dubbo只实现了服务治理(注册和发现). 但是SpringCloud提供了很多功能, 有21个子项目
—Dubbo可以使用Zookeeper作为注册中心, 实现服务的注册和发现, SpringCloud不仅可以使用Eureka作为注册中心, 也可以使用Zookeeper作为注册中心.
—Dubbo没有实现网关功能, 只能通过第三方技术去整合. 但是SpringCloud有zuul路由网关, 对请求进行负载均衡和分发. 提供熔断器, 而且和git能完美集成.
3、性能方面对比
— 由于Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合以Hession序列化完成RPC。
—而SpringCloud是基于Http协议+Rest接口调用远程过程的,相对来说,Http请求会有更大的报文,占的带宽也会更多。
—使用Dubbo时, 需要给每个实体类实现序列化接口, 将实体类转化为二进制进行RPC通信调用.而使用SpringCloud时, 实体类就不需要进行序列化.

8、Eureka和Nacos区别

image.png
image.png
其他模块比较

模块 Nacos Eureka
CAP定理 支持CP(一致性)、AP(可用性) 只支持AP
连接方式 netty,是长连接 短连接,定时发送
并发量 相对较高 较低

9、学会读官网文档:https://dubbo.apache.org/zh/docsv2.7/user/preface/