国产精品chinese,色综合天天综合精品网国产在线,成午夜免费视频在线观看,清纯女学生被强行糟蹋小说

    <td id="ojr13"><tr id="ojr13"><label id="ojr13"></label></tr></td>
        • <source id="ojr13"></source>
            <td id="ojr13"><ins id="ojr13"><label id="ojr13"></label></ins></td>

            當(dāng)前位置:文章中心>技術(shù)教程
            公告通知 新聞快遞 技術(shù)教程 產(chǎn)品展示

            如何快速構(gòu)建服務(wù)發(fā)現(xiàn)的高可用能力

            發(fā)布時(shí)間:2022-01-20 點(diǎn)擊數(shù):831

            作者:十眠


            01

            背景

            Cloud Native


            注冊(cè)中心作為承擔(dān)服務(wù)注冊(cè)發(fā)現(xiàn)的核心組件,是微服務(wù)架構(gòu)中必不可少的一環(huán)。在 CAP 的模型中,注冊(cè)中心可以犧牲一點(diǎn)點(diǎn)數(shù)據(jù)一致性(C),即同一時(shí)刻每一個(gè)節(jié)點(diǎn)拿到的服務(wù)地址允許短暫的不一致,但必須要保證可用性(A)。因?yàn)橐坏┯捎谀承﹩?wèn)題導(dǎo)致注冊(cè)中心不可用,或者服務(wù)連不上注冊(cè)中心,那么想要連接他的節(jié)點(diǎn)可能會(huì)因?yàn)闊o(wú)法獲取服務(wù)地址而對(duì)整個(gè)系統(tǒng)出現(xiàn)災(zāi)難性的打擊。
            1 一個(gè)真實(shí)的案例


            全篇從一個(gè)真實(shí)的案例說(shuō)起,某客戶在阿里云上使用 Kubernetes 集群部署了許多自己的微服務(wù),由于某臺(tái) ECS 的網(wǎng)卡發(fā)生了異常,雖然網(wǎng)卡異常很快恢復(fù)了,但是卻出現(xiàn)了大面積持續(xù)的服務(wù)不可用,業(yè)務(wù)受損。
            我們來(lái)看一下這個(gè)問(wèn)題鏈?zhǔn)侨绾涡纬傻模?/span>


            1. ECS 故障節(jié)點(diǎn)上運(yùn)行著 Kubernetes 集群的核心基礎(chǔ)組件 CoreDNS 的所有 Pod,且低版本 Kubernetes 集群缺少 NodeLocal DNSCache 的特性,導(dǎo)致集群 DNS 解析出現(xiàn)問(wèn)題。


            2. 該客戶的服務(wù)發(fā)現(xiàn)使用了有缺陷的客戶端版本(Nacos-client 的 1.4.1 版本),這個(gè)版本的缺陷就是跟 DNS 有關(guān)——心跳請(qǐng)求在域名解析失敗后,會(huì)導(dǎo)致進(jìn)程后續(xù)不會(huì)再續(xù)約心跳,只有重啟才能恢復(fù)。
            3. 個(gè)缺陷版本實(shí)際上是已知問(wèn)題,阿里云在 5 月份推送了 Nacos-client 1.4.1 存在嚴(yán)重 bug 的公告,但客戶研發(fā)未收到通知,進(jìn)而在生產(chǎn)環(huán)境中使用了這個(gè)版本。


              Nacos-client 1.4.1

              風(fēng)險(xiǎn)環(huán)環(huán)相扣,缺一不可。
              最終導(dǎo)致故障的原因是服務(wù)無(wú)法調(diào)用下游,可用性降低,業(yè)務(wù)受損。下圖示意的是客戶端缺陷導(dǎo)致問(wèn)題的根因:


              Provider 客戶端

              1. Provider 客戶端在心跳續(xù)約時(shí)發(fā)生 DNS 異常;
              2. 心跳線程未能正確地處理這個(gè) DNS 異常,導(dǎo)致線程意外退出了;
              3. 注冊(cè)中心的正常機(jī)制是,心跳不續(xù)約,30 秒后自動(dòng)下線。由于 CoreDNS 影響的是整個(gè) Kubernetes 集群的 DNS 解析,所以 Provider 的所有實(shí)例都遇到相同的問(wèn)題,整個(gè)服務(wù)所有實(shí)例都被下線;
              4. 在 Consumer 這一側(cè),收到推送的空列表后,無(wú)法找到下游,那么調(diào)用它的上游(比如網(wǎng)關(guān))就會(huì)發(fā)生異常。

              回顧整個(gè)案例,每一環(huán)每個(gè)風(fēng)險(xiǎn)看起來(lái)發(fā)生概率都很小,但是一旦發(fā)生就會(huì)造成惡劣的影響。服務(wù)發(fā)現(xiàn)高可用是微服務(wù)體系中很重要的一環(huán),當(dāng)然也是我們時(shí)常忽略的點(diǎn)。在阿里內(nèi)部的故障演練中,這一直是必不可少的一個(gè)環(huán)節(jié)。


              02

              面向失敗的設(shè)計(jì)

              Cloud Native


              由于網(wǎng)絡(luò)環(huán)境的抖動(dòng)比如 CoreDns 的異常,或者是由于某些因素導(dǎo)致我們的注冊(cè)中心不可用等情況,經(jīng)常會(huì)出現(xiàn)服務(wù)批量閃斷的情況,但這種情況其實(shí)不是業(yè)務(wù)服務(wù)的不可用,如果我們的微服務(wù)可以識(shí)別到這是一種異常情況(批量閃斷或地址變空時(shí)),應(yīng)該采取一種保守的策略,以免誤推從而導(dǎo)致全部服務(wù)出現(xiàn)"no provider"的問(wèn)題,會(huì)導(dǎo)致所有的微服務(wù)不可用的故障,并且持續(xù)較長(zhǎng)時(shí)間難以恢復(fù)。


              站在微服務(wù)角度上考慮,我們?nèi)绾慰梢郧卸我陨系膯?wèn)題鏈呢?以上的案例看起來(lái)是 Nacos-client 低版本造成的問(wèn)題,但是如果我們用的是 zookeeper、eureka 等注冊(cè)中心呢?我們能拍著胸脯說(shuō),不會(huì)發(fā)生以上的問(wèn)題嗎?面向失敗的設(shè)計(jì)原則告訴我們,如果注冊(cè)中心掛掉了,或者我們的服務(wù)連不上注冊(cè)中心了,我們需要有一個(gè)方式保證我們的服務(wù)正常調(diào)用,線上的業(yè)務(wù)持續(xù)不斷。


              本文介紹的是服務(wù)發(fā)現(xiàn)過(guò)程中的高可用的機(jī)制,從服務(wù)框架層面思考如何徹底解決以上的問(wèn)題。


              1 服務(wù)發(fā)現(xiàn)過(guò)程中的高可用原理解析


              服務(wù)發(fā)現(xiàn)高可用-推空保護(hù)


              面向失敗的設(shè)計(jì)告訴我們,服務(wù)并不能完全相信注冊(cè)中心的通知的地址,當(dāng)注冊(cè)中心的推送地址為空時(shí)候,服務(wù)調(diào)用肯定會(huì)出 no provider 錯(cuò)誤,那么我們就忽略此次推送的地址變更。


              微服務(wù)治理中心

              微服務(wù)治理中心提供推空保護(hù)能力
              • 默認(rèn)無(wú)侵入支持市面上近五年來(lái)的 Spring Cloud 與 Dubbo 框架

              • 無(wú)關(guān)注冊(cè)中心實(shí)現(xiàn),無(wú)需升級(jí) client 版本


              服務(wù)發(fā)現(xiàn)高可用-離群實(shí)例摘除


              心跳續(xù)約是注冊(cè)中心感知實(shí)例可用性的基本途徑。但是在特定情況下,心跳存續(xù)并不能完全等同于服務(wù)可用。
              因?yàn)槿匀淮嬖谛奶#?wù)不可用的情況,例如:

              • Request 處理的線程池滿


              • 依賴的 RDS 連接異常導(dǎo)致出現(xiàn)大量慢 SQL


              • 某幾臺(tái)機(jī)器由于磁盤滿,或者是宿主機(jī)資源爭(zhēng)搶導(dǎo)致 load 很高



                此時(shí)服務(wù)并不能完全相信注冊(cè)中心的通知的地址,推送的地址中,可能存在一些服務(wù)質(zhì)量低下的服務(wù)提供者,因此客戶端需要自己根據(jù)調(diào)用的結(jié)果來(lái)判斷服務(wù)地址的可用性與提供服務(wù)質(zhì)量的好壞,來(lái)定向忽略某些地址。


                微服務(wù)治理中心提供離群實(shí)例摘除
                • 默認(rèn)無(wú)侵入,支持市面上近五年來(lái)的 Spring Cloud 與 Dubbo 框架

                • 無(wú)關(guān)注冊(cè)中心實(shí)現(xiàn),無(wú)需升級(jí) client 版本

                • 基于異常檢測(cè)的摘除策略:包含網(wǎng)絡(luò)異常和網(wǎng)絡(luò)異常 + 業(yè)務(wù)異常(HTTP 5xx)

                • 設(shè)置異常閾值、QPS 下限、摘除比例下限

                • 摘除事件通知、釘釘群告警

                離群實(shí)例摘除的能力是一個(gè)補(bǔ)充,根據(jù)特定接口的調(diào)用異常特征,來(lái)衡量服務(wù)的可用性。
                03

                動(dòng)手實(shí)踐

                Cloud Native

                1 前提條件


                • 已創(chuàng)建 Kubernetes 集群,請(qǐng)參見(jiàn)創(chuàng)建 Kubernetes 托管版集群[1]。

                • 已開(kāi)通 MSE 微服務(wù)治理專業(yè)版,請(qǐng)參見(jiàn)開(kāi)通 MSE 微服務(wù)治理[2]


                2 準(zhǔn)備工作


                開(kāi)啟 MSE 微服務(wù)治理


                1、開(kāi)通微服務(wù)治理專業(yè)版:


                1. 單擊開(kāi)通 MSE 微服務(wù)治理[3]


                2. 微服務(wù)治理版本選擇專業(yè)版,選中服務(wù)協(xié)議,然后單擊立即開(kāi)通。關(guān)于微服務(wù)治理的計(jì)費(fèi)詳情,請(qǐng)參見(jiàn)價(jià)格說(shuō)明[4]。

                2、安裝 MSE 微服務(wù)治理組件:


                1. 容器服務(wù)控制臺(tái)[5]左側(cè)導(dǎo)航欄中,選擇市場(chǎng) > 應(yīng)用目錄
                2. 應(yīng)用目錄頁(yè)面搜索框中輸入 ack-mse-pilot,單擊搜索圖標(biāo),然后單擊組件。
                3. 詳情頁(yè)面選擇開(kāi)通該組件的集群,然后單擊創(chuàng)建。安裝完成后,在命名空間 mse-pilotmse-pilot-ack-mse-pilot 應(yīng)用,表示安裝成功。

                3、為應(yīng)用開(kāi)啟微服務(wù)治理:
                1. 登錄 MSE 治理中心控制臺(tái)[6]。


                2. 在左側(cè)導(dǎo)航欄選擇微服務(wù)治理中心 > Kubernetes 集群列表


                3.  Kubernetes 集群列表頁(yè)面搜索目標(biāo)集群,單擊搜索圖標(biāo),然后單擊目標(biāo)集群操作列下方的管理。


                4. 集群詳情頁(yè)面命名空間列表區(qū)域,單擊目標(biāo)命名空間操作列下方的開(kāi)啟微服務(wù)治理


                5. 開(kāi)啟微服務(wù)治理對(duì)話框中單擊確認(rèn)。

                部署 Demo 應(yīng)用程序


                1. 容器服務(wù)控制臺(tái)[5]左側(cè)導(dǎo)航欄中,單擊集群。
                2. 集群列表頁(yè)面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
                3. 在集群管理頁(yè)左側(cè)導(dǎo)航欄中,選擇工作負(fù)載 > 無(wú)狀態(tài)
                4. 無(wú)狀態(tài)頁(yè)面選擇命名空間,然后單擊使用 YAML 創(chuàng)建資源
                5. 對(duì)模板進(jìn)行相關(guān)配置,完成配置后單擊創(chuàng)建。本文示例中部署 sc-consumer、sc-consumer-empty、sc-provider,使用的是開(kāi)源的 Nacos。

                部署示例應(yīng)用(springcloud)


                YAML:
                				
                # 開(kāi)啟推空保護(hù)的 sc-consumerapiVersion: apps/v1kind: Deploymentmetadata: name: sc-consumerspec: replicas: 1 selector: matchLabels: app: sc-consumer template: metadata: annotations: msePilotCreateAppName: sc-consumer labels: app: sc-consumer spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre - name: spring.cloud.nacos.discovery.server-addr value: nacos-server:8848 - name: profiler.micro.service.registry.empty.push.reject.enable value: "true" image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1 imagePullPolicy: Always name: sc-consumer ports: - containerPort: 18091 livenessProbe: tcpSocket: port: 18091 initialDelaySeconds: 10 periodSeconds: 30# 無(wú)推空保護(hù)的sc-consumer-empty---apiVersion: apps/v1kind: Deploymentmetadata: name: sc-consumer-emptyspec: replicas: 1 selector: matchLabels: app: sc-consumer-empty template: metadata: annotations: msePilotCreateAppName: sc-consumer-empty labels: app: sc-consumer-empty spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre - name: spring.cloud.nacos.discovery.server-addr value: nacos-server:8848 image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1 imagePullPolicy: Always name: sc-consumer-empty ports: - containerPort: 18091 livenessProbe: tcpSocket: port: 18091 initialDelaySeconds: 10 periodSeconds: 30# sc-provider---apiVersion: apps/v1kind: Deploymentmetadata: name: sc-providerspec: replicas: 1 selector: matchLabels: app: sc-provider strategy: template: metadata: annotations: msePilotCreateAppName: sc-provider labels: app: sc-provider spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre - name: spring.cloud.nacos.discovery.server-addr value: nacos-server:8848 image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-provider-0.3 imagePullPolicy: Always name: sc-provider ports: - containerPort: 18084 livenessProbe: tcpSocket: port: 18084 initialDelaySeconds: 10 periodSeconds: 30# Nacos Server---apiVersion: apps/v1kind: Deploymentmetadata: name: nacos-serverspec: replicas: 1 selector: matchLabels: app: nacos-server template: metadata: labels: app: nacos-server spec: containers: - env: - name: MODE value: standalone image: nacos/nacos-server:latest imagePullPolicy: Always name: nacos-server dnsPolicy: ClusterFirst restartPolicy: Always # Nacos Server Service 配置---apiVersion: v1kind: Servicemetadata: name: nacos-serverspec: ports: - port: 8848 protocol: TCP targetPort: 8848 selector: app: nacos-server type: ClusterIP

                我們只需在 Consumer 增加一個(gè)環(huán)境變量 profiler.micro.service.registry.empty.push.reject.enable=true,開(kāi)啟注冊(cè)中心的推空保護(hù)(無(wú)需升級(jí)注冊(cè)中心的客戶端版本,無(wú)關(guān)注冊(cè)中心的實(shí)現(xiàn),支持 MSE 的 Nacos、eureka、zookeeper 以及自建的 Nacos、eureka、console、zookeeper 等)


                分別給 Consumer 應(yīng)用增加 SLB 用于公網(wǎng)訪問(wèn)



                以下分別使用 {sc-consumer-empty} 代表 sc-consumer-empty 應(yīng)用的 slb 的公網(wǎng)地址,{sc-consumer} 代表 sc-consumer 應(yīng)用的 slb 的公網(wǎng)地址。
                3 應(yīng)用場(chǎng)景


                下面通過(guò)上述準(zhǔn)備的 Demo 來(lái)分別實(shí)踐以下場(chǎng)景
                • 編寫(xiě)測(cè)試腳本

                vi curl.sh
                				
                while :do result=`curl $1 -s` if [[ "$result" == *"500"* ]]; then echo `date +%F-%T` $result else echo `date +%F-%T` $result fi  sleep 0.1done


                • 測(cè)試,分別開(kāi)兩個(gè)命令行,執(zhí)行如下腳本,顯示如下


                % sh curl.sh {sc-consumer-empty}:18091/user/rest2022-01-19-11:58:12 Hello from [18084]10.116.0.142!2022-01-19-11:58:12 Hello from [18084]10.116.0.142!2022-01-19-11:58:12 Hello from [18084]10.116.0.142!2022-01-19-11:58:13 Hello from [18084]10.116.0.142!2022-01-19-11:58:13 Hello from [18084]10.116.0.142!2022-01-19-11:58:13 Hello from [18084]10.116.0.142!


                % sh curl.sh {sc-consumer}:18091/user/rest2022-01-19-11:58:13 Hello from [18084]10.116.0.142!2022-01-19-11:58:13 Hello from [18084]10.116.0.142!2022-01-19-11:58:13 Hello from [18084]10.116.0.142!2022-01-19-11:58:14 Hello from [18084]10.116.0.142!2022-01-19-11:58:14 Hello from [18084]10.116.0.142!2022-01-19-11:58:14 Hello from [18084]10.116.0.142!


                并保持腳本一直在調(diào)用,觀察 MSE 控制臺(tái)分別看到如下情況




                • 將 coredns 組件縮容至數(shù)量 0,模擬 DNS 網(wǎng)絡(luò)解析異常場(chǎng)景。


                發(fā)現(xiàn)實(shí)例與 Nacos 的連接斷開(kāi)且服務(wù)列表為空。


                • 模擬 DNS 服務(wù)恢復(fù),將其擴(kuò)容回?cái)?shù)量 2。


                結(jié)果驗(yàn)證


                在以上過(guò)程中保持持續(xù)的業(yè)務(wù)流量,我們發(fā)現(xiàn) sc-consumer-empty 服務(wù)出現(xiàn)大量且持續(xù)的報(bào)錯(cuò)
                2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.597+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.799+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.993+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}


                相比之下,sc-consumer 應(yīng)用全流程沒(méi)有任何報(bào)錯(cuò)

                • 只有重啟了 Provider,sc-consumer-empty 才恢復(fù)正常



                相比之下,sc-consumer 應(yīng)用全流程沒(méi)有任何報(bào)錯(cuò)


                后續(xù)


                我們當(dāng)發(fā)生推空保護(hù)后,我們會(huì)上報(bào)事件、告警至釘釘群,同時(shí)建議配合離群實(shí)例摘除使用,推空保護(hù)可能會(huì)導(dǎo)致 Consumer 持有過(guò)多的 Provider 地址,當(dāng) Provider 地址為無(wú)效地址時(shí),離群實(shí)例摘除可以對(duì)其進(jìn)行邏輯隔離,保證業(yè)務(wù)的高可用。
                04

                Cloud Native


                保障云上業(yè)務(wù)的永遠(yuǎn)在線,是 MSE 一直在追求的目標(biāo),本文通過(guò)面向失敗設(shè)計(jì)的服務(wù)發(fā)現(xiàn)高可用能力的分享,以及 MSE 的服務(wù)治理能力快速構(gòu)建起服務(wù)發(fā)現(xiàn)高可用能力的演示,模擬了線上不可預(yù)期的服務(wù)發(fā)現(xiàn)相關(guān)異常發(fā)生時(shí)的影響以及我們?nèi)绾晤A(yù)防的手段,展示了一個(gè)簡(jiǎn)單的開(kāi)源微服務(wù)應(yīng)用應(yīng)該如何構(gòu)建起服務(wù)發(fā)現(xiàn)高可用能力。