Dubbo微服务框架的核心功能
启动时检查
?Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"
集群容错
failover 失败自动切换,当出现失败重试其它服务器。通常用于读操作,重试带来更长延迟。
failfast快速失败,只发起一次调用,失败立即报错。通常用于非幂等性写操作,如新增记录。
failsafe失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
failback失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
folking并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
负载均衡
随机,按权重设置随机概率。调用量越大分布越均匀。
轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
线程模型
如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。
如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
异步调用
基于NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
事件通知
在调用之前、调用之后、出现异常时,会触发 oninvoke、onreturn、onthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 1。
并发连接控制
服务器端并发执行(或占用线程池线程数)不能超过 N 个
每客户端并发执行(或占用连接的请求数)不能超过 N个
限制服务器端接受的连接不能超过 N 个
限制客户端服务使用连接不能超过 N 个
延迟连接用于减少长连接数。当有调用发起时,再创建长连接。
粘滞连接用于有状态服务,让客户端总是调用同一服务方,除非服务方挂了,再连另一台。
令牌验证
通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。
路由规则
排除预发布机:
=> host != 172.22.3.91
白名单:
host != 10.20.153.10,10.20.153.11 =>
黑名单:
host = 10.20.153.10,10.20.153.11 =>
读写分离:
method = find,list,get,is => host = 172.22.3.94,172.22.3.95,172.22.3.96
method != find,list,get,is => host = 172.22.3.97,172.22.3.98
为重要应用提供额外的机器:
application != kylin => host != 172.22.3.95,172.22.3.96
配置规则
禁用提供者:(通常用于临时踢除某台提供者机器,相似的,禁止消费者访问请使用路由规则)
override://10.20.153.10/service?disbaled=true
调整权重:(通常用于容量评估,缺省权重为 100)
override://10.20.153.10/service?weight=200
调整负载均衡策略:(缺省负载均衡策略为 random)
override://10.20.153.10/service?loadbalance=leastactive
服务降级
服务降级:(通常用于临时屏蔽某个出错的非关键服务)
override://10.20.153.10/service?&application=foo&mock=force:return+null
mock=force:return+null
表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
还可以改为
mock=fail:return+null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
访问日志
如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。注意:此日志量比较大,请注意磁盘容量。
服务容器
服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。
服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。
分布式事务/2PC提交
事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交,到达一种“万事俱备,只欠东风”的状态。
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。(注意:必须在最后阶段释放锁资源)
线程栈自动dump
当业务线程池满时,我们需要知道线程都在等待哪些资源、条件,以找到系统的瓶颈点或异常点。dubbo通过Jstack自动导出线程堆栈来保留现场,方便排查问题
1、SOA架构和微服务架构之间的区别和联系
2、如何设计微服务及其设计原则
3、解惑Spring Boot流行因素及能够解决什么问题
4、什么是Spring Cloud,为何要选择Spring Cloud
5、基于全局分析Spring Cloud各个组件所解决的问题
?
这里的视频是每天不断更新的,每天都有新的视频每天都有大牛讲解新的技术,如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以加Java进阶群:488048032,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
原文地址:http://blog.51cto.com/13636605/2084802