ServiceMesh概述

在软件体系结构中,服务网格是专用的基础结构层,用于通常使用Sidecar代理来促进微服务之间的服务之间通信。

具有这样一个专用的通信层可以提供许多好处,例如,提供对通信的可观察性,提供安全的连接,或针对失败的请求自动进行重试和后退。

以上为维基百科对于服务网格的解释,服务网格基于当前的微服务的进一步的发展演进,其实本质上服务发现、服务熔断等内容仍然是服务网格的核心内容,但是服务网格进一步抽象提炼了微服务中的公共组件的功能,并添加了对于这些公共的基础组件的管理能力,从而达到了对微服务的服务治理的能力。

ServiceMesh的演进

本段通过例子来演示一下服务架构的演进。

单体应用
from flask import Flask, jsonifyapp = Flask(__name__)def service_b():res = {}print(" call service_b ")for i in range(5):try:res.update({"service_b": "service_b_msg"})breakexcept Exception as e:print(e)return res@app.route('/service_a')
def service_a():res = {"service_a": "servic_a_msg"}res.update(service_b())return jsonify(res)if __name__ == '__main__':app.run()

最开始的单体应用,此时运行该应用,访问http://127.0.0.1:5000/service_a就会返回对应的结果,在api中访问了service_b函数,如果service_b函数有异常错误处理的话都需要再service_b函数中处理,最终返回结果。此时当项目处在初期的时候,单体应用是开发速度较高的选择。

单体应用到多服务

随着访问量和业务逻辑的迭代,service_a所承载的逻辑与service_b承载的逻辑越来越多,单应用无论开发上线或者测试都变得越来越臃肿,上线越来越繁琐,业务迭代频率越来越低。此时需要对着两个业务进行分拆。

服务A
import requestsfrom flask import Flask, jsonifyapp = Flask(__name__)def get_service_b():res = {}print(" call service_b ")for i in range(5):try:resp = requests.get("http://127.0.0.1:5001/service_b")if resp.status_code == 200:res.update(resp.json())breakexcept Exception as e:print(e)return res@app.route('/service_a')
def service_a():res = {"service_a": "servic_a_msg"}res.update(get_service_b())return jsonify(res)if __name__ == '__main__':app.run(port=5000)
服务B
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/service_b')
def service_b():res = {"service_b": "service_b_msg"}return jsonify(res)if __name__ == '__main__':app.run(port=5001)

此时通过服务A和服务B的改造,此时service_b通过暴露API的形式对服务A提供服务,此时从代码的实现角度来看,需要手工改造服务A调用服务B的过程。并且要再代码中指定服务B的地址。此时的版本能够先满足当前两个服务独立迭代开发独立部署上线的需求。

多服务到微服务

由于业务访问量的提高,需要动态的部署多个服务B,并且能够通过对服务B的访问进行限流、访问出错重试、对服务A尽量的业务无感知的进行添加,故进化到了微服务阶段。第二阶段中的服务始终是单点的服务,并且加了服务B之后,对于服务B的状态的处理等都需要细化处理,在大规模的服务开发运维情况下,需要完善对服务的治理功能,对于每一个提供服务的应用都衍生了如下需求;

#mermaid-svg-imPrLt1cgyj61m79 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-imPrLt1cgyj61m79 .label text{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .node rect,#mermaid-svg-imPrLt1cgyj61m79 .node circle,#mermaid-svg-imPrLt1cgyj61m79 .node ellipse,#mermaid-svg-imPrLt1cgyj61m79 .node polygon,#mermaid-svg-imPrLt1cgyj61m79 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-imPrLt1cgyj61m79 .node .label{text-align:center;fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .node.clickable{cursor:pointer}#mermaid-svg-imPrLt1cgyj61m79 .arrowheadPath{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-imPrLt1cgyj61m79 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-imPrLt1cgyj61m79 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-imPrLt1cgyj61m79 .edgeLabel rect{opacity:0.9}#mermaid-svg-imPrLt1cgyj61m79 .edgeLabel span{color:#333}#mermaid-svg-imPrLt1cgyj61m79 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-imPrLt1cgyj61m79 .cluster text{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-imPrLt1cgyj61m79 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-imPrLt1cgyj61m79 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-imPrLt1cgyj61m79 .actor-line{stroke:grey}#mermaid-svg-imPrLt1cgyj61m79 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-imPrLt1cgyj61m79 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-imPrLt1cgyj61m79 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-imPrLt1cgyj61m79 .sequenceNumber{fill:#fff}#mermaid-svg-imPrLt1cgyj61m79 #sequencenumber{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-imPrLt1cgyj61m79 .messageText{fill:#333;stroke:#333}#mermaid-svg-imPrLt1cgyj61m79 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-imPrLt1cgyj61m79 .labelText,#mermaid-svg-imPrLt1cgyj61m79 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-imPrLt1cgyj61m79 .loopText,#mermaid-svg-imPrLt1cgyj61m79 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-imPrLt1cgyj61m79 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-imPrLt1cgyj61m79 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-imPrLt1cgyj61m79 .noteText,#mermaid-svg-imPrLt1cgyj61m79 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-imPrLt1cgyj61m79 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-imPrLt1cgyj61m79 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-imPrLt1cgyj61m79 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-imPrLt1cgyj61m79 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .section{stroke:none;opacity:0.2}#mermaid-svg-imPrLt1cgyj61m79 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-imPrLt1cgyj61m79 .section2{fill:#fff400}#mermaid-svg-imPrLt1cgyj61m79 .section1,#mermaid-svg-imPrLt1cgyj61m79 .section3{fill:#fff;opacity:0.2}#mermaid-svg-imPrLt1cgyj61m79 .sectionTitle0{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .sectionTitle1{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .sectionTitle2{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .sectionTitle3{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-imPrLt1cgyj61m79 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .grid path{stroke-width:0}#mermaid-svg-imPrLt1cgyj61m79 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-imPrLt1cgyj61m79 .task{stroke-width:2}#mermaid-svg-imPrLt1cgyj61m79 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .taskText:not([font-size]){font-size:11px}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-imPrLt1cgyj61m79 .task.clickable{cursor:pointer}#mermaid-svg-imPrLt1cgyj61m79 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-imPrLt1cgyj61m79 .taskText0,#mermaid-svg-imPrLt1cgyj61m79 .taskText1,#mermaid-svg-imPrLt1cgyj61m79 .taskText2,#mermaid-svg-imPrLt1cgyj61m79 .taskText3{fill:#fff}#mermaid-svg-imPrLt1cgyj61m79 .task0,#mermaid-svg-imPrLt1cgyj61m79 .task1,#mermaid-svg-imPrLt1cgyj61m79 .task2,#mermaid-svg-imPrLt1cgyj61m79 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutside0,#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutside2{fill:#000}#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutside1,#mermaid-svg-imPrLt1cgyj61m79 .taskTextOutside3{fill:#000}#mermaid-svg-imPrLt1cgyj61m79 .active0,#mermaid-svg-imPrLt1cgyj61m79 .active1,#mermaid-svg-imPrLt1cgyj61m79 .active2,#mermaid-svg-imPrLt1cgyj61m79 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-imPrLt1cgyj61m79 .activeText0,#mermaid-svg-imPrLt1cgyj61m79 .activeText1,#mermaid-svg-imPrLt1cgyj61m79 .activeText2,#mermaid-svg-imPrLt1cgyj61m79 .activeText3{fill:#000 !important}#mermaid-svg-imPrLt1cgyj61m79 .done0,#mermaid-svg-imPrLt1cgyj61m79 .done1,#mermaid-svg-imPrLt1cgyj61m79 .done2,#mermaid-svg-imPrLt1cgyj61m79 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-imPrLt1cgyj61m79 .doneText0,#mermaid-svg-imPrLt1cgyj61m79 .doneText1,#mermaid-svg-imPrLt1cgyj61m79 .doneText2,#mermaid-svg-imPrLt1cgyj61m79 .doneText3{fill:#000 !important}#mermaid-svg-imPrLt1cgyj61m79 .crit0,#mermaid-svg-imPrLt1cgyj61m79 .crit1,#mermaid-svg-imPrLt1cgyj61m79 .crit2,#mermaid-svg-imPrLt1cgyj61m79 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-imPrLt1cgyj61m79 .activeCrit0,#mermaid-svg-imPrLt1cgyj61m79 .activeCrit1,#mermaid-svg-imPrLt1cgyj61m79 .activeCrit2,#mermaid-svg-imPrLt1cgyj61m79 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-imPrLt1cgyj61m79 .doneCrit0,#mermaid-svg-imPrLt1cgyj61m79 .doneCrit1,#mermaid-svg-imPrLt1cgyj61m79 .doneCrit2,#mermaid-svg-imPrLt1cgyj61m79 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-imPrLt1cgyj61m79 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-imPrLt1cgyj61m79 .milestoneText{font-style:italic}#mermaid-svg-imPrLt1cgyj61m79 .doneCritText0,#mermaid-svg-imPrLt1cgyj61m79 .doneCritText1,#mermaid-svg-imPrLt1cgyj61m79 .doneCritText2,#mermaid-svg-imPrLt1cgyj61m79 .doneCritText3{fill:#000 !important}#mermaid-svg-imPrLt1cgyj61m79 .activeCritText0,#mermaid-svg-imPrLt1cgyj61m79 .activeCritText1,#mermaid-svg-imPrLt1cgyj61m79 .activeCritText2,#mermaid-svg-imPrLt1cgyj61m79 .activeCritText3{fill:#000 !important}#mermaid-svg-imPrLt1cgyj61m79 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-imPrLt1cgyj61m79 g.classGroup text .title{font-weight:bolder}#mermaid-svg-imPrLt1cgyj61m79 g.clickable{cursor:pointer}#mermaid-svg-imPrLt1cgyj61m79 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-imPrLt1cgyj61m79 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-imPrLt1cgyj61m79 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-imPrLt1cgyj61m79 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-imPrLt1cgyj61m79 .dashed-line{stroke-dasharray:3}#mermaid-svg-imPrLt1cgyj61m79 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 .commit-id,#mermaid-svg-imPrLt1cgyj61m79 .commit-msg,#mermaid-svg-imPrLt1cgyj61m79 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-imPrLt1cgyj61m79 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-imPrLt1cgyj61m79 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-imPrLt1cgyj61m79 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-imPrLt1cgyj61m79 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-imPrLt1cgyj61m79 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-imPrLt1cgyj61m79 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-imPrLt1cgyj61m79 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-imPrLt1cgyj61m79 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-imPrLt1cgyj61m79 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-imPrLt1cgyj61m79 .edgeLabel text{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-imPrLt1cgyj61m79 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-imPrLt1cgyj61m79 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-imPrLt1cgyj61m79 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-imPrLt1cgyj61m79 .note-edge{stroke-dasharray:5}#mermaid-svg-imPrLt1cgyj61m79 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-imPrLt1cgyj61m79 .error-icon{fill:#522}#mermaid-svg-imPrLt1cgyj61m79 .error-text{fill:#522;stroke:#522}#mermaid-svg-imPrLt1cgyj61m79 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-imPrLt1cgyj61m79 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-imPrLt1cgyj61m79 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-imPrLt1cgyj61m79 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-imPrLt1cgyj61m79 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-imPrLt1cgyj61m79 .marker{fill:#333}#mermaid-svg-imPrLt1cgyj61m79 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-imPrLt1cgyj61m79 {color: rgba(0, 0, 0, 0.75);font: ;}

应用
业务逻辑
服务发现
限流熔断
负载均衡

如上罗列了小部分的需求,其中除了业务逻辑之外,像服务发现等需求都是统一的,可以考虑做成sdk的形式提供给开发人员使用,这样就可以专注与业务逻辑的开发,微服务的代码的开发如下;

服务A
from flask import Flask, jsonifyfrom sdk import serviceapp = Flask(__name__)def get_service_b():res = {}print(" call service_b ")result = service.get_service("service_b", "service_b")if result:res.update(result)return res@app.route('/service_a')
def service_a():res = {"service_a": "servic_a_msg"}res.update(get_service_b())return jsonify(res)if __name__ == '__main__':app.run(port=5000)

此时服务A的最大变化就是引入了sdk中的service实例来进行调用服务b,这其中使用了etcd来做服务发现,此时所有的服务发现、负载均衡都包含再了sdk中来实现。

服务B
import sys
import os
import signal
from flask import Flask, jsonifyfrom sdk import serviceapp = Flask(__name__)if len(sys.argv) > 1:connect_msg = sys.argv[1]
else:connect_msg = "127.0.0.1:5001"details = connect_msg.split(":")
host = details[0]
port = details[1]def unregister(sig, frame):print("unregister service")service.discover.unregister("service_b", connect_msg)os._exit(0)def register_service():service.discover.register("service_b", connect_msg)register_service()@app.route('/service_b')
def service_b():res = {"service_b": "service_b_msg"}return jsonify(res)if __name__ == '__main__':signal.signal(signal.SIGINT, unregister)app.run(host, port)

在服务B中,需要先调用sdk中的服务注册的函数,并在退出的时候调用取消服务注册的函数,此时服务并就提供运行的功能。

sdk模块
import random
import timeimport etcd3
from threading import Lock, Thread
from etcd3.events import PutEvent, DeleteEvent
import requestsclass ServiceDisover(object):def __init__(self, host="127.0.0.1", port=2379, prefix="service"):self.host = hostself.port = portself.prefix = prefixself.etcd_client = etcd3.client(self.host, self.port)self.connects = {}self.lock = Lock()self.start_watch()def start_watch(self):t = Thread(target=self.watch_service)t.start()def register(self, service_name, connect_msg):if not service_name or not connect_msg:raise Exception(" args error")path = self.prefix + "/" + service_name + "/" + connect_msgself.etcd_client.put(path, "value")def unregister(self, service_name, connect_msg):if not service_name or not connect_msg:raise Exception(" args error")path = self.prefix + "/" + service_name + "/" + connect_msgself.etcd_client.delete_prefix(path)def get_services(self, service_name, selector):with self.lock:if service_name not in self.connects:returnreturn selector.choose(self.connects[service_name])def decode_service_key(self, event):print("event key  ", event.key)service = event.key.decode("utf-8")print("event key  ", service)services = service.split("/")if len(services) != 4:print("error  event  {0}".format(services))returnreturn services[2], services[3]def watch_service(self):print("start watch ", self.prefix)vents_iterator, cancel = self.etcd_client.watch_prefix(self.prefix)  # 监听etcd中aaa键 是否发生改变,for event in vents_iterator:if isinstance(event, PutEvent):res = self.decode_service_key(event)print("put event  ", res)if res is None:continuewith self.lock:service_name = res[0]service_connect_msg = res[1]if service_name not in self.connects:self.connects[service_name] = [service_connect_msg]else:if service_connect_msg not in self.connects[service_name]:self.connects[service_name].append(service_connect_msg)elif isinstance(event, DeleteEvent):res = self.decode_service_key(event)print("delete event  ", res)if res is None:continuewith self.lock:service_name = res[0]service_connect_msg = res[1]if service_name not in self.connects:print("not found service_name : {0} in connects ".format(service_name))continueif service_connect_msg in self.connects[service_name]:self.connects[service_name].remove(service_connect_msg)else:print('not exists event  {0}'.format(event))class RandomLoadBalance(object):"""负载均衡 简单的随机选择"""def choose(self, values):if len(values) == 0:returnreturn random.choice(values)class RateBucketLimit(object):"""熔断限流"""def __init__(self, limit_time=1, rate=1):self.historys = []# 安装秒级限流,如一秒钟一个令牌self.rate = rate# 限制时间 即多长的时间内产生总共多个的bucket 秒self.limit_time = limit_time# 桶总共多大self.bucket = int(self.limit_time*self.rate)self.lock = Lock()def allow(self, n=1):# 获取毫秒时间戳millis = int(round(time.time() * 1000))with self.lock:if len(self.historys) == 0:if self.bucket >= n:for i in range(n):self.historys.append(millis)return Truereturn Falsefor i, v in enumerate(self.historys):if millis - v <= self.limit_time*1000:breakcan_allow_n = int(int((millis - v)/1000)*self.rate)if can_allow_n >= n:for i in range(n):self.historys.append(millis)if len(self.historys) > self.bucket:self.historys = self.historys[-self.bucket:]return Truereturn Falseclass Service(object):def __init__(self, host, port=2379, prefix="/service"):self.discover = ServiceDisover(host, port, prefix)self.limit = RateBucketLimit(limit_time=5)self.selector = RandomLoadBalance()self.retry = 5def get_service(self, service_name, uri):if self.limit.allow():host = self.discover.get_services(service_name, self.selector)if host is None:print("not found host ")returnretry_count = 0while retry_count < self.retry:try:resp = requests.get("http://" + host + "/" + uri)if resp.status_code == 200:return resp.json()print(" response status_code error ", resp.status_code)retry_count += 1except Exception as e:print("requests error  ", e)retry_count += 1else:print(" api limit  ")service = Service("192.168.12.120")

sdk的代码内容主要就是通过etcd来实现服务发现,实现了负载均衡、API限流控制和失败重试,这些代码都是每个微服务应用都需要的功能。

此时运行的顺序为先运行服务A;

python service_a_sdk.py
start watch  /service* Serving Flask app "service_a_sdk" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

接着再运行两个服务B;

python service_b_sdk.py 127.0.0.1:5001
start watch  /service* Serving Flask app "service_b_sdk" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off
event key   b'/service/service_b/127.0.0.1:5001'
event key   /service/service_b/127.0.0.1:5001
put event   ('service_b', '127.0.0.1:5001')* Running on http://127.0.0.1:5001/ (Press CTRL+C to quit)
python service_b_sdk.py 127.0.0.1:5002
start watch  /service
event key   b'/service/service_b/127.0.0.1:5002'
event key   /service/service_b/127.0.0.1:5002
put event   ('service_b', '127.0.0.1:5002')* Serving Flask app "service_b_sdk" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5002/ (Press CTRL+C to quit)

此时我们再访问http://127.0.0.1:5000/service_a就可看出我们通过封装好的sdk实现了服务B启动就可以加入到服务中,在退出时就退出,并提供了API限流功能。(sdk代码仅限功能演示,有许多不完善的地方,只是作为功能的演示而已)。至此基础的微服务的架构基本搭建完成。

ServiceMesh进化

在第三步的服务中,提供的sdk是基于python实现的,如果换了技术栈的话就需要通过实现不同的sdk来提供服务,限制了使用场景。在sdk升级的过程中,会导致每个不同的服务需要进行sdk版本的升级,会加剧sdk的管理难度。基于如上的种种因素,ServiceMesh出现了。

#mermaid-svg-nTJbKx26eqlJC13a .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-nTJbKx26eqlJC13a .label text{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .node rect,#mermaid-svg-nTJbKx26eqlJC13a .node circle,#mermaid-svg-nTJbKx26eqlJC13a .node ellipse,#mermaid-svg-nTJbKx26eqlJC13a .node polygon,#mermaid-svg-nTJbKx26eqlJC13a .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-nTJbKx26eqlJC13a .node .label{text-align:center;fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .node.clickable{cursor:pointer}#mermaid-svg-nTJbKx26eqlJC13a .arrowheadPath{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-nTJbKx26eqlJC13a .flowchart-link{stroke:#333;fill:none}#mermaid-svg-nTJbKx26eqlJC13a .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-nTJbKx26eqlJC13a .edgeLabel rect{opacity:0.9}#mermaid-svg-nTJbKx26eqlJC13a .edgeLabel span{color:#333}#mermaid-svg-nTJbKx26eqlJC13a .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-nTJbKx26eqlJC13a .cluster text{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-nTJbKx26eqlJC13a .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-nTJbKx26eqlJC13a text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-nTJbKx26eqlJC13a .actor-line{stroke:grey}#mermaid-svg-nTJbKx26eqlJC13a .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-nTJbKx26eqlJC13a .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-nTJbKx26eqlJC13a #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-nTJbKx26eqlJC13a .sequenceNumber{fill:#fff}#mermaid-svg-nTJbKx26eqlJC13a #sequencenumber{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a #crosshead path{fill:#333;stroke:#333}#mermaid-svg-nTJbKx26eqlJC13a .messageText{fill:#333;stroke:#333}#mermaid-svg-nTJbKx26eqlJC13a .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-nTJbKx26eqlJC13a .labelText,#mermaid-svg-nTJbKx26eqlJC13a .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-nTJbKx26eqlJC13a .loopText,#mermaid-svg-nTJbKx26eqlJC13a .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-nTJbKx26eqlJC13a .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-nTJbKx26eqlJC13a .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-nTJbKx26eqlJC13a .noteText,#mermaid-svg-nTJbKx26eqlJC13a .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-nTJbKx26eqlJC13a .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-nTJbKx26eqlJC13a .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-nTJbKx26eqlJC13a .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-nTJbKx26eqlJC13a .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .section{stroke:none;opacity:0.2}#mermaid-svg-nTJbKx26eqlJC13a .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-nTJbKx26eqlJC13a .section2{fill:#fff400}#mermaid-svg-nTJbKx26eqlJC13a .section1,#mermaid-svg-nTJbKx26eqlJC13a .section3{fill:#fff;opacity:0.2}#mermaid-svg-nTJbKx26eqlJC13a .sectionTitle0{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .sectionTitle1{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .sectionTitle2{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .sectionTitle3{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-nTJbKx26eqlJC13a .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .grid path{stroke-width:0}#mermaid-svg-nTJbKx26eqlJC13a .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-nTJbKx26eqlJC13a .task{stroke-width:2}#mermaid-svg-nTJbKx26eqlJC13a .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .taskText:not([font-size]){font-size:11px}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-nTJbKx26eqlJC13a .task.clickable{cursor:pointer}#mermaid-svg-nTJbKx26eqlJC13a .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-nTJbKx26eqlJC13a .taskText0,#mermaid-svg-nTJbKx26eqlJC13a .taskText1,#mermaid-svg-nTJbKx26eqlJC13a .taskText2,#mermaid-svg-nTJbKx26eqlJC13a .taskText3{fill:#fff}#mermaid-svg-nTJbKx26eqlJC13a .task0,#mermaid-svg-nTJbKx26eqlJC13a .task1,#mermaid-svg-nTJbKx26eqlJC13a .task2,#mermaid-svg-nTJbKx26eqlJC13a .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutside0,#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutside2{fill:#000}#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutside1,#mermaid-svg-nTJbKx26eqlJC13a .taskTextOutside3{fill:#000}#mermaid-svg-nTJbKx26eqlJC13a .active0,#mermaid-svg-nTJbKx26eqlJC13a .active1,#mermaid-svg-nTJbKx26eqlJC13a .active2,#mermaid-svg-nTJbKx26eqlJC13a .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-nTJbKx26eqlJC13a .activeText0,#mermaid-svg-nTJbKx26eqlJC13a .activeText1,#mermaid-svg-nTJbKx26eqlJC13a .activeText2,#mermaid-svg-nTJbKx26eqlJC13a .activeText3{fill:#000 !important}#mermaid-svg-nTJbKx26eqlJC13a .done0,#mermaid-svg-nTJbKx26eqlJC13a .done1,#mermaid-svg-nTJbKx26eqlJC13a .done2,#mermaid-svg-nTJbKx26eqlJC13a .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-nTJbKx26eqlJC13a .doneText0,#mermaid-svg-nTJbKx26eqlJC13a .doneText1,#mermaid-svg-nTJbKx26eqlJC13a .doneText2,#mermaid-svg-nTJbKx26eqlJC13a .doneText3{fill:#000 !important}#mermaid-svg-nTJbKx26eqlJC13a .crit0,#mermaid-svg-nTJbKx26eqlJC13a .crit1,#mermaid-svg-nTJbKx26eqlJC13a .crit2,#mermaid-svg-nTJbKx26eqlJC13a .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-nTJbKx26eqlJC13a .activeCrit0,#mermaid-svg-nTJbKx26eqlJC13a .activeCrit1,#mermaid-svg-nTJbKx26eqlJC13a .activeCrit2,#mermaid-svg-nTJbKx26eqlJC13a .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-nTJbKx26eqlJC13a .doneCrit0,#mermaid-svg-nTJbKx26eqlJC13a .doneCrit1,#mermaid-svg-nTJbKx26eqlJC13a .doneCrit2,#mermaid-svg-nTJbKx26eqlJC13a .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-nTJbKx26eqlJC13a .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-nTJbKx26eqlJC13a .milestoneText{font-style:italic}#mermaid-svg-nTJbKx26eqlJC13a .doneCritText0,#mermaid-svg-nTJbKx26eqlJC13a .doneCritText1,#mermaid-svg-nTJbKx26eqlJC13a .doneCritText2,#mermaid-svg-nTJbKx26eqlJC13a .doneCritText3{fill:#000 !important}#mermaid-svg-nTJbKx26eqlJC13a .activeCritText0,#mermaid-svg-nTJbKx26eqlJC13a .activeCritText1,#mermaid-svg-nTJbKx26eqlJC13a .activeCritText2,#mermaid-svg-nTJbKx26eqlJC13a .activeCritText3{fill:#000 !important}#mermaid-svg-nTJbKx26eqlJC13a .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-nTJbKx26eqlJC13a g.classGroup text .title{font-weight:bolder}#mermaid-svg-nTJbKx26eqlJC13a g.clickable{cursor:pointer}#mermaid-svg-nTJbKx26eqlJC13a g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-nTJbKx26eqlJC13a g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-nTJbKx26eqlJC13a .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-nTJbKx26eqlJC13a .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-nTJbKx26eqlJC13a .dashed-line{stroke-dasharray:3}#mermaid-svg-nTJbKx26eqlJC13a #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a .commit-id,#mermaid-svg-nTJbKx26eqlJC13a .commit-msg,#mermaid-svg-nTJbKx26eqlJC13a .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-nTJbKx26eqlJC13a g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-nTJbKx26eqlJC13a g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-nTJbKx26eqlJC13a g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-nTJbKx26eqlJC13a .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-nTJbKx26eqlJC13a .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-nTJbKx26eqlJC13a .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-nTJbKx26eqlJC13a .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-nTJbKx26eqlJC13a .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-nTJbKx26eqlJC13a .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-nTJbKx26eqlJC13a .edgeLabel text{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-nTJbKx26eqlJC13a .node circle.state-start{fill:black;stroke:black}#mermaid-svg-nTJbKx26eqlJC13a .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-nTJbKx26eqlJC13a #statediagram-barbEnd{fill:#9370db}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-state .divider{stroke:#9370db}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-nTJbKx26eqlJC13a .note-edge{stroke-dasharray:5}#mermaid-svg-nTJbKx26eqlJC13a .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-nTJbKx26eqlJC13a .error-icon{fill:#522}#mermaid-svg-nTJbKx26eqlJC13a .error-text{fill:#522;stroke:#522}#mermaid-svg-nTJbKx26eqlJC13a .edge-thickness-normal{stroke-width:2px}#mermaid-svg-nTJbKx26eqlJC13a .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-nTJbKx26eqlJC13a .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-nTJbKx26eqlJC13a .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-nTJbKx26eqlJC13a .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-nTJbKx26eqlJC13a .marker{fill:#333}#mermaid-svg-nTJbKx26eqlJC13a .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-nTJbKx26eqlJC13a {color: rgba(0, 0, 0, 0.75);font: ;}

应用A
业务逻辑A
应用B
业务逻辑B
SidecarA
服务发现A
限流熔断A
负载均衡A
应用C
业务逻辑C
应用D
业务逻辑D
SidecarB
服务发现B
限流熔断B
负载均衡B

然后应用A访问应用C就通过访问SidecarA,然后SidecarA访问SidecarB,SidecarB访问应用C,最后引用C将结果返回给SidecarB,SidecarB返回给SidecarA,最终SidecarA将数据返回给应用A。通过该方式将业务所需的负载均衡、服务发现和API限流等功能都通过Sidecar代理进行管理,从而完成更丰富的管理与微服务的治理功能。通过Sidecar代理,就可以不限制应用的技术栈,不同的技术栈的支持就会更轻松,升级维护就更方便。

此时微服务的整个架构就如下所示;

每个微服务通过sidecar对其他服务进行交互,这是当前服务网格最基础的架构。现阶段服务网格相对较火的是istio,这也是各大云厂商都激烈竞争的一个方向。后续有机会再单独来学习该内容。

总结

本文主要是梳理了一下服务的架构的一个演变的过程,并列举了示例代码来理解,通过微服务的一步步发展,最后演变除了服务网格的架构,并且随着serverless架构被各大云厂商的推崇,在云原生的领域服务网格发展也很火热。后续有机会再深入学习一下有关ServerMesh的实例Istio的内容。由于本人才疏学浅,如有错误请批评指正。

ServiceMesh架构的演变过程概述相关推荐

  1. 高性能、高可用平台架构的演变过程

    转载自 高性能.高可用平台架构的演变过程 开篇概述 在如今移动互联网.互联网+.大数据的时代,各类的互联网网站.平台异常突起,如同雨后春笋,有种"忽如一夜春风来,千树万树梨花开"感 ...

  2. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层...

    目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...

  3. 软件开发架构的演变过程

    软件开发架构的演变过程 单体架构 >分布式架构 >SOA架构 >微服务架构 1.单体架构 就是把所有的功能模块打到一个包里面然后再部署,采用了单体架构的项目被称之为单体应用. 优点: ...

  4. 服务器架构的演变过程

    服务器架构的演变过程 1,传统单一模式 一个项目系统包含所有的功能,如登录,注册,验证,前台展示,后台管理等,所有的功能在一个项目中实现 缺点: 1)不便于维护,系统的每个功能耦合性太高,如果某一个功 ...

  5. 【车载IoT】国标《电动汽车远程服务与管理系统技术规范》:系统架构及协议概述

    国标<电动汽车远程服务与管理系统技术规范>解读三部曲: 系统架构及协议概述: https://blog.csdn.net/XiuHua_Wu/article/details/1135301 ...

  6. 什么是微服务?架构的演变过程

    什么是微服务 一.什么是微服务(microSerive) 1.分布式官网解释 官网: https://www.martinfowler.com/articles/microservices.html ...

  7. 我最近一个项目的架构与演变过程

                想发帖了,记录下最近做的一个项目的架构与演变过程.             首先我不是个爱胡侃的人,所以拿点实际的例子说事,架构并不复杂. 最近做完了一个Web项目,因为这个项 ...

  8. 网络体系架构—运输层协议概述

    一.进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也处于用户功能中的最底层.下面通过一个示意图来说明运输层的作用,图中的 5,4,3,2 ...

  9. ONF组织的SDN架构文档——概述(一)

    1.适用范围 这个文档描述了SDN架构.文档的目的是为ONF工作组未来的工作做详细指导和说明,同时也可以作为ONF对外交流的一个参考文档.它的姊妹文档(框架文档)描述了ONF想要达到的设计目标.此文档 ...

最新文章

  1. 冒泡排序java代码_看动画学算法之:排序冒泡排序
  2. VC 下 64bit 整数的显示和读取格式化字串
  3. ocp 042 第七章:管理方案对象
  4. 【Java自顶向下】面试官:HashMap源码看过吗?我:看过!面试官:好极了,那么来扒一扒吧!
  5. 【大话数据结构算法】哈夫曼树
  6. Github Star过万的阿里学长独家干货分享
  7. chrome中Blackbox Script 黑盒脚本作用及用法
  8. bat中的start
  9. maven命令指定配置文件
  10. 数字鉴相器matlab,一种数字鉴相器的设计.pdf
  11. GoLang json格式化输出
  12. 【网络实验箱02】-odl-neutron北向抓包分析
  13. 常见swap()函数实现和细节讲解
  14. 手机应用游戏开发死机现场之一
  15. 手游虚拟机服务器,手游大话西游虚拟机镜像一键服务端+配套客户端+启动教程+GM后台...
  16. 使用maven编译打包用javac还是eclipse的jdt的问题
  17. 微软Project项目管理软件简介与安装配置
  18. arcgis建筑数据的矢量化(一)
  19. 为什么企业需要两化融合管理体系?
  20. ZYThumbnailTableView类似于小型阅读器

热门文章

  1. 苹果放大招?「廉价版」5G iPhone 将揭晓,M2芯片来袭?
  2. 2021 IDEA大会圆满落幕,一文回顾大会精彩看点
  3. 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
  4. 迁移性好、多用途,港中文提出特征分离的无监督人类三维姿态表征​
  5. 200 个工具分析机器学习十年:开源是大势,工程师是核心
  6. 20行Python代码说清“量子霸权”
  7. 假设检验怎么做?这次把方法+Python代码一并教给你
  8. 苹果裁员逾200人,拿无人驾驶“开刀”
  9. 吴恩达与LG握手合作!
  10. 胜过iPhone XS?Google Pixel的“夜视功能”是怎样炼成的