精华内容
下载资源
问答
  • 分布式服务框架 HSF

    千次阅读 2018-10-18 17:47:38
    摘要: RPC 协议采用多路复用的 TCP 长连接方式,在服务提供者和调用者间有多个服务请求同时调用时会共用同一个长连接,即一个连接交替传输不同请求的字节块。它既避免了反复建立连接开销,也避免了连接的等待闲置...

    摘要: RPC 协议采用多路复用的 TCP 长连接方式,在服务提供者和调用者间有多个服务请求同时调用时会共用同一个长连接,即一个连接交替传输不同请求的字节块。它既避免了反复建立连接开销,也避免了连接的等待闲置从而减少了系统连接总数,同时还避免了 TCP 顺序传输中的线头阻塞(head-of-line blocking)问题。

     Docker相关:考虑到应用故障的隔离、更方便的服务管控,目前淘宝内部大部分应用的部署方式还是一个虚拟机(对应一个操作系统)运行一个 Tomcat 容器,每个 Tomcat 运行一个服务应用,随着近几年以 Docker 容器技术的发展和流行,现在阿里巴巴内部也正在进行应用容器化部署的工作,让服务器的资源利用更加科学和高效。 

    正文:

    阿里巴巴集团内部使用的分布式服务框架 HSF(High Speed Framework,也有人戏称“好舒服”)已经被很多技术爱好者所熟知,目前已经支撑着近 2000 多个应用的运行。

    其对应早期的开源项目 Dubbo(因为某些原因,Dubbo 项目在 2012 年年底,阿里巴巴就停止了对此开源项目的更新),则更是在互联网领域有着非常高的知名度和广泛的使用。

    本文通过对阿里巴巴 HSF 服务框架的介绍,让大家能对这类分布式服务框架架构设计、运行原理,以及如何实现作为一个 SOA 架构需要满足的各个特性有一个清晰的认识。

    HSF 服务框架主要组件

    1、服务提供者

    在服务框架中真正提供服务功能实现的应用实例,为了保障服务提供的高可用性,一般均是集群部署。

    每一个 HSF 的应用均是以 War 包的形式存在,运行在阿里巴巴优化定制后的 Tomcat 容器中,在 Tomcat 容器层已经集成了 HSF 服务框架对服务提供者或服务调用者进行配置服务器发现、服务注册、订阅、失效转移等相关功能,所以不管是在服务提供者还是调用者开发时,只需要进行服务相关的配置操作,应用中无需引入任何 HSF 相关的 Jar 依赖包。

    考虑到应用故障的隔离、更方便的服务管控,目前淘宝内部大部分应用的部署方式还是一个虚拟机(对应一个操作系统)运行一个 Tomcat 容器,每个 Tomcat 运行一个服务应用,随着近几年以 Docker 容器技术的发展和流行,现在阿里巴巴内部也正在进行应用容器化部署的工作,让服务器的资源利用更加科学和高效。

    2、服务调用者

    作为服务的消费者,大多数也是以 WAR 应用包的方式运行在 Tomcat 容器中,在阿里巴巴集团内部也有一部分是基于 C/C++、PHP、Node.js 等语言开发的服务调用者。

    3、地址服务器

    在 HSF 服务框架中,地址服务器肩负着给服务提供者和服务调用者提供部署环境中所有配置服务器和 Diamond 服务器的服务器列表信息,是由 Nginx( 是一个高性能的 HTTP 和反向代理服务器)提供该服务能力。

    在部署 HSF 服务环境时,会将整个环境中的配置服务器集群(服务器 IP 列表)和 Diamond 服务器集群信息设置在地址服务器上,在实际生产部署中,也会部署多台地址服务器提供负载均衡和高可用性的服务,服务提供者和调用者通过统一域名的方式访问这些地址服务器(比如“xxx.tbsite.net”),通过 DNS 轮询实现地址服务器访问的高可用性。

    4、配置服务器

    配置服务器在 HSF 框架中主要负责记录环境内所有服务发布(服务提供者的 IP 地址和服务端口信息)和服务订阅(服务调用者的 IP 地址和服务端口信息)信息,并将服务相关信息推送到服务节点上。为了追求服务发布和订阅的推送效率,所有的服务发布和订阅信息均是保存在内存中。

    配置服务器与所有服务者提供者和调用者均是长连接,采用心跳的方式可监控到各服务运行节点的状况,一旦出现服务提供者服务节点出现故障时,会自动推送更新后(将出问题的服务提供者服务节点信息从列表中删除)的服务提供者列表给相关的服务调用者端。

    在生产环境中,会部署多台配置服务器,用于服务发布、订阅、推送的负载均衡,在多台配置服务器间会进行实时的数据同步,保证服务发布和订阅信息尽快能同步到各服务节点上。

    某种程度上,配置服务器在 HSF 框架中扮演了服务调用调度的指挥官,通过给服务调用者端推送不同的服务提供者列表就可以轻易的调整服务调用的路由,这一特性在淘宝平台实现单元化(即某一客户在访问淘宝时,访问请求一旦路由到某一个淘宝机房后,在淘宝上进行的所有业务的操作均可以在该机房完成,而无需访问其他机房的服务,也是实现异地多活的基础)、异地多活起到了至关重要的作用。

    5、Diamond 服务器

    本质上,Diamond 服务器是一个通用的统一配置管理服务,类似 ZooKeeper,给应用提供统一的配置设置和推送服务,使用场景非常广泛,在阿里巴巴内部有很多的产品在需要进行配置的保存和获取时都会使用 Diamond 服务器。

    在 HSF 服务框架中,则主要承担了服务调用过程中对于服务调用安全管控的规则、服务路由权重、服务 QPS 阀值等配置规则的保存,所有的信息均是持久化保存到了后端的 MySQL 服务器中,在生产环境中,会有多台 Diamond 服务器提供负载均衡的服务。

    使用 Diamond 服务器进行服务相关设置的典型场景如下:

    • 通过设置白名单(服务调用者所在服务节点 IP 地址)的方式设置某些服务或服务中的方法只能让特定 IP 地址的服务器调用;

    • 通过用户认证的方式控制服务是否能够调用;

    • 按照不同的服务器权重设置服务调用者对多个服务提供者服务节点的访问;

    • 设置某些服务的 QPS 能力上限值,一旦该服务的 QPS 达到该阀值,则拒绝服务的继续调用,这也是实现服务限流的技术实现,在平台进行大促或秒杀场景时,保障平台的稳定的重要屏障。

    通过这样规则的设置,Diamond 除了将这些规则保存在自身的数据库中外,会自动将这些规则推送到相关的服务节点上(实际实现上是服务节点会定时从 Diamond 服务器上同步相关配置信息),使这些规则能立即在服务运行环境中生效。

    如图 3-5 所示是阿里巴巴 HSF 服务框架的工作原理,按照服务注册发布、服务订阅、服务规则推送、最终服务提供者和服务调用者间的服务交互的顺序说明了 HSF 服务框架中每个组件在整个框架中所扮演的角色。

    图 3-5 HSF 服务框架工作原理示意图

    1)服务节点对配置服务器列表的获取。

    服务调用者和服务提供者在随着 Tomcat 容器启动后,会以域名(比如“xxx.tbsite.net”)的方式获取到可用的地址服务器,通过向地址服务器分别发送获取配置服务器和 Diamond 服务器服务 IP 列表请求的方式,在容器启动完成后,就已经在该服务节点上获取到了配置服务器和 Diamond 服务器的 IP 列表信息。整个过程如图 3-5 中的步骤①②。

    2)服务的注册发布。

    作为服务提供者,当获取到配置服务器的服务器列表后,则向配置服务器发送当前应用中包含的服务提供者相关信息(这些信息均是从应用的配置文件中获取到,比如服务的接口类全名、服务版本、所属服务组等信息),联同当前服务器的 IP 地址、服务端口等信息进行服务注册发布,如图 3-5 中的步骤③。这个步骤在每一个有服务提供的应用启动时都会自动执行,比如现在有 5 个提供同一服务的应用启动后,此时在配置服务器上就已经保存了提供这一服务的 5 个服务器相关信息。

    3)服务的订阅。

    当作为服务调用者的应用启动时,同样在完成配置服务器列表的获取后,就进行与配置服务器的交互,发送服务消费者相关信息(同样包含了服务的接口全名,服务版本、所属服务组)到配置服务器进行服务的订阅,此时在配置服务器上会通过服务接口全名+服务版本作为匹配条件在当前配置服务器的内存中进行搜索,一旦获取到对应的服务注册信息,则将对应的服务提供者的服务器组 IP 地址及端口返回给服务调用者所在的应用节点上,此时也就完成了服务调用者端对于它所需要调用的服务提供者服务器列表信息,用于在服务真正交互时使用。服务订阅过程如图 3-5 中的步骤④⑤。

    4)服务规则的推送(如果需要)。

    如果没有上文提到对于服务安全管控、流量控制等需求的时候,对于 Diamond 服务器的使用并不是必需的,在有这样的需求场景时,可通过 Diamond 提供的规则设置界面,可以对指定服务的服务提供者和调用者设置相关的规则,一旦保存规则后,则此规则配置将会在 5 秒内推送到与所设置服务相关的服务节点上。如图 3-5 中的步骤⑥。

    5)服务交互。

    在应用进行业务请求处理过程中,出现了服务调用者对服务提供者的调用时,服务调用者会从已经保存在该应用节点上的服务提供者服务器列表中选择(阿里巴巴内部使用随机模式)其中一台进行服务请求的发送,服务交互期间完全是服务调用者和服务提供者间两台服务器间的,无需通过中间服务器的中转,这就是相比于“中心化” ESB 模式,所有服务交互都需要“中心” ESB 进行服务路由,而当前这种架构称为“去中心化”的主要原因。如图 3-5 中的步骤⑦。

    阿里巴巴的分布式服务框架核心是以服务化的方式构建整个应用体系的同时,要保证在高并发的情况下,服务具备高效交互、高可用性和扩展能力。接下来对于 HSF 框架如何给服务提供以上能力具体加以说明。

    1、HSF 框架采用 Netty + Hession 数据序列化协议实现服务交互

    HSF 框架中采用如今流行的网络通信框架 Netty 加上 Hession 数据序列化协议实现 HSF 服务间的交互,主要考虑点是在大并发量时,服务交互性能达到最佳。这类 RPC 协议采用多路复用的 TCP 长连接方式,在服务提供者和调用者间有多个服务请求同时调用时会共用同一个长连接,即一个连接交替传输不同请求的字节块。它既避免了反复建立连接开销,也避免了连接的等待闲置从而减少了系统连接总数,同时还避免了 TCP 顺序传输中的线头阻塞(head-of-line blocking)问题。

    Hessian 是 HSF 框架中默认使用的数据序列化协议,在数据量较小时性能表现出众,Hessian 的优点是精简高效,同时可以跨语言使用,目前支持 Java, C++, .net, Python, ruby 等语言。另外 Hessian 可以充分利用 Web 容器的成熟功能,在处理大量用户访问时很有优势,在资源分配、线程排队、异常处理等方面都可以由 Web 容器保证。

    HSF 框架同时也支持切换使用 Java 序列化,Hession 相比 JDK 标准的序列化方式(即基于 Serializable 接口的标准序列化),在典型场景中,其序列化时间开销可能缩短 20 倍。虽然 Hessian 不是最快的序列化协议,但它对于复杂业务对象的序列化正确率、准确性相较于最稳定的 Java 序列化并不逊色太多。

    业界还有一些比 Hessian 更快的序列化协议,但它们相对于 Hessian 在复杂场景下的处理能力还是会差一些,所以 Hessian 是在性能和稳定性同时考虑下最优的序列化协议。

    阿里巴巴当时在对多种通信协议和数据序列化组件等测试中,Netty + Hession 的组合在互联网高并发量的场景下,特别是在 TPS 上达到 10w 以上时,性能和效率远比 REST 或者 Web Service 高。

    2、HSF 框架的容错机制

    因为要保证服务的高可用性,所以在生产环境部署中一定会有多个应用实例作为服务提供者提供某一相同服务。

    基于之前所提到的服务框架的运行原理的说明,在进行服务调用时,服务调用者端已经保存了它所需要调用的服务提供者的服务器列表信息(如图 3-6 中为例,则保存了三台服务提供者所在服务器的列表)。

    当采用随机方式获取其中一台进行服务交互时(如图 3-6 步骤①),不管是第一台服务器已经某种故障造成了服务请求无法响应,还是该服务器已经接收了服务请求,在进行服务请求处理过程中出现了服务器故障(比如宕机、网络问题),造成该服务器没有在规定的时间(一般服务调用会设置到期时间)返回服务处理的结果,服务调用者端则会获取到服务调用失败的反馈(如图 3-6 步骤②)。

    在 HSF 服务调用的代码中会立即从剩下的服务提供者服务器列表中选择另外一个服务器再次进行服务请求(如图 3-6 步骤③),这一次这个服务提供者实例正常提供了此次服务的请求(如图 3-6 步骤④),从而保证了在个别服务提供者出现故障时,完全不会影响该服务正常提供服务。

    图 3-6 HSF 服务框架实现服务高可用性原理示意图

    同时,因为配置服务器是采用长连接的方式与服务节点进行网络通讯,一旦发现有服务提供者实例出现故障,配置服务器在秒级就会感知到(如图 3-6 步骤⑤),此时会将出问题这台服务提供者的信息从该服务的服务器列表中删除,并将更新后的服务器列表采用推送的方式同步给与该服务相关的所有服务调用者端(如图 3-6 步骤⑥),这样当下次服务调用者再进行此服务的调用时,就不会因为随机的方式再次对已经停止服务提供的服务器发起服务的调用。

    3、HSF 框架的线性扩展支持

    作为 HSF 框架设计之初,最为重要的一个特性就是服务能力的可扩展性。也就是真正的做到某个服务的业务处理能力能随着服务器资源的增加得到线性的增长。

    其实在传统架构中一直也会强调平台的扩展能力,但均会程度不一的出现服务节点数量到达一定量后,出现阻碍平台服务能力扩展的问题,有的是出现网络传输的瓶颈、也有服务节点接入数量上的限制,前文所描述的 ESB 架构带来的“雪崩”效应也均是这类架构给服务能力的扩展带来影响的原因所在。

    如图 3-7 中所描述的场景,当服务面对较大的服务调用压力或将要面临如天猫双11大促、秒杀等活动前,已有的服务提供者各服务器水位(CPU、内存、IO等)处于比较高的情况或现有服务能力满足不了业务访问量的要求时,则需要通过增加服务节点数量的方式提升该服务的服务处理能力。

    图 3-7 HSF 服务框架对服务能力线性扩展支持1

    此时,只需要通过增加该服务的服务提供者实例(如图 3-8 所示,增加了一个服务),基于 HSF 框架的运行机制,新增加的服务提供者实例一旦应用启动完成后,可在几秒内开始进行服务请求的处理(主要完成服务注册发布、更新后服务列表推送到服务调用者端),从而达到分担其他服务器实例压力的作用,实现服务能力整体水位恢复到正常的状态(如图 3-9)。

    图 3-8 HSF服务框架对服务能力线性扩展支持2

    图 3-9 HSF 服务框架对服务能力线性扩展支持3

    正是基于 HSF 框架这一特性,从而真正实现了只要增加服务实例就能实现该服务能力扩展的目标,目前在阿里巴巴共享服务事业部中多个服务中心在天猫双 11 那天各自所部署的服务实例节点数量均超过 2000,即同一个服务由超过 2000 个服务实例同时提供负载均衡的服务。

    本文节选自机械工业出版社《企业IT架构转型之道——阿里巴巴中台战略思想与架构实战》第 3 章。

    展开全文
  • 一个C++编写的服务器框架 - bifang

    万次阅读 多人点赞 2021-04-24 15:06:07
    一个C++编写的简单服务器框架 - bifang简介框架简介1. 源代码目录结构2. 日志模块3. 协程相关4. Socket相关5. TcpServer模块6....html/ html文件目录(与对应的网络服务配合使用) module/ 应用文件目录 s

    框架简介

    bifang是一个依赖少,可复刻性高的基于协程的简单服务器框架

    1. 源代码目录结构

    • configs/ 配置文件目录

    • create/ 应用生成脚本目录

    • html/ html文件目录(与对应的网络服务配合使用)

    • module/ 应用文件目录

    • src/ 源代码目录

    • test/ 测试文件目录

    2. 日志模块

    • 支持流式和格式化的日志风格, 支持日志格式自定义, 可通过配置文件进行配置

    • 目前支持文件名, 文件行号, 程序运行时间, 线程id, 协程id, 日志时间, 线程名称, 日志级别等配置

    • 使用之前需在当前代码文件调用NameLogger(name), RootLogger()或者SystemLogger(), 以定义一个全局的日志器

    • 流式日志使用: log_debug << “bifang log”;

    • 格式化日志使用: log_fmt_debug("%s", “bifang log”);

    • 更多使用方法详见src/log.cpp, src/log.h, configs/log.json

    3. 协程相关

    • 协程封装: 该协程基于ucontext_t来实现用户态的线程, 比线程更轻量级

    • 协程调度器: 用于管理协程的调度, 内部为一个线程池, 协程可以在多个线程中切换, 也可以指定协程在固定的线程中执行. 是一个N-M的协程调度模型, N个线程, M个协程, 重复利用每一个线程

    • IO协程调度模块: 继承于协程调度器, 内部封装了epoll, 支持定时器功能, 支持任意fd读写事件的添加,删除,取消功能. 支持一次性定时器, 循环定时器, 条件定时器等

    • hook封装: 参考腾讯的libco代码, 通过hook系统层面上的部分API, 使协程调度器接管系统api的非阻塞的过程, 可以把复杂的异步调用,封装成同步操作. 降低业务逻辑的编写复杂度. hook的开启控制是线程粒度的, 可以自由选择(在实现对应的hook函数的情况下任何fd均可被接管)

    4. Socket相关

    • 封装了Socket类, 提供所有socket API功能, 统一封装了地址类,将IPv4和IPv6地址在一定程度上统一起来. 并提供对应的域名, IP解析功能。

    5. TcpServer模块

    • 基于Socket类, 封装了一个通用的TcpServer类, 可以快速绑定一个或多个地址, 启动服务, 监听端口, 接收连接, 处理socket连接等功能. 后续的http, websocket均继承自该类

    6. HTTP模块

    • 使用Ragel来编写HTTP/1.1和uri解析的代码

    • uri正则表达式可参照(RFC 3986: http://www.ietf.org/rfc/rfc3986.txt), 里面有详细的说明, 官方的正则与ragel的语法稍有不同, 需参照ragel官方使用文档来进行适当修改

    • http请求和响应解析参照了Mongrel2进行实现的

    • Servlet模块: 仿照java的servlet, 实现了一套Servlet接口, 并支持uri的精准匹配, 模糊匹配等功能.

    • websocket模块: 基于http实现了简单的websocket模块, 和HTTP, servlet一起配合提供网络服务

    7. 配置模块

    使用JSON格式文件作为配置文件(JSON不支持注释, 所以不能对配置文件注释, 可以自行保存一份备份文件后再去大幅度修改配置信息). 支持变更通知功能, 支持STL容器(vector, forward_list, list, set, unordered_set, map, unordered_map), 支持自定义类型的支持(需要自行实现序列化和反序列化方法)

    8. 模块生成脚本

    • 进入 create/ 目录, 执行命令 ./create.sh 模块名, 即可在module目录下生成对应名称的模块模板, 并且自动添加编译信息进Makefile里面, 可在生成之后进去module目录编译以验证是否生成成功

    9. 应用模块目录

    目前基于前面的http, websocket, servlet来实现了几个简单模块, 需要根据系统环境作出适当修改才可以正确运行

    联系方式

    作者: bifang
    QQ: 1125498083
    邮箱: 1125498083@qq.com
    博客地址: https://blog.csdn.net/weixin_43798887
    github: https://github.com/bifang-fyh/bifang

    展开全文
  • C++高性能服务器框架 - sylar

    千次阅读 2019-05-21 11:09:37
    C++高性能服务器框架 - sylarsylar视频教程地址开发环境项目路径日志系统配置系统日志系统整合配置系统协程库封装socket函数库http协议开发分布协议推荐系统其他信息 ...C++服务器框架04_日志系统04_formatt...

    sylar

    视频教程地址

    1. C++服务器框架01_日志系统01
    2. C++服务器框架02_日志系统02_logger
    3. C++服务器框架03_日志系统03_appender
    4. C++服务器框架04_日志系统04_formatter
    5. C++服务器框架05_日志系统05_formatter2
    6. C++服务器框架06_日志系统06_编译调试
    7. C++服务器框架07_日志系统07_完善日志系统
    8. C++服务器框架08_日志系统08_完善日志系统2
    9. C++服务器框架09_配置系统01_基础配置
    10. C++服务器框架10_配置系统02_yaml
    11. C++服务器框架11_配置系统03_yaml整合
    12. C++服务器框架12_配置系统04_复杂类型的支持
    13. C++服务器框架13_配置系统05_更多stl容器支持
    14. C++服务器框架14_配置系统06_自定义类型的支持
    15. C++服务器框架15_配置系统07_配置变更事件
    16. C++服务器框架16_配置系统08_日志系统整合01
    17. C++服务器框架17_配置系统09_日志系统整合02
    18. C++服务器框架18_配置系统10_日志系统整合03

    开发环境

    Centos7
    gcc 9.1
    cmake
    vim

    项目路径

    bin – 二进制
    build – 中间文件路径
    cmake – cmake函数文件夹
    CMakeLists.txt – cmake的定义文件
    lib – 库的输出路径
    Makefile
    sylar – 源代码路径
    tests – 测试代码

    日志系统

    1)
    仿照Log4J定义结构

    			    Logger (定义日志类别)
    			       |                                                  
    			       |-------Formatter(日志格式)----- FormatterItem 
    			       |
    			    Appender(日志输出地方)
    			      |
    	      ------------------------
    	      |                      |
      FileLogAppender         StdoutLogAppender
    

    配置系统

    Config --> Yaml

    yamp-cpp: github 搜
    mkdir build && cd build && cmake … && make install

    YAML::Node node = YAML::LoadFile(filename);
    node.IsMap()
    for(auto it = node.begin();
        it != node.end(); ++it) {
            it->first, it->second
    }
    
    node.IsSequence()
    for(size_t i = 0; i < node.size(); ++i) {
        
    }
    
    node.IsScalar();
    

    配置系统的原则,约定优于配置:

    template<T, FromStr, ToStr>
    class ConfigVar;
    
    template<F, T>
    LexicalCast;
    
    //容器片特化,目前支持vector
    //list, set, map, unordered_set, unordered_map
    // map/unordered_set 支持key = std::string
    // Config::Lookup(key) , key相同, 类型不同的,不会有报错。这个需要处理一下
    

    自定义类型,需要实现sylar::LexicalCast,片特化
    实现后,就可以支持Config解析自定义类型,自定义类型可以和常规stl容器一起使用。

    配置的事件机制
    当一个配置项发生修改的时候,可以反向通知对应的代码,回调

    日志系统整合配置系统

    logs:
        - name: root
          level: (debug,info,warn,error,fatal)
          formatter: '%d%T%p%T%t%m%n'
          appender:
            - type: (StdoutLogAppender, FileLogAppender)
              level:(debug,...)
              file: /logs/xxx.log
    
        sylar::Logger g_logger = sylar::LoggerMgr::GetInstance()->getLogger(name);
        SYLAR_LOG_INFO(g_logger) << "xxxx log";
    
    static Logger::ptr g_log = SYLAR_LOG_NAME("system"); //m_root, m_system-> m_root 当logger的appenders为空,使用root写logger
    
    //定义LogDefine LogAppenderDefine, 偏特化 LexicalCast,
    //实现日志配置解析
    
    
    

    遗留问题:

    1. appender定义的formatter读取yaml的时候,没有被初始化
    2. 去掉额外的调试日志

    协程库封装

    socket函数库

    http协议开发

    分布协议

    推荐系统

    其他信息

    1. 个人主页
    2. 项目源码
    展开全文
  • 阿里HSF(服务框架

    万次阅读 2019-06-02 20:00:28
    HSF(服务框架) 简介 高速服务框架 HSF (High-speed Service Framework),是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。 HSF 联通不同的业务系统,解耦系统间的实现依赖。HSF 从分布式应用的层面,统一了服务的...

    HSF(服务框架)

    简介

    高速服务框架 HSF (High-speed Service Framework),是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。

    HSF 联通不同的业务系统,解耦系统间的实现依赖。HSF 从分布式应用的层面,统一了服务的发布/调用方式,从而帮助方便、快速的开发分布式应用,以及提供或使用公共功能模块,并屏蔽了分布式领域中的各种复杂技术细节,如:远程通讯、序列化实现、性能损耗、同步/异步调用方式的实现等。

    架构设计

    在这里插入图片描述

    HSF 纯客户端架构的 RPC 框架,本身是没有服务端集群的,所有的 HSF 服务调用都是服务消费方(Consumer)与服务提供方(Provider)点对点进行的。然而,为了实现整套分布式服务体系,HSF 还包含了其他组件,完整的组件如下:

    Provider——服务提供者

    通常是某个业务系统,提供相关的业务服务,一般都是个服务集群。业务系统初期使用HSF,通过引入SDK的方式。后期阿里定制化改造了容器(tomcat/docker),通过配置完成HSF的接入使用,作为架构中的服务提供方。对业务系统本身(war/jar)不造成侵入性。

    Consumer——服务消费者

    通常也是某个业务系统集群,跟服务提供者非常类型,只是服务、消费角度区别。

    ConfigServer——配置服务器

    HSF 依赖注册中心进行服务发现,如果没有注册中心,HSF 只能完成简单的点对点调用。因为作为服务提供端,没有办法将自己的服务信息对外发布,让外界知晓;作为服务消费端,可能已经知道需要调用的服务,但是无法获取能够提供这些服务的机器。而ConfigServer就是服务信息的中介,提供服务发现的能力。

    • 注册与订阅

      服务注册——在服务提供方启动时,完成该服务的注册——上报当前服务的ip:port、服务类名方法名、版本号、分组等信息。

      服务订阅——在服务消费方启动时,完成某些服务的订阅——通过订阅的服务标识(类名+方法名+版本号等),在内存中查找相关服务,一旦找到则将服务提供者的IP端口等信息推送给当前服务消费方,以便消费。

    • 长连接与内存级
      服务提供方与服务消费方均与配置服务器保持长连接,一旦服务提供方发生变化,会立即被通知,更新内存中的列表数据,并同步给订阅该服务的服务消费方。

    Diamond——持久化配置中心

    持久化的配置中心用于存储 HSF 服务的各种治理规则,HSF 客户端在启动的过程中会向持久化配置中心订阅各种服务治理规则,如白名单、权限、路由规则、归组规则、权重规则等,从而根据规则对调用过程的选址逻辑进行干预。持久化配置中心的角色是由 Diamond组件承担的。

    当需要时,用户通过在界面上设计规则,Diamond会快速的将新的规则推送给相关的服务提供方

    addressServer——地址服务

    地址服务器的职责是保存上文的ConfigServer与Diamond服务器的地址列表。在consumer、provider启动时,会首先以域名访问的方式访问地址服务器,从地址服务器获取到ConfigServer与Diamond服务器的地址列表信息,以便访问。

    元数据存储

    并没有在图中展示出来。元数据是指 HSF 服务对应的方法列表以及参数结构等信息,元数据不会对 HSF 的调用过程产生影响,因此元数据存储中心也并不是必须的。但考虑到服务运维的便捷性,HSF客户端在启动时会将元数据上报到元数据存储中心,以便提供给服务运维使用。元数据存储中心的角色是由 Redis 承担的。

    完成初始化后,服务调用者内保存了相关的服务信息,通过内部设置的调用方式(如随机访问一台,权重等)可以进行点对点的调用。
    其内部通过NIO多路复用(Netty)+Hessian序列化实现RPC调用,使用Hessian主要是压测表现出稳定性以及高效的综合特性。

    展开全文
  • 分布式、集群、分布式服务框架

    千次阅读 2018-02-22 16:19:45
    分布式服务框架一般可以分为以下几个部分, (1)RPC基础层: 包括底层通信框架,如NIO框架、通信协议,序列化和反序列化协议, 以及在这几部分上的封装,屏蔽底层通信细节和序列化方式差异 (2)服务发布/消费: ...
  • 高性能分布式游戏服务器框架

    万次阅读 2017-05-21 22:39:46
    欢迎大家Fork mqant开源框架 为什么决定要重新造一个轮子? 目前网上优秀的开源游戏服务器框架也不少(当然与web框架比起来就少太多了),但总结起来都各有各的优缺点,下面列出我在选型过程中的一些考量,希望大家能...
  • 开源游戏服务器框架汇总

    千次阅读 2019-11-11 17:01:15
    有哪些开源游戏服务器框架,值得学习呢。基于node.js 、java、C#、golang 、c++、python 等技术栈有各种各样的游戏框架。 本文收集一些比较常用的 github上star和fork有一定数量的较为完整的框架 skynet 云风大神的...
  • 蒙OS开源代码精要解读之—— 系统服务框架子系统(服务启动) 作者介绍: 中科创达OpenHarmony研究组 说明: 中科创达OpenHarmony研究组第一时间对https://codechina.csdn.net/openharmony上开源的代码进行了详尽...
  • 安卓没有删除谷歌服务框架

    千次阅读 2018-11-08 14:02:22
    安卓没有删除谷歌服务框架 对于安卓手机来说,谷歌服务框架是一切的基础,安装它之后才能继续安装其他应用,为什么呢?因为只有安装了这个服务之后,才可能装Google Play不出现问题,那么安卓真的会删除谷歌服务框架...
  • 分布式服务框架的服务治理

    千次阅读 2017-04-02 21:10:00
    分布式服务框架服务治理的一些点~~~
  • 工作中到底有哪些开源游戏服务器框架,该去值得学习呢? 囊括到node.js 、java、C#、golang 、c++、python 等技术栈有各种各样的游戏框架。 本文给大家总结了一些github上star和fork比较常用的且有一定数量的较为...
  • c++ lua服务器框架

    千次阅读 2017-01-23 17:58:27
    Humble是c++、lua语言开发的多线程服务器框架,网络底层使用libevent。 目前支持MQTT、WebSocket、Http等协议。 一、编译Humble windows使用vs2015; linux使用mklib.sh编译依赖库,然后再mk.sh。 二、配置文件 ...
  • DSF分布式服务框架

    万次阅读 2018-11-26 16:59:23
    发布服务: 在basic层发布服务 服务是:@Service(&amp;amp;quot;dataAuthorizationService&amp;amp;quot;) 在spring-dsf-exporter.xml配置文件中发布服务配置: &amp;amp;amp;lt;dsf:exporter ...
  • 分布式服务框架的概念理解

    千次阅读 2018-09-04 22:21:47
    Dubbo分布式服务框架的概念理解 Dubbo是是一个高性能,基于Java的RPC框架,由阿里巴巴开源。一个分布式的服务框架。可以实现SOA(面向服务的架构)架构。 Dubbo使用的公司:京东、当当、阿里巴巴、中国电信等等。 ...
  • Android手机安装谷歌服务框架

    千次阅读 2019-09-12 17:28:10
    当然一键换机并不能把全部的设置都配置过去,在谷歌服务框架上就出了些问题。新手机上并没有安装好谷歌服务框架,我怎么忍受得了。而且 Go 谷歌安装器好像在 Android 8 上并不能用。于是只好自己手动安装服务框架。 ...
  • 选择SD框架助力企业开发今年年底历时2年多的迭代,这是SD框架硕果满满的一年,通过不断的迭代和改进SD框架已经在圈内有良好的口碑,不少新生的框架借鉴了SD的设计思想,SD框架也被不少创业型公司和大型企业使用。...
  • java轻量级后端应用服务器从零开始一步步搭建到上线运行(一) java 轻量级http服务器框架源码 简介一, 开发 准备和工具二, idea 创建空白项目三, http框架核心源码四, http接口开发五, http服务器本地运行,调试 ...
  • 荐书:《架构探险:从零开始写分布式服务框架》 一线技术专家 全方位解析 分布式服务框架底层技术细节 手把手教你 搭建一个完整的符合自身需求的 分布式服务框架 随着互联网浪潮风起云涌,互联网行业...
  • 安装谷歌服务框架方法有很多,比如用第三方 rec卡刷gapps包、用第三方工具安装......然而这些对于新手来说还是比较难的!我今天说的方法可以说是最简单的:1、不需要修改文件;2、不需要借助第三方软件;3、卸载方便...
  • java之socket服务框架

    千次阅读 2017-03-20 13:47:40
    本文从实战角度构建一个适合中小型项目开发的socket服务框架。这里需要具有一定的java基础,比如线程知识,socket通信基础。1.服务端设计与实现这里我们将服务器端与客户端通信模型为per-connection per-thread,即一个...
  • Google Play上的APP普遍比国内应用商店的要干净得多,...3、开始安装Google服务框架和Google Play image 整个过程无需SS,在国内网络即可完成。 最后,连上SS,登录Google Play,开始下载干净的app吧,少年。 ...
  • 于是就在网络上查询相关的资料,但发现目前网络上的开源游戏服务器框架相对较少,而目前市面上已有的一些开源游戏框架又不太对自己的胃口。正好17年初刚回公司的时候事情比较少,就抽时间按照自己对游戏服务器的架构...
  • golang的开源游戏服务器框架

    千次阅读 2018-05-04 19:50:12
    golang的游戏服务器框架有leaf, cellnet, mqant等. 一. 选择 cellnet好像使用callback回调方式, 直接pass. mqant使用了mqtt协议, 感觉写了太多, 有点复杂, 也pass了. 以上两个都没看源码, 就是看介绍的感觉. ...
  • GAPPS顾名思义就是指谷歌旗下的应用程序,这里特指运行在Android平台上面的谷歌程序,包括底层的通信服务(GSM服务、谷歌服务框架)和可视的应用程序如谷歌地图、GMAIL、谷歌音乐等,因为Android系统自身的不断更新...
  • 谷歌服务框架

    千次阅读 2014-05-08 11:46:16
    最重要的就是以google 服务框架为首, Google Play服务等一大批重要的谷歌服务。 网上找了好久,都是各种APK包 appkg上找到一个集合贴,都是ZIP补丁,刷入可用! 真正的Google服务框架! 请根据自身系统...
  • 有时候下载了一个游戏之后,经常会提示我们没有谷歌服务框架无法运行。那接下来小编就来教你们如何安装谷歌服务框架吧! 步骤一:打开浏览器输入“谷歌空间”,点击搜索; 步骤二:找到“Google空间官网”点击进去...
  • nodejs+express搭建自己的服务框架

    万次阅读 2017-11-19 20:05:53
    应用nodejs中Express框架可以很容易的生成一个应用框架,通过 Express 应用创建应用只是众多方法中的一种。都是开源的嘛框架,你可以修改它让它符合你的需求。...1.3、启动服务 2、目录解读 3、目录结构调整 3.
  • 《C#分布式服务器框架》尝试

    千次阅读 热门讨论 2018-05-18 18:27:02
    最近看了一大堆的分布式服务器框架,然后自己也向尝试着搭建一个,也算是对自己能力的一种总结吧,经过这些年,发现自己错过的东西太多啦,需要好好努力,才能不被时代给淘汰。我准备参考skynet的框架,来搭建一个C#...
  • 网上有很多开源服务器框架,但总感觉用起来不大顺手。于是乎,我利用闲余时间,开发整理了一套自己的分布式游戏服务器框架。这套框架到如今也差不多成型了,于是我准备写一些相应的文章,介绍下这套框架里的一些关键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,228,118
精华内容 491,247
关键字:

服务框架