ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Finagle:构建高并发、协议无关的 JVM RPC 系统——核心抽象与快速上手实战指南

Finagle:构建高并发、协议无关的 JVM RPC 系统——核心抽象与快速上手实战指南 后端RPC框架【免费下载链接】finagleA fault tolerant, protocol-agnostic RPC system项目地址https://gitcode.com/gh_mirrors/fi/finagle点击查看免费下载Finagle 是 Twitter 开源的、运行于 JVM 之上的可扩展 RPC 系统用于构建高并发服务器与客户端。它用一套统一的Service/Filter抽象覆盖多种网络协议且绝大部分核心代码与具体协议解耦。本文以本仓库gh_mirrors/fi/finagle的 README.md 为主线结合 finagle-core 的源码实现与 官方用户指南 中的 Quickstart、ServicesAndFilters 章节讲解 Finagle 的核心编程模型Service、Filter、ServiceFactory并带你用真实可运行的代码搭建一个 HTTP 服务器与客户端HTTP 代理。一、Finagle 是什么根据仓库根目录 README.md 的描述Finagle 是一个可扩展的 RPC 系统an extensible RPC system for the JVM被用于构建高并发服务器high-concurrency servers。它具备以下核心特征统一 API为多种协议实现了一致的客户端与服务器 API高并发设计面向高性能与高并发场景设计协议无关Finagle 的大部分代码是协议无关protocol agnostic的这大大简化了新协议接入的实现成本。项目状态与发布节奏该项目在 Twitter 以及多家其他组织内部用于生产环境并且处于活跃开发与维护状态见 README.md。发布大致按每月一次的节奏进行遵循 semver 会列出公开 API 破坏性变更与运行时行为变化升级前务必阅读。仓库的release分支包含最新稳定版本develop分支每周发布快照Pull Request 一般应提交到develop分支见 CONTRIBUTING.md。注意本文不涉及任何未经证实的性能数字或商业结论只聚焦于从代码与文档中可确认的事实。二、核心抽象Service、Filter 与 ServiceFactoryFinagle 的整个内部结构都围绕Service与Filter展开见 doc/src/sphinx/ServicesAndFilters.rst。理解这三个抽象是使用 Finagle 的前提。1. Service请求到 Future[响应] 的异步函数一个Service本质上就是一个函数接收请求Req返回Future[Rep]——响应或错误的未来承诺。源码 finagle-core/src/main/scala/com/twitter/finagle/Service.scala 中的定义abstract class Service[-Req, Rep] extends (Req Future[Rep]) with Closable { def apply(request: Req): Future[Rep] def close(deadline: Time): Future[Unit] Future.Done def status: Status Status.Open final def isAvailable: Boolean status Status.Open }要点客户端与服务器共用同一抽象客户端持有并使用一个Service实例去发起请求服务器则实现一个Service来处理请求。Service继承Closable可通过close(deadline)释放资源status反映服务可用性isAvailable是其便捷判断。伴生对象Service提供了便捷工厂同一文件 L6-L115Service.mk(f)用函数快速构造服务、Service.const(rep)构造恒定响应服务、Service.pending(svc)包装尚未就绪的服务等。其中Service.mk是最常用的构造方式def mkReq, Rep: Service[Req, Rep] new Service[Req, Rep] { def apply(req: Req): Future[Rep] f(req) }2. Filter应用无关行为的装饰器过滤器用于定义应用无关的行为例如超时、重试、鉴权、日志等。它像洋葱一样包裹Service请求先经过 Filter 再进入 Service响应再从 Service 逐层返回。源码 finagle-core/src/main/scala/com/twitter/finagle/Filter.scala 中的定义abstract class Filter[-ReqIn, RepOut, ReqOut, -RepIn] extends ((ReqIn, Service[ReqOut, RepIn]) Future[RepOut]) { def apply(request: ReqIn, service: Service[ReqOut, RepIn]): Future[RepOut] }四个类型参数使 Filter 既能只做横切不改类型也能做协议/类型转换如 Thrift 结构体 ↔ 业务对象。大多数场景下ReqIn ReqOut、RepIn RepOut因此提供了别名SimpleFilter见 ServicesAndFilters.rsttrait SimpleFilter[Req, Rep] extends Filter[Req, Rep, Req, Rep]一个完整的超时过滤器示例来自 ServicesAndFilters.rstimport com.twitter.finagle.{Service, SimpleFilter} import com.twitter.util.{Duration, Future, Timer} class TimeoutFilterReq, Rep extends SimpleFilter[Req, Rep] { def apply(request: Req, service: Service[Req, Rep]): Future[Rep] { val res service(request) res.within(timer, timeout) // 超时未完成则以超时异常失败 } }这里within(timer, timeout)是Future的方法若在 deadline 内未完成则以超时异常失败该 Future。3. 组合andThenFilter与Service、Filter与Filter之间通过andThen组合见 Filter.scalaval serviceWithTimeout: Service[http.Request, http.Response] timeoutFilter.andThen(service) // 过滤器包服务 → 新服务 val retryWithTimeout: Filter[Req, Rep, Req, Rep] retryFilter.andThen(new TimeoutFilterReq, Rep) // 过滤器组合组合后请求先经过retryFilter再经过timeoutFilter最后到达service。Finagle 自带的 RetryFilter 就是官方重试过滤器实现可配合自定义超时过滤器使用。4. ServiceFactory获取 Service 的抽象在某些模块如连接池中如何获取一个 Service本身是一个重要阶段ServiceFactory正是为此而生见 ServicesAndFilters.rstabstract class ServiceFactory[-Req, Rep] extends (ClientConnection Future[Service[Req, Rep]])它根据一个客户端连接ClientConnection异步地产出一个可派发请求的Service。Finagle 内部大量使用这一抽象客户端与服务端栈中的模块都会被提升lift为ServiceFactory再用前述组合子andThen等组装起来。这也是 Finagle 能够统一管理连接池、重试、负载均衡等横切能力的底层机制。三、快速上手从零搭建 HTTP 服务器与客户端本仓库 doc/src/sphinx/code/quickstart/ 提供了完整的 Quickstart 示例Server、Client、Proxy并附带可自启动的sbt脚本。下面基于这些真实代码讲解。1. 构建配置SBTFinagle 发布在 Maven Central 上因此 SBT 配置非常简单参见 doc/src/sphinx/Quickstart.rstname : quickstart version : 1.0 libraryDependencies com.twitter %% finagle-http % release 版本号注意仓库不再支持 Scala 2.10。具体依赖版本请以 Maven Central 上当前发布版为准并在升级前查阅 CHANGELOG.rst 中的公开 API 破坏性变更说明。2. 编写一个最小 HTTP 服务器完整源码见 doc/src/sphinx/code/quickstart/Server.scalaimport com.twitter.finagle.{Http, Service} import com.twitter.finagle.http import com.twitter.util.{Await, Future} object Server extends App { val service new Service[http.Request, http.Response] { def apply(req: http.Request): Future[http.Response] Future.value( http.Response(req.version, http.Status.Ok) // 立即返回 HTTP 200 ) } val server Http.serve(:8080, service) Await.ready(server) }拆解Service[http.Request, http.Response]请求类型 →Future[响应类型]的函数这里用Future.value立即返回一个与请求同版本协议的 HTTP 200 响应。Http.serve(:8080, service)serve接收绑定目标要暴露的端口与业务Service。服务器负责监听连接、把 HTTP 线协议翻译成http.Request对象、把我们的http.Response翻译回线格式并发回客户端。Await.ready(server)阻塞主线程直到服务器停止服务。运行与验证$ ./sbt runMain Server $ curl -D - localhost:8080 HTTP/1.1 200 OK3. 编写一个 HTTP 客户端客户端反向使用Service我们被给予一个Service去发起请求。完整源码见 doc/src/sphinx/code/quickstart/Client.scalaimport com.twitter.finagle.{Http, Service} import com.twitter.finagle.http import com.twitter.util.{Await, Future} object Client extends App { val client: Service[http.Request, http.Response] Http.newService(www.scala-lang.org:80) val request http.Request(http.Method.Get, /) request.host www.scala-lang.org val response: Future[http.Response] client(request) Await.result(response.onSuccess { rep: http.Response println(GET success: rep) }) }拆解Http.newService(host:port)创建一个连接到目标地址的Service。底层实现见 finagle-core/src/main/scala/com/twitter/finagle/Client.scalanewService(dest: String)会先调用Resolver.evalLabeled(dest)解析目标得到 Name 与 label再构造服务label用于统计指标等展示。发起请求client(request)立即返回Future[http.Response]通过onSuccess注册回调响应到达时打印结果。把服务器与客户端代码合在一起即可组成一个 HTTP 代理参见 doc/src/sphinx/code/quickstart/Proxy.scala用Http.newService拿到上游客户端再在Http.serve的 Service 里把收到的请求转发给上游。四、更多协议与项目模块地图Finagle 的协议无关设计让它能够以统一抽象支撑多种协议。以finagle-http为例Http对象同时实现了Client与Server见 finagle-core/src/main/scala/com/twitter/finagle/package.scala 中的说明。本仓库中可直接探索的协议模块包括模块目录协议/能力finagle-httpHTTP/1.x 客户端与服务器finagle-http2HTTP/2 支持finagle-thriftThrift 协议含 ruby 客户端 finagle-thrift/src/main/ruby/finagle-thriftmuxThriftMuxThrift over Muxfinagle-muxMux 协议含 Wireshark 抓包插件 finagle-mux/src/main/lua/mux_dissector.luafinagle-mysqlMySQL 客户端finagle-redisRedis 客户端finagle-memcachedMemcached 客户端finagle-postgresqlPostgreSQL 客户端finagle-serversetsZooKeeper ServerSets 服务发现从源码结构看见 finagle-core/src/main/scala/com/twitter/finagle/ 与各协议模块每个协议包都实现Client[Req, Rep]/Server[Req, Rep]接口从而复用统一的栈式Stack配置、指标与追踪体系。五、深入阅读与参与社区用户指南本仓库源码形式的用户指南位于 doc/src/sphinx/index.rst涵盖 Quickstart、Futures、ServicesAndFilters、Configuration、Servers、Clients、Names、Metrics、Tracing、Compression、FAQ、Glossary 等完整章节是深入学习 Finagle 的首选资料。API 文档Http、Service、Filter等类型的完整 Scaladoc 可在各模块源码的注释中找到例如 Service.scala、Client.scala、Filter.scala。变更日志CHANGELOG.rst 逐版本记录公开 API 破坏与运行时行为变化ADOPTERS.md 列出使用 Finagle 的组织如 Foursquare、ING Bank、Pinterest、SoundCloud、Tumblr、Twitter 等。贡献仓库要求社区参与者遵循 Twitter 开源行为准则PR 请提交到develop分支详见 CONTRIBUTING.md。项目遵循 Apache License 2.0见 LICENSE。结语通过本文你应当已经掌握Finagle 的定位与项目状态、Service/Filter/ServiceFactory三大核心抽象的语义与组合方式以及如何用真实可运行的代码在一分钟内搭起 HTTP 服务器与客户端。下一步建议对照 doc/src/sphinx/ 下的用户指南继续探索 Futures 并发模型、命名与服务发现Names、负载均衡ApertureLoadBalancers以及指标监控Metrics这些正是 Finagle 支撑 Twitter 生产级高并发服务的关键组件。赞分享后端RPC框架【免费下载链接】finagleA fault tolerant, protocol-agnostic RPC system项目地址https://gitcode.com/gh_mirrors/fi/finagle点击查看免费下载相关推荐tiny-ecs性能优化10个技巧提升游戏系统效率tiny ecs性能优化10个技巧提升游戏系统效率 tiny ecs是一款轻量级的Lua ECSEntity Component System框架专为游后端RPC框架CANN/ops-math正弦算子文档Sin 产品支持情况 | 产品 | 是否支持 | | : | : : | | term Ascend 950PR/Ascend 950DT/term | √算子库人工智能CANNGo Micro v6 快速上手指南Service、Agent 与 Flow 三大核心抽象实战Go Micro v6 快速上手指南Service、Agent 与 Flow 三大核心抽象实战 本文是 go microv6的入门实战指南围绕其三大核心后端微服务AI AgentRPC框架上一篇10个BLIP-image-captioning-large实战应用场景从社交媒体到电商平台下一篇aiofiles 使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表