關於微服務的一些總結和經驗之談,來看看你都瞭解嗎

2023-01-29 12:01:10

一 談談對微服務的理解

1. 什麼微服務?

  • 微服務是一種軟體開發技術- 面向服務的體系結構(SOA)架構樣式的一種變體,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。

  • 每個服務執行在其獨立的程序中,服務與服務間採用輕量級的通訊機制互相溝通(通常是基於HTTP的RESTful API)。

  • 每個服務都圍繞著具體業務進行構建,並且能夠獨立地部署到生產環境、類生產環境等。

  • 應儘量避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據上下文,選擇合適的語言、工具對其進行構建。

2. 微服務體系

  1. 服務描述
  • 類似服務的說明檔案,簡單但不可或缺。比如,服務呼叫首先要解決的問題就是服務如何對外描述。你對外提供了一個服務,那麼這個服務的服務名叫什麼?呼叫這個服務需要提供哪些資訊?呼叫這個服務返回的結果是什麼格式的?這些就是服務描述要解決的問題。
  1. 註冊中心
  • 下一步要解決的問題就是服務的釋出和訂閱,就是說你提供了一個服務(Provider),如何讓外部(Consumer)想呼叫你的服務的人知道。這個時候就需要一個類似註冊中心(Registry)的角色,服務提供者將自己提供的服務以及地址登記到註冊中心,服務消費者則從註冊中心查詢所需要呼叫的服務的地址,然後發起請求。
  1. 服務架構
  • 通過註冊中心,服務消費者就可以獲取到服務提供者的地址,有了地址後就可以發起呼叫。但在發起呼叫之前你還需要解決以下幾個問題。服務通訊採用什麼協定?是RESTful API還是gRPC?資料傳輸採用什麼方式資料壓縮採用什麼格式?這些通常整合到了我們的服務架構裡面。
  1. 服務監控
  • 一旦服務消費者與服務提供者之間能夠正常發起服務呼叫,你就需要對呼叫情況進行監控,以瞭解服務是否正常。通常來講,服務監控主要包括三個流程,指標收集,資料處理,資料展示。監控是為了發現問題和異常,如果要進一步跟蹤和定位問題,則需要進一步瞭解服務追蹤。
  1. 服務追蹤
  • 除了需要對服務呼叫情況進行監控之外,你還需要記錄服務呼叫經過的每一層鏈路,以便進行問題追蹤和故障定位,最後達到接近問題的目的。服務監控和追蹤可以合併起來,但是要明確各自的職責是不一樣的。
  1. 服務治理
  • 服務監控能夠發現問題,服務追蹤能夠定位問題所在,而解決問題就得靠服務治理了。服務治理就是通過一系列的手段來保證在各種意外情況下,服務呼叫仍然能夠正常進行。

3. 微服務優點

  1. 易於開發和維護

  2. 啟動較快

  3. 區域性修改容易部署

  4. 技術棧不受限

  5. 按需伸縮

4. 微服務缺點

  1. 運維要求較高

  2. 分散式的複雜性

  3. 介面調整成本高

  4. 重複勞動

5. 什麼是gRPC?

  • 是谷歌開源的RPC框架。
  1. 該技術是為了解決什麼問題?

    • 解決了多語言資料傳輸的簡單、通用、高效、安全的問題。
  2. 它的呼叫流程?

    • 以client 呼叫 server 的 add函數為例。

    • 使用者端:gRPC Server

    • 伺服器端:gRPC Stub

    • 互動過程就是使用者端傳送請求到伺服器端,伺服器端處理請求並將結果傳送響應返給使用者端。

  3. 處理請求過程:

    • 使用者端把請求的引數進行序列化,序列化是通過ProtoBuf協定【protobuf】來編碼的,編完碼向伺服器端傳送請求,請求跨網路,基於HTTP2.0協定,

    • 此時伺服器端接收到了請求,伺服器端同樣通過ProtoBuf協定進行解碼,反序列化,發現本地有add函數,將結果序列化,用ProtoBuf協定編碼,通過網路來到使用者端,使用者端通過ProtoBuf協定協定反序列化,把響應的結果用到使用者端的程式程式碼裡。

    • 分析完過程,gRPC不會一個人唱獨角戲,它必須結合ProtoBuf協定協定才能發揮功效。

6. ProtoBuf協定好處?

  • 跨平臺——方便傳輸資料

  • 跨語言——方便解析資料,解析成自己語言的語法結構

  • 比json,xml小而快

7. gPRC和ProtoBuf聯絡?

gRPC要實現跨平臺+跨語言+序列化、反序列化,就要用到ProtoBuf協定來實現。

二 本次微服務專案學習流程梳理

  1. 從微服務入門開始,講解go-micro的transport通訊層grpc原理。以及grpc資料的傳輸序列化和反序列化protobuf的原理

  2. 以業務最簡單的使用者模組為例,串聯gorm等知識,理解如何將模組開發封裝。

  3. 介紹go-micro中的Consul元件實現註冊中心和設定中心的基本原理。利用Docker快速安裝Consul,介紹實際工作中的使用經驗,並將其接入專案。

  4. 介紹go-micro中的Jaeger元件原理和作用。為專案整合鏈路追蹤功能,完成鏈路觀測臺

  5. 熔斷,限流,負載均衡是微服務保穩三劍客,介紹hystrix-go元件原理和作用,介紹限流問題的程式碼包 uber/ratelimit的基本使用

  6. 微服務Go化,一般都是因為在意效能,所以效能監控非常重要。使用Docker快速完成promethues+grafana安裝,並接入專案中,完成效能監控臺

  7. 通過zap 工具進行紀錄檔記錄,統一收集到紀錄檔中心ELK中。再統一設定,將前面的鏈路追蹤、負載均衡、監控紀錄檔等全部整合在一起,完成服務級觀測臺

三 微服務專案一般開發流程梳理

  1. 拉取micro 映象  docker pull micro/micro

  2. 生成模組專案檔案  docker run -rm -v 根目錄:根目錄   -w

  3. .proto檔案 編寫介面

  4. 生成micro.go檔案

  5. 完成model檔案  編寫資料表struct對映體

  6. 編寫reponsitory 檔案,用gorm對資料庫操作

  7. 在service 完成對介面的實現

  8. 針對protoc暴露介面,實現介面(request引數賦值)

  9. 接入各種微服務外掛,如設定、註冊中心,鏈路追蹤,限流,ELK等等

  10. 完成main.go開發,完成微服務專案部署

四 從本次微服務專案中學到了什麼

  • Go微服務架構技術棧以及各層面應用到的服務

  • 在本次微服務專案開發中,可以學習掌握以下技術:
  1. Go語言的使用

  2. Docker、Docker-compose的使用

  3. Proto的使用、編寫、命令

  4. 微服務開發流程:

    • 4.1 建立專案(Docker或go-micro)
    • 4.2 編寫proto檔案,並生成.go檔案
    • 4.3 編寫domain資料庫方面,包含(model層,repository層,service層)等
    • 4.4 編寫Handle層,實現proto定義介面
    • 4.5 編寫common層,設定,mysql,公共函數,jaeger(鏈路追蹤)等
    • 4.6 編寫main函數,完成專案閉環
  5. go-micro目錄生成,使用,介紹,安裝

  6. 微服務元件的認識(註冊中心和設定中心(Consul)、鏈路追蹤(jaeger)、限流(伺服器端)、負載均衡7

  7. (使用者端)、ELk等等)

  8. gorm資料庫開發

  9. Prometheus監控服務

  10. ELK介紹

  11. kibana紀錄檔視覺化

  12. filebeat紀錄檔上傳

  13. logstash收集紀錄檔

  14. elasticsearch 紀錄檔搜尋

  15. zap紀錄檔封裝

五 對於微服務的一些經驗之談

  • Go 語言目前的應用趨勢 Go語言為什麼適合做微服務?

    • 1、Go高並行等特性,更適合大型系統。

    • 2、Go編譯速度快,無依賴環境,更適合容器化

    • 3、Go將會成為雲端計算時代的基礎設施程式語言,特別適合微服務

  • 對於真正微服務專案來說,服務開發只是第一步,容器化、彈性伸縮和可觀測才是真正關鍵。

  • 微服務技術體系

  • 微服務容器化

六 如何學習微服務

1. 微服務如何從0到1

  1. 入門Docker

    • 掌握其在微服務開發中的運用
  2. 掌握微服務必備

    • 註冊中心與設定中心
  3. 掌握微服務觀測

    • 鏈路追蹤系統接入
  4. 掌握微服務保穩

    • 熔斷、限流、負載均衡
  5. 掌握微服務維護

    • 效能監控與紀錄檔系統接入
  6. 掌握微服務部署

    • Docker與K8s部署微服務專案

2. 從功能特性入手

  • 服務間通訊,包括服務治理、負載均衡、服務間呼叫;

  • 服務容錯和異常排查,包括流量整形、降級熔斷、呼叫鏈追蹤;

  • 分散式能力建設,包括微服務閘道器、分散式事務、訊息驅動、分散式設定中心。

  1. 從微服務元件的功能維度來講,服務間通訊是最基礎的功能特性,這個功能模組是最適合作為初學者學習微服務技術的切入點。

  2. 當我們構建起基礎的通訊能力之後,接下來就要考慮如何構建服務容錯能力,提高服務呼叫的穩定性了。

  3. 在這之後,我們就可以從全域性的角度構建一些分散式支援特性。

  4. 這樣,就有了一條難度平緩上升的學習曲線,也不會從入門到放棄了。

七 遇到以下問題怎麼辦?

1.有太多東西沒學沒有足夠的時間心裡很焦慮怎麼辦

題目描述

  • 往往學技術的小夥伴會衝破一個基礎階段,踏上更高的發展階段,當眼界被開啟的時候,你會發現有學多新知識在等著花時間學習,往往這斷時間會出現焦慮情緒,這時候該怎麼辦?

提示:結合自己的經歷,分享下自己的心路歷程,可以將您的答案寫在評論區,與博主和小夥伴一起交流。

建議:

  • 首先能有這樣的想法說明你是有上進心的人,這點在你後面的職業發展中非常重要,焦慮對我們來說誰都會有。誰都一樣,別人估計比你更加焦灼難安。下面給出自己的一些注意點:
  1. 處理情緒上的問題,這麼多年學到的一點是,發現了問題先不著急得出結論,先冷靜分析為什麼會這樣,先把心態和基調放平。

  2. 每個人焦慮的出發點可能都不一樣,但是一樣的是過度的焦慮會適得其反,消耗我們正常的注意力,讓原本正常的狀態受到影響。所以不要過度焦慮,也沒必要,也沒作用(自己思考下是不是)。

  3. 把焦慮轉化為你成長的動力,用好它,適當的焦慮能夠幫你不斷的成長,當你沒有目標的時候,會比過度焦慮更可怕,人往往是在發展中被淘汰的。

2.開發起一個計劃總是遙遙無期,它總被一些非技術性的原因阻撓

題目描述

  • 你往往主張的一項活動,一個話題,一個方向只有你在非常high的進行,別人都不關係,該如何是好?

提示:結合自己的經歷,分享下自己的心路歷程,可以將您的答案寫在評論區,與博主和小夥伴一起交流。

建議:

  • 面對這個問題大家要考慮的一個問題是,你的活動,話題等是否是大家共識的。沒有共識就沒有共同語言,如果你想要達到大家都理解的效果,方便以後開展工作,但是又沒法推進,這時候你可以發揮好你上司的職責,讓他幫助你推廣和實施,只要大家達成共識,認為這件事情是對的,確實需要做,事情就成功一般了,接下來就交給團隊,組織的力量遠超過個人,最終的結果可能會超出你的預期。

3.該如何應對截止日期和從屬關係的壓

題目描述

  • 這個問題一直以來絕大部分人都會面臨,公司的發展業績,領導的業務指標都會佔用你的正常生活,甚至下班和放假在家你也會處於時刻緊張的狀態。

​提示:結合自己的經歷,分享下自己的心路歷程,可以將您的答案寫在評論區,與博主和小夥伴一起交流。

建議:

  • 截止時間帶來的壓力是比領導給的壓力還嚴重,甚至有的時候由於要提前完成事情,連續通宵好幾天。長期處於高壓狀態,導致經常失眠,身體也不是很健康。
  1. 後來意識到這個問題,積极參與這個工期的製作中,讓自己即使沒有心態先放正,對要做的事情有預期,關鍵的時候還能說下自己的想法,要點自己需要的資源,逐步緩解當前現狀。

  2. 回家之後,儘量只做自己喜歡的事情,比如看電影,電視,下棋等。實踐中發現換腦袋帶來的輕鬆感,有助於創造性的工作。

  3. 山一天移不完,飯一天吃不完,凡是不要過早下結論,草草開始,自己先通盤思考下,缺什麼,要什麼,達到什麼。生活和工作儘量劃分開。

八 最後

  • 至此,go-micro微服務專案全部正式完成。

  • 對於微服務和Go感興趣的小夥伴們,都可以與博主聊一聊,分享學習經驗,共同成長

  • 希望大家關注博主和關注專欄,每篇部落格都乾貨滿滿。

歡迎大家加入 夏沫の夢的學習交流群 進行學習交流經驗,點選 夏沫の夢學習交流