1、RCP基本原理
1.1RPC两个核心模块:通讯,序列化(反序列化)
1.2服务和服务之间的远程调用技术: Feign(http->应用层) dubbo(rpc->网络层)
1.3rpc 性能要优于 http 调用性能,因为作用层级越高,封装越深,效率就更高
拓展:需记忆—》工作网络7层模型
2、掌握Dubbo运行流程
Dubbo 一个基于 rpc协议实现的分布式远程调用的服务框架
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 过期时间
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区别


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