Dubbo 分布式系统中的相关概念 Dubbo概述 Dubbo高级特性
Posted halulu.me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo 分布式系统中的相关概念 Dubbo概述 Dubbo高级特性相关的知识,希望对你有一定的参考价值。
目录
分布式系统中的相关概念
传统项目:公司内部日常使用的项目,比如:OA、HR、CRM
互联网项目:放在公网环境,面向群众的项目。比如天猫,京东。
大型互联网项目架构目标
- 高性能:提供快速且高并发的访问
- 响应时间(RT):指执行一个请求从开始到最后收到响应数据所花费的总体时间。
- 并发数/并发连接数:指的是客户端向服务器发起请求,并建立了TCP连接,每秒钟服务器建立的TCP连接数量。
- 并发用户数:单位时间内有多少客户端(用户)同时访问。(1s中可能有10个客户端来访问,有可能建立100个连接)(10代表并发客户数,100代表并发数)
- 吞吐量(throughput):指单位时间内系统处理请求的能力。
- QPS:Query Per Second 每秒请求/查询数。 (多个请求可能共用一个连接)
- TPS:Transactions Per Second 每秒事务数。
- 一个事务是指一个客户端向服务器发送一次功能请求然后服务器做出反应的过程。
- 一个页面的一次访问,只会形成一个TPS;但一次页面请求,可能产生多次对服务器的请求。
- QPS >= 并发连接数 >= TPS
- 高可用:网站服务一直可以正常访问。(99.99%)
- 可伸缩:通过硬件增加/减少,提高/降低处理能力。
- 高扩展:系统间耦合低,方便的通过新增/移除方式,增加/减少新的功能/模块。
- 安全性:提供网站安全访问和数据加密,安全存储等策略。
- 敏捷性:随需应变,快速响应。
集群和分布式
集群:很多人一起干一样的事情。
分布:很多人一起干不一样的事情。这些不一样的事情,组合在一起共同完成系统功能。
集群的作用:1、让系统高可用 2、分担请求压力
分布式的作用:1、分担请求压力 2、模块解耦
集合和分布式的使用:一个大项目可以划分为多个项目,这多个项目就是使用分布式进行解耦,每个项目又可以使用集群来分担请求压力。
架构演进
单体架构:
当网站流量很小的时候,只需要一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。(mybatis、hibernate)
缺陷:
1、代码耦合度高,开发维护困难
2、无法针对不同模块进行针对性优化
3、扩展性差
4、容错性错,并发能力差
垂直架构:
将应用拆成互不相干的几个应用,以提高效率。
优点:
1、系统拆分实现了流量的分担
2、可以针对不同模块进行优化
3、方便水平扩展,提高负载能力、容错性
缺陷:
系统直接相互独立,会有很多的重复工作,影响效率。
分布式架构:
当垂直拆分的应用越来越多,可以将基础业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心
优点:
将基础服务进行抽取,系统间相互调用,提高代码的复用性
缺陷:
1、服务越来越多,需要管理多个地址(比如,A用到B、C、D,就必须配置这3个地址)
2、调用关系错综复杂
3、服务过多,服务状态难以管理,无法根据具体情况动态管理。(比如,A调用B,但是B采用集群B1、B2,怎么负载均衡)
面向服务架构(SOA)
SOA:Service-Oriented-Architecture面向服务架构,是一个组件模型,它将应用程序的不同功能单位进行拆分,并通过这些一个服务总线连接起来。
ESB:Enterparise Servce Bus 企业服务总线,服务中介。主要是提供了一个服务与服务之间的交互。
Dubbo概述
Dubbo高级特性
1、序列化
dubbo服务端与消费端通讯传递的对象,必须要实现序列化接口。
2、地址缓存
注册中心挂了,服务是否可以正常访问?
- 可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
- 当服务提供者地址发生变化时,注册中心会通知服务消费者。
3、超时重试
- 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
- 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
- dubbo提供的超时与重试可以解决上面问题
- 设置
@Reference(timeout = 1000)
超时时长默认是1秒。
3、多版本
- 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
- dubbo 中使用version 属性来设置和调用同一个接口的不同版本
@Service(version = "1.0")
// version指定服务版本
@Reference(version = "1.0")
// 修改版本
4、负载均衡
负载均衡策略(4种):
- random :按权重随机,默认值。按权重设置随机概率。
- roundrobin :按权重轮询。
- leastactive:最少活跃调用数,相同活跃数的随机。
- consistenthash:一致性 Hash,相同参数的请求总是发到同一提供者。
默认是random负载均衡器
@Reference(loadbalance = "random")
设置负载均衡
5、集群容错
集群容错模式:
- Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作(无法保证幂等性)
- Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。(不重试)
- Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。(一般用于不太重要的操作,比如消息通知)
- Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。(一般用于非常重要的操作)
- Forking Cluster :并行调用多个服务器,只要一个成功即返回。
- Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。
@Reference(cluster = "failover")
设置集群容错
6、服务降级
- 当服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
- 当下游的服务因为某种原因响应超时或不可用,上游主动调用本地的一些降级逻辑,避免等待或出错,迅速返回给用户!
- mock=force:return null` 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=fail:return null
表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
// 表示不发起远程调用,直接返回null@Reference(mock = "force:return null")
Dubbo只能从注册中心获取服务吗?
不是,也可以使用直连,直连方式是不需要从注册中心获取服务。
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时可能需要点对点直连方式。
@Reference(url = "dubbo://localhost:24567")
Dubbo服务提供者一定要需要先开启动,消费者后启动吗?
不需要,如果在@Reference中添加check=false,可以先启动消费者,再启动提供者
以上是关于Dubbo 分布式系统中的相关概念 Dubbo概述 Dubbo高级特性的主要内容,如果未能解决你的问题,请参考以下文章
Dubbo -- 分布式系统的相关概念(大型互联网项目架构目标 集群和分布式 架构演进)Dubbo概述(Dubbo的概念和架构)Dubbo快速入门(Zookepper的安装:注册中心中心)
Dubbo -- dubbo高级特性(序列化 地址缓存 超时与重试机制 多版本:灰度发布 负载均衡 集群容错策略 服务降级)