黑马程序员Dubbo快速入门,Java分布式框架dubbo教程
视频地址:https://www.bilibili.com/video/BV1VE411q7dX
相关概念
集群和分布式
- 集群:很多“人”一起 ,干一样的事。 下图:很多个AB模块干一样的事儿
- 分布式:很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事。 下图:AB模块、CD模块、E模块组合在一起
RPC
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程。相对于可以调用其他电脑的服务。
RPC要解决的两个问题:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢,我为什么不直接使用二进制传输?比如直接用Java的Socket协议进行传输?以左边的Client端为例,Application就是rpc的调用方;Client Stub就是我们上面说到的代理对象,也就是那个看起来像是Calculator的实现类,其实内部是通过rpc方式来进行远程调用的代理对象;Socket是实现远程调用的工具包,最后通过底层网络实现实现数据的传输。
RPC两个核心模块:通讯,序列化。
Dubbo
是一款高性能、轻量级的开源Java RPC框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现(是一个很全面的通讯框架)
服务提供者(Provider) : 暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer) : 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry) : 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor) : 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
调用关系说明:
- 服务提供者在启动时,向注册中心注册自己提供的服务。(做好了汉堡放在前台)
- 服务消费者在启动时,向注册中心订阅自己所需的服务。(顾客来买汉堡,去前台拿)
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。常用的注册中心,目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Dubbo快速入门
创建3个模块:web,service,interface,然后都依赖于公共的接口模块interface
interface模块定义相关的service接口,service模块里面实现公共接口模块里面的接口
dubbo-admin
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin:一个开源的maven网页项目,前后端分离的,前端用的是vue,后端用的是springboot。
Dubbo高级特性
序列化
地址缓存
注册中心挂了,服务是否可以正常访问?可以,因为Dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。当服务提供者地址发生变化时,注册中心会通知服务消费者。
超时与重试
- 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。Dubbo利用超时机制来解决:设置一个超时时间,在这个时间段内无法完成服务的访问,则会自动断开连接。设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
- 如果出现网络抖动,则这一次请求就会失败。Dubbo 提供重试机制来避免类似问题的发生。通过 retries 属性来设置重试次数。默认为 2 次。
@Service(timeout = 3000, retries = 3) // 当前服务超时3s,就会重试3次连接
多版本
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能的版本。Dubbo中使用version属性来设置和调用同一个接口的不同版本。
负载均衡
负载均衡策略(4种):
- Random (默认):按权重设置随机选择。
- RoundRobin :按权重轮询。
- LeastActive:最少活跃调用数,相同活跃数的随机。
- ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。
集群容错
集群容错模式:
- Failover Cluster(默认):失败重试。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
- Failfast Cluster :快速失败。只发起一次调用,失败立即报错。通常用于写操作。
- Failsafe Cluster :失败安全。出现异常时,直接忽略。返回一个空结果。写日志的失败可以用。
- Failback Cluster :失败自动恢复。后台记录失败请求,定时重发。通常用于消息通知操作,比较重要的事情通知。
- Forking Cluster :并行调用多个服务器,只要一个成功即返回。
- Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。
服务降级
某个服务运行内存已经快满了,需要进行资源释放,把一些相对不重要的服务关掉(广告、日志服务),保证重要服务的进行(支付)
服务降级的两种方式:
- force:直接返回null,直接不调用。用来屏蔽不重要的服务不可用的影响。
- fail:访问失败后我再,我再返回null。用来容忍不重要的服务不稳定的影响。