<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小米電商 Apache Dubbo-go 微服務實踐

          共 8046字,需瀏覽 17分鐘

           ·

          2022-01-22 22:32

          點擊上方“服務端思維”,選擇“設為星標

          回復”669“獲取獨家整理的精選資料集

          回復”加群“加入全國服務端高端社群「后端圈」


          作者 | 董振興
          出品?|?阿里巴巴中間件


          01

          背景

          Aliware

          2021 年是小米中國區(qū)電商部門變動調(diào)整較大的一年,小米中國區(qū)早期電商、服務體系建立在 Go 語言構建的微服務體系之上,由內(nèi)部自研的 Go 語言微服務框架 koala 支撐起數(shù)以千計的微服務應用。隨著業(yè)務的發(fā)展,新零售體系的成立以及業(yè)務中臺普及與推廣,我們更傾向于擁有豐富生態(tài)的 Java 為主的微服務體系技術選型,新項目及服務大多基于 Apache Dubbo、Spring Cloud 的微服務生態(tài)。


          考慮到服務遷移的巨大成本以及服務穩(wěn)定性的保障,我們最終決定在大范圍投入與使用以 Apache Dubbo 為主的服務體系的同時,保留原有 Go 微服務項目。由于原有跨部門的技術選型差異,留存的服務包含基于 Thrift、gRPC 等不同協(xié)議服務,我們希望多套微服務體系能夠無縫穩(wěn)定地融合。在經(jīng)過大量調(diào)研之后,確定了以 Dubbo+Nacos+etcd+sidecar+mirpc+Dubbo-go 的為核心的一套互通的微服務體系。

          02

          微服務治理

          Aliware


          01


          相關組件


          • mione

          mione 是一套由小米公司新零售效能團隊開源的“項目創(chuàng)建->開發(fā)->測試->發(fā)布->運維” 端到端的系統(tǒng)服務和研發(fā)工具,支持物理機部署、docker 部署、K8s、dockerFile 部署等多種部署形態(tài),通過人工智能、自動化技術的應用助力開發(fā)者提升研發(fā)效能,持續(xù)快速交付有效價值。詳細了解可以通過官網(wǎng):
          http://mone.xiaomiyoupin.com/index#/index

          目前內(nèi)部基于 Java Dubbo 生態(tài)的微服務基本上都托管于 mione,并以 Nacos 為注冊中心,這些服務作為 consumer 基本上通過 Apache Dubbo、side-car 兩種方式實現(xiàn)調(diào)用。


          • koala

          koala 是小米內(nèi)部自研的 Go 語言的微服務框架,基于 etcd 的注冊中心以及 Thrift 協(xié)議。作為服務的提供方,服務注冊將自身元數(shù)據(jù)等信息注冊到 etcd 中,并對外提供 Thrift 的服務。

          Java Dubbo 的 consumer 服務則通過 side-car 兼容 Thrift/gRPC 協(xié)議,基于 etcd 進行服務發(fā)現(xiàn)調(diào)用。

          • sidecar

          sidecar 同樣是小米內(nèi)部自研的用于服務注冊及發(fā)現(xiàn),支持跨服務調(diào)用的組件,名為 soa-agent ,以 side-car 的方式同服務部署于 mione 容器中,服務借助該組件實現(xiàn)兼容協(xié)議的 RPC 調(diào)用,具體技術細節(jié)這里不做詳細介紹。


          • Apache Dubbo-go

          我們以 side-car 的方式解決了 Java 服務的 consumer 到 Go 服務基于 Thrift/gRPC 的調(diào)用,而 Go 服務到新項目,即基于Apache Dubbo 生態(tài)的 Java 服務的調(diào)用,在經(jīng)過大量調(diào)研與參考后,決定使用還在不斷進行迭代的 Apache Dubbo-go。

          Apache Dubbo-go 是當前 Apache Dubbo 多語言支持中較為熱門的項目,社區(qū)也較為活躍。Apache Dubbo-go 由 Go 語言實現(xiàn),繼承了?Apache Dubbo 的設計理念與架構,擁有較好的可擴展性。它能夠架起 Java 和 Go 之間的橋梁,與 gRPC/Apache Dubbo 生態(tài)互聯(lián)互通,這正式對于是我們當前痛點較好的解決方案,所支持的 Nacos 注冊中心也與我們當前中間件的技術選型契合。

          03

          ???????Apache Dubbo-go的應用

          Aliware

          經(jīng)過調(diào)研后,我們選用了當時較為穩(wěn)定的 v1.5.7 版本進行接入。

          Apache Dubbo 官方文檔中提供了使用 Apache Dubbo-go 的一般調(diào)用方式,如下:
          https://dubbo.apache.org/zh/docs/languages/golang/dubbo-go-1.5/quick-start/
          但該方式需要業(yè)務方調(diào)用方嚴格遵守切合服務方提供的接口格式、數(shù)據(jù)格式,因此我們選擇使用泛化的方式進行調(diào)用。


          對于一個 Java 的 Apache Dubbo 服務提供的接口如下:
          public interface DubboHealthService {
          List health(); String ping(String param,int param2); AaRes health1(List list); Health health2(AaReq aaReq);
          }
          //impl@Service(timeout = 1000, group = "dev", version = "4.0")public class DubboHealthServiceImpl implements DubboHealthService { ......}

          Apache Dubbo-go 的 client 配置文件中,需要的核心配置如下:
          # registry configregistries:  "demoNacos":    protocol: "nacos"    timeout: "3s"    address: "xxx.xxx.xxx"    username: "****"    password: "****"    references:  "UserProvider":    registry: "demoNacos"    protocol: "dubbo"    interface: "com.xiaomi.youpin.test0930.api.service.DubboHealthService"    cluster: "failover"    version: "4.0"    group: "dev"    generic: true    methods:      - name: "health"        retries: 0        timeout: "0.5s"     ......

          首先配置對應注冊中心,包括選型及地址,Nacos/zookeeper 等,其次配置需要調(diào)用的具體接口,方法、超時時間等信息。由于我們使用泛化調(diào)用,需要進行配置 generic: true。這里我們在使用 v1.5.7 版本時發(fā)現(xiàn)了關于泛化調(diào)用下方法級別超時時間并不生效的情況,進行了修復,詳細可以參考該 pr:
          https://github.com/apache/dubbo-go/pull/1336


          配置完成后,泛化調(diào)用的方式我們進行了一定的封裝:
          //......var paramTypes []stringvar paramVals []interface{}for _, param := range req.Params {   paramTypes = append(paramTypes, param.GetKey())   paramVals = append(paramVals, param.GetVal())}//添加context信息m := make(map[string]string)m["xxx(generic_flag)"] = "xxx(flag)"//服務端返回json字符串m["xxx(return_flag)"] = "true" ctx = context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), m)//invoke調(diào)用response, err = config.GetRPCService(req.AppName).(*config.GenericService).Invoke(ctx, []interface{}{req.MethodName, paramTypes, paramVals})if err != nil {   err = fmt.Errorf("dubbo call request appName: %s methodName: %s rpc invoke failed,err:%+v", req.AppName, req.MethodName, err)   return}

          這里實際上業(yè)務只需要傳入需要調(diào)用的 Apache Dubbo 方法參數(shù)列表例如 ?["java.lang.String"] 以及參數(shù)值即可。


          為了切合業(yè)務需要,我們在內(nèi)部維護的 Java Dubbo 版本中也做了一定程度的兼容與改造,Apache Dubbo-go 中通過 context,即 attachment 可以帶上兩個特殊標識,服務端的 Java Dubbo 版本中將根據(jù)該特殊標識接收處理與返回以 json 格式的數(shù)據(jù)。


          這樣一來,留存的 Go 服務就能夠使用 Apache Dubbo 協(xié)議與 Java Dubbo 生態(tài)的服務達到互聯(lián)互通,同時也由于 Apache Dubbo 的優(yōu)勢,也具備了一定程度的服務治理能力。


          在線上運行該版本 Apache Dubbo-go 時,也發(fā)現(xiàn)了 Apache Dubbo-go 提供的像黑名單機制等的一些不太合理之處,例如該機制下,當服務端出現(xiàn)報錯后,調(diào)用方會將該服務端的 ip 記錄黑名單,再進行調(diào)用時可能出現(xiàn) no provider 的情況,而實際上服務端可能僅是針對某個請求的處理報錯,服務實際上能夠正常運行,那么這時候該機制便有待商榷,我們實際使用時也是進行了摘除。詳細細節(jié)可見該 pr:
          https://github.com/apache/dubbo-go/pull/1605


          04

          現(xiàn)狀與未來發(fā)展

          Aliware

          01


          當前架構


          目前小米新零售已經(jīng)基于上述 mione 的體系以及上述介紹的這一部分組件,建立了一套較為完善的,包括微服務標準化、可持續(xù)集成部署、以及可見可控的觀測性平臺的服務治理體系。

          在傳統(tǒng)的微服務體系下,我們通常需要滿足兩個服務治理的基本的需求:一站式的服務治理平臺、普適性的服務開發(fā)框架。

          前者我們通過 mione 實現(xiàn)了包括但不限于基于容器化的 CICD、服務的標準化定義、服務的生命周期管理(服務上下線、擴縮容等)、服務的基本通信和鏈路治理(如重試、限流降級熔斷等);而后者我們借助了 Apache DubboApache Dubbo-go 等開源 RPC 框架,結合像 Springboot 這樣的傳統(tǒng)開發(fā)框架提供了較為標準化的服務搭建開發(fā)流程。

          同時,我們內(nèi)部自研了一套可見可觀測性體系,幫助我們獲取更多有價值的數(shù)據(jù)來反饋于服務治理,對服務做到更全面準確的把控。這實際上包括了 3 個層次的工具集合:Logging(日志系統(tǒng))、Metric(度量系統(tǒng)) 以及 Tracing(分布式鏈路追蹤系統(tǒng))


          我們通過上述的架構與設計實際上已經(jīng)基本上滿足了傳統(tǒng)方式下對微服務治理需求,然而,這還不夠。

          05

          未來方向

          Aliware

          01


          Service Mesh 與 Serverless


          • Service Mesh


          首先什么是 Service Mesh?Service Mesh 是一個致力于解決服務間通信的基礎設施層,它負責在現(xiàn)代云原生應用的復雜服務拓撲下實現(xiàn)請求的可靠傳遞,它通常實現(xiàn)為一組輕量級的網(wǎng)絡代理,與應用服務部署在一起,對應用服務透明。

          我們上面架構組件中的 sidecar soa-agent 實際上就是一個 service mesh 的雛形,這個組件目前承擔了包括服務發(fā)現(xiàn)、配置托管等一些能力,當然,他能夠做到的應當更多。對于業(yè)務應用服務的透明以及零侵入是 service mesh 的一大優(yōu)勢,也是當前它正備受推崇的主要原因。

          綜合來看,Service Mesh 主要能夠解決當下傳統(tǒng)微服務體系的幾大痛點:

          1、完善的微服務基礎設施

          service mesh 能夠?qū)⑽⒎盏耐ㄐ畔鲁恋交A設施層,它屏蔽了微服務處理各種通信問題的復雜度。對于業(yè)務開發(fā)者來說,實際上他并不關心像 Rpc 通信、服務注冊與發(fā)現(xiàn)這樣的非功能性細節(jié)。但傳統(tǒng)微服務下,拿 Thrift 舉例,作為開源的一套性能較高的 Rpc 框架,由于它缺乏一些基本的服務治理能力,Thrift 很多時候并無法做到開箱即用,在早期小米電商的基礎架構團隊就對 Thrift 做了定制化的二次開發(fā),在生成的樁代碼中加入了服務發(fā)現(xiàn)、打點等功能,這些代碼再與自研的開發(fā)框架 koala 耦合來實現(xiàn)服務的閉環(huán)調(diào)用。而這些框架代碼以及生成的樁代碼,與業(yè)務代碼也并沒有明顯的隔離與區(qū)分,甚至業(yè)務能夠直接修改框架代碼以及樁代碼,實際上埋下了較大的隱患,也造成后續(xù)升級困難、嚴重阻塞等問題。

          而 service mesh 則可以完美的解決像這樣的痛點,通過對這些能力的下沉,他們將對業(yè)務服務屏蔽實現(xiàn)細節(jié),業(yè)務服務也就不再需要關心包括服務發(fā)現(xiàn)、負載均衡、流量調(diào)度、限流降級熔斷、監(jiān)控統(tǒng)計等一切細節(jié)。

          2、語言無關的通信和鏈路治理

          實際上 service mesh 在功能上并沒有提供對于服務治理的任何新的特性和能力,它所能夠提供的能力在 service mesh 之前其實都能夠找到。service mesh 改變的是通信和服務治理能力的提供方式,它將這些能力從業(yè)務層面解耦,下沉到基礎設施中,以更加標準化和通用的方式來提供,這樣一來它便能屏蔽不同語言、不同平臺的差異性,在多語言、多技術棧的團隊環(huán)境中,它能夠提供膠水般的融合與協(xié)同能力。這也是我們上面小米電商微服務調(diào)用架構圖中 sidecar 所做到的,為跨語言的調(diào)用提供了解決方案。


          3、通信和服務治理的標準化

          通過標準化,帶來一致的服務治理體驗,減少多業(yè)務之間由于服務治理標準不一致帶來的溝通和轉(zhuǎn)換成本,提高全局服務治理的效率。


          鑒于以上 service mesh 帶來的好處,小米電商微服務的架構在未來會進一步在已有基礎上更多的調(diào)研、參考以及參與該技術落地。

          但是,硬幣總有正反面,service mesh 也絕不是僅有優(yōu)點的萬能膏藥。實際上,引入多一層的組件代理轉(zhuǎn)發(fā)請求,本身就不可避免地帶來更多的資源消耗,在一定程度上會降低系統(tǒng)的通信性能。其次,基礎功能與服務解耦有解耦的絕對優(yōu)勢,但侵入式框架反而在支持業(yè)務的定制與擴展能力上反而有先天優(yōu)勢,這點在系統(tǒng)的設計中也應當考慮。第三,系統(tǒng)中對于組件的引入本身也帶來一定的風險,業(yè)務將及其依賴 service mesh 的穩(wěn)定性,在保障 service mesh 的穩(wěn)定性上將帶來更多的技術考驗。

          目前我們對于 service mesh 的用法實現(xiàn)設計如下圖所示,我們通過 Sidecar 的方式,將服務發(fā)現(xiàn)、負載均衡、集群策略、健康檢查以及部分的監(jiān)控打點等下沉到該組件中,該組件對于不同的服務部署方式部署方式稍有不同。例如對于早期的裸物理機部署的老服務來說,該組件與服務部署在同一臺物理機,而對于例如 K8s 這樣的容器部署方式,只需要部署在同一個 Pod ,即共享同一個 ip 即可。

          Sidecar 中開放了一些 OpenAPI,部署在一起的服務只需要訪問 localhost 對應端口的 OpenAPI 即可達到相應的服務治理能力。


          未來小米新零售效能團隊也將在大量的考量與取舍中,更進一步地參與與適配該技術的落地,其中關鍵的一步也將會有對于 Apache DubboApache Dubbo-go 等底層框架的適配與融合,必要地情況下將進行一些定制化的改造。


          02


          Serverless


          什么是 Serverless? Serverless(無服務器架構)指的是由開發(fā)者實現(xiàn)的服務端邏輯運行在無狀態(tài)的計算容器中,它由事件觸發(fā), 完全被第三方管理,其業(yè)務層面的狀態(tài)則被開發(fā)者使用的數(shù)據(jù)庫和存儲資源所記錄。這也是當下比較熱門的方向。

          Serverless 是云原生技術發(fā)展的高級階段,使開發(fā)者更聚焦在業(yè)務邏輯,而減少對基礎架構的關注。它與我們之前說的 service mesh 實際上并不在同一理念上,service mesh 傾向于將基礎能力下沉,業(yè)務服務與代理一同部署。而 Serverless 則干脆希望開發(fā)者不再關注服務器,不再關注服務所需資源,這些資源與能力將由 Serverless 的廠商來提供。開發(fā)者只需要編寫業(yè)務函數(shù)即可(函數(shù)即服務 FaaS)。相同的是,兩者的目的都是為了業(yè)務開發(fā)能夠僅專心于業(yè)務邏輯。


          目前我們小米新零售效能團隊也正在嘗試對一些服務進行 Serverless 化,并提供了一些基礎的能力。這些 Serverless 化的服務在開發(fā)中同樣不需要再關心底層的協(xié)議,無論是 Apache DubboApache Dubbo-go 都會在我們后端的 Serverless 系統(tǒng)中進行兼容與適配,同樣以上的一些列服務治理的能力也將由 Serverless 系統(tǒng)全權托管。


          上圖就是我們目前對于服務 Serverless 化的一個基本的支持邏輯,我們定義了成為 Serverless 服務的 Function 必須實現(xiàn)的接口 execute :
          public interface Handler {    Result execute(Event var1, Context var2);
          default void init(Object... objs) { }
          default String version() { return "0.0.1"; }}

          業(yè)務僅需要實現(xiàn)該接口,并通過平臺配置管理該服務的 git 庫等信息,就可以以 Serverless 的方式開始提供服務,Serverless 系統(tǒng)將自動拉取該 Function 的代碼信息,編譯打包等,提交到核心池中等待執(zhí)行。并且同時,服務將無感知地接入系統(tǒng)提供的服務治理、可觀測性等能力。


          05

          總結

          Aliware

          Dubbo 作為一個老牌的、強大的微服務框架與體系,提供了跨語言的支持,這幫助我們將內(nèi)部不同的技術棧實際上形成了閉環(huán)。而 Apache Dubbo-go 作為 Apache Dubbo 生態(tài)中一個還在不斷迭代發(fā)展的開源項目,會存在一些待完善的小問題,但更能夠切實地幫助到我們搭建與發(fā)展整個云原生微服務體系。同樣的,我們在完善傳統(tǒng)的微服務體系架構的同時,我們也關注與嘗試目前微服務技術的一些發(fā)展方向,像 Serverless、service mesh 這些較為熱門的方向,我們也都將持續(xù)的跟進與參與落地。我們將不斷與像?dubbogo 等開源社區(qū)合作,積極反饋我們使用的經(jīng)驗,參與完善,推動更多此類開源項目的發(fā)展。?

          — 本文結束 —


          ●?漫談設計模式在 Spring 框架中的良好實踐

          ●?顛覆微服務認知:深入思考微服務的七個主流觀點

          ●?人人都是 API 設計者

          ●?一文講透微服務下如何保證事務的一致性

          ●?要黑盒測試微服務內(nèi)部服務間調(diào)用,我該如何實現(xiàn)?



          關注我,回復 「加群」 加入各種主題討論群。



          對「服務端思維」有期待,請在文末點個在看

          喜歡這篇文章,歡迎轉(zhuǎn)發(fā)、分享朋友圈


          在看點這里
          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性猛交XXXX乱大交 | 成人A级视频 | 国外成人在线视频老鸭窝 | 美女免费一级操逼视频 | 日本一级片在线 |