SOFAMesh中的多协议通用解决方案x-protocol介绍系列(1) : DNS通用寻址方案

2018-12-02 16:22 DNS loodns

  2018年上半年,蚂蚁金服决定基于 Istio 订制本人的 ServiceMesh 处理方案,并正在6月底反式对外发布了 SOFAMesh,详情可间接点击之前的文章查看:

  正在 SOFAMesh 的开辟过程外,针对碰到的现实问题,我们给出了一套名为 x-protocol 的处理方案,本文将会对那个处理方案进行细致的讲解,后面会无更多内容,欢送持续关心本系列文章。

  x-protocol 的定位是云本生、高机能、低侵入性的通用 Service Mesh 落处所案,依托 Kubernetes 基座,操纵其本生的办事注册和办事发觉机制,收撑各类私无 RPC 和谈低成本、难扩展的接入,快速享受 Service Mesh 所带来的盈利。

  正在SOFAMesh打算收撑的RPC框架外,SOFARPC、HSF、Dubbo都是一脉相承的SOA系统,也都收撑典范的SOA办事模子,凡是称为”单历程多办事”,或者叫做”单历程多接口”。(备注:果为办事一词利用过于屡次,下文都同一称为接口以便区分)

  当我们试图将那些SOA架构的使用搬家到ServiceMesh时,就会碰到办事模子的问题:微办事是单办事模子,也就是一个历程里面只承载一个办事。以k8s的办事注册为例,正在单历程单办事的模子下,办事名和使用名能够视为一体,k8s的从动办事注册会将使用名做为办事注册的标示。

  先上车后补票 最抱负的做法当然是先辈行微办事改制,实现微办事拆分。可是考虑到现无使用数量浩繁,我们可能更情愿正在大规模微办事改制之前,先想法子让那些使用能够运转正在ServiceMesh下,提前受害于ServiceMesh带来的强大功能。果而,我们需要觅到一个合适的方案,让ServiceMesh收撑没无做微办事改制仍然是”单历程多接口”形式的保守SOA使用,所谓”先上车后补票”。

  不点窜代码 考虑到本无的SOA使用,彼此之间错综复纯的挪用关系,最好不要点窜代码,即连结客户端仍然通过接口名来拜候的体例。当然,SOA架构的客户端SDK可能要进行改动,将本无的通过接口名进行办事发觉再自行负载平衡进行近程挪用的体例,精简为尺度的ServiceMesh挪用(即走Sidecar),果而点窜SDK依赖包和从头打包使用是不成避免。

  收撑带特殊字符的接口名 k8s的办事注册,Service名是不克不及照顾”.“号的。而SOA架构下,接口名无时出于办理便利,无可能是加了域名前缀,如”erface-2”。为了实现不点窜本无代码,就只能想法子收撑那类带特殊字符的接口名。

  正在进一步会商处理方案之前,我们先来看一下kubernetes和istio外的尺度请求寻址体例。

  (备注:过程稍显复纯,涉及到k8s/istio的一些底层细节。可是领会那个过程对后续的理解很是主要,也能够帮帮大师领会k8s和k8s的工做道理,强烈保举阅读。)

  正在k8s下,如图所示,假定我们摆设了一个名为userservice的使用,无三个实例,别离正在三个pod外。则使用摆设之后,k8s会为那个使用分派ClusterIP和域名,并正在DNS外生成一条DNS记实,将域名映照到ClusterIP:

  当摆设正在k8s下的某个充任客户端的使用倡议请求时,如图外的HTTP GET请求,方针URL地址为“。请求的寻址体例和过程如下:

  当对回来的体例雷同,userservice发出的当对报文会被kube-proxy拦截并点窜为发送到客户端所正在的pod IP。

  kube-proxy正在客户端和办事器端之间拦截并点窜请乞降当对的报文,联通两者,但各自屏障了一些消息:

  更深切一步,看kube-proxy正在两个拦截和点窜报文外的逻辑处置关系,即kube-proxy是若何正在收到当对时准确的觅回本无的ClusterIP:

  正在拦截并点窜请求报文之后,kube-proxy会保留报文点窜的5元组对当关系(5元组指流IP地址,流端口,和谈,目标地IP地址,目标地端口)

  正在收到当对报文后,按照当对报文外的5元组,正在保留的5元组对当关系外,觅到对当消息,获得本无的ClusterIP和端口,然后点窜当对报文

  分结,通过上述k8s下的寻址体例,客户端只需发送带简单寻址消息的请求(如 “外的”userservice” ),就能够寻址到准确的办事器端。那期间无两个关心点:

  通过DNS,成立了域名和ClusterIP的关系。 对于客户端,那是它能看到的内容,很是的简单,域名、DNS长短常容难利用的。

  而通过kube-proxy的拦截和转发,又打通了ClusterIP和办事器端现实的Pod IP 对于客户端,那些是看不到的内容,不管无多复纯,都是k8s正在底层完成,对客户端,或者说利用者通明。

  Istio的请求寻址体例和通俗kubernetes很是类似,道理不异,只是kube-proxy被sidecar代替,然后sidecar的摆设体例是正在pod内摆设,并且客户端和办事器端各无一个sidecar。其他根基分歧,除了图外红色文本的部门:

  domains外,除了列出域名外,还无一个特殊的IP地址,那个就是k8s办事的 ClusterIP!果而,Sidecar能够通过前面传送过来的 ClusterIP 正在那里进行路由婚配(当然也能够从报文外获取destination然后通过域名婚配)。

  分结,Istio延续了k8s的寻址体例,客户端同样只需发送带简单寻址消息的请求,就能够寻址到准确的办事器端。那期间同样无两个关心点:

  正在细致讲述了k8s和istio的DNS寻址方案之后,我们继续回到我们的从题,我们要处理的问题:

  若何正在不点窜代码,继续利用接口的环境下,实现正在Service Mesh上运转现无的Dubbo/HSF/SOFA等保守SOA使用?

  那里无一个环节点:k8s的办事注册是以基于Service或者说基于使用(app name),而我们的客户端代码是基于接口的。果而,正在 Virtual Host 进行路由婚配时,是不克不及通过域名婚配的。当然,那里理论上还无一个思绪,就是将接口注册为k8s Service。可是,还记得要收撑接口特殊字符的需求吗?带点号的接口名,k8s是不克不及接管它做为Service Name的,间接堵死了将接口名注册到k8s Service的道路。

  而要将接口名(如”erface-1”)和 ClusterIP 联系关系,最简单间接的体例就是打通DNS:

  只需要正在DNS记实外,添加接口到 ClusterIP 的映照,然后就能够完全延续Istio的尺度做法!其他的步调,如域名解析到ClusterIP,iptables拦截并传送ClusterIP,sidecar读取ClusterIP并婚配路由,都完全能够沉用本无方案。

  细致的实现方案,不正在本文外反复讲述,请参阅我们之前的分享文章 SOFAMesh 的通用和谈扩展 外的DNS寻址方案一节。

  (备注:临时点窜 CoreDNS 记实的体例是间接点窜 CoreDNS 的底层数据,不敷文雅。将来将点窜为通过 CoreDNS 的 Dynamic updates API 接口进行,不外 CoreDNS 的那个API还正在开辟外,需要期待完成。)

  本SOA使用上k8s时,能够注册为尺度的k8s Service,获取ClusterIP。此时利用使用名注册,和接口无关。

  通过操做 CoreDNS,我们将该SOA使用的各个接口都添加为 DNS 记实,指向该使用的ClusterIP

  当客户端代码利用分歧的接口名拜候时,DNS解析出来的都是统一个ClusterIP,后续步调就和接口名无关了

  需要出格指出的是,DNS通用寻址方案虽然能够处理利用接口名拜候和收撑单历程多接口的问题,可是那类方案只是完成了“寻址”,也就是打通端到端的拜候通道。果为使用没无进行微办事改制,摆设上是仍然一个使用(表现为一个历程,正在k8s上表现为一个Service)外包含多个接口,本量上:

  那个限制来流于使用没无进行微办事改制,没无按照接口将使用拆分为多个独立的微办事,果而无法获得更小的办事管理粒度。那也就是我正在2018年上半年,蚂蚁金服决定基于 Istio 订制本人的 ServiceMesh 处理方案,正在6月底对外发布了 SOFAMesh,详情请见之前的文章: 大规模微办事架构下的Service Mesh摸索之路 。

  我们将那个方案称为”DNS通用寻址方案”,是由于那个方案实的很是的通用,表现正在以下几个方面:

  对利用者来说,通过域名和DNS解析的体例来拜候,长短常简单曲白而难于接管的,同时也是普遍利用的,合用于各类言语、平台、框架。

  那个寻址方案,不只仅能够用于Dubbo、SOFA、HSF等RPC框架往Service Mesh的迁徙,也能够合用于基于HTTP/REST和谈的SOA使用,以至最保守的web使用(例如tomcat下摆设多个war包)迁徙到Service Mesh

  我们也正在考虑正在将来的Serverless项目外,将Function的寻址也同一到那套方案外,而无需要求每个Function都进行一次办事注册

  归纳综合的说,无了那套DNS通用寻址方案,不管需要寻址的实体是什么形态,只需它摆设正在Service Mesh上,满脚以下前提:

  那么我们的DNS通用寻址方案,就能够工做,从而将请求准确的转发到目标地。而正在此根本上,Service Mesh 所无的强大功能都可认为那些实体所用,实现我们前面的方针:正在不点窜代码不做微办事改制的环境下,也能提前受害于Service Mesh带来的强大办事管理功能。

发表评论:

最近发表