精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

把Go項目從單體擴展成微服務要做哪些工作?

開發 架構
微服務的技術架構一般是什么樣的呢?一般是業務網關負責與客戶端進行對接,網關層會把請求轉發給內部的服務,此外因為拆分了微服務就不可避免地需要使用消息隊列進行業務事件的同步從而達到數據的最終一致性。

微服務該怎么拆

使用微服務架構首先要考慮的一點是,業務里到底應該有哪些服務或者說我有一個單體服務我該怎么把它拆成微服務呢?

這一點要搞不清楚,大概率拆了也白拆,或者是純純給自己增加工作量。這幾年我見過有很多走極端的拆法,有的恨不得一個兩個接口就給你整個微服務。有的則是從一個單體變成了幾個小一點的單體,也不管服務注冊發現什么的,直接上域名給你相互調用。

那么微服務到底該怎么拆呢?其實沒有特別統一的標準,還是靠大家對業務的理解,一個比較常用的方法是對業務進行領域分析后按照子域進行拆分。

這一聊就又聊到領域驅動設計了,很多人看到DDD就嗤之以鼻,不過嗤之以鼻的應該是開發階段的繁瑣,設計階段它的一些思路還是很值得借鑒的,或者說它的思路應該是符合事物發展規律的,你在完全不了解領域驅動設計這個概念前大概率也是按著類似的思路做軟件設計的,只不過老外把方法論提煉出來宣傳的早,所以他們拿到了命名權。

如果我們把子域按照價值維度劃分,可劃分為:核心域、通用域和支撐域

下面是一個敏捷項目管理產品的領域劃分(圖片取自 IDDD 一書)

圖片圖片

  • 核心域:決定產品和公司核心競爭力的子域,它是業務成功的主要因素和公司的核心競爭力。舉個例子來說:****公司是賣貨的,那賣貨就是你們與其它競爭對手的關鍵競爭環節。這就是核心域,就是核心業務。
  • 支撐域:公司在線賣貨,但是用戶在線支付不靈,那公司也發展不起來,所以支付子領域、庫存管理子領域就是支撐域
  • 通用域:沒有太多個性化的訴求,同時被多個子域使用的通用功能的子域-- 比如身份認證角色管理子域、(各種基礎服務?)。如果上升到整個公司的大業務領域,通用域會被每個業務的領域使用。

我們可以通過DDD的方式定義子域,并把子域對應為每一個服務。

圖片圖片

也就是說每個服務應該有自己的領域模型,不能是一個接口就給整個微服務,一個業務整上幾百個服務,這里我不是開玩笑,我真見過,五個人維護上百個服務,我們有的公司的屎山的難度真是太高了。

以上內容參考自實現領域驅動設計(IDDD)和微服務架構設置模式兩本書,也是我推薦大家有時間拿來看的,只看第二本也夠,第一本IDDD翻譯過于晦澀。兩本設計到編程設計的部分都用Java語言寫的,不過大家看起來應該沒有難度。

微服務的技術架構

微服務的技術架構一般是什么樣的呢?一般是業務網關負責與客戶端進行對接,網關層會把請求轉發給內部的服務,此外因為拆分了微服務就不可避免地需要使用消息隊列進行業務事件的同步從而達到數據的最終一致性。

針對Go技術棧來說最簡單的實現微服務架構的方式是使用 Gin / Echo 之類的Web框架做業務網關,內部的各個業務子域的服務使用gRPC,服務發現和注冊可以使用gRPC自帶的 Etcd naming 組件通過Etcd完成微服務的注冊和發現。

我一般喜好在微服務中有一個專門處理接收事件消息然后根據事件類型進行內部服務調用的event服務,這樣做的好處是其他RPC服務在啟動時會更簡單,不用監聽消息隊列。當然這么做肯定是比每個服務都監聽消息要多一次RPC請求的,所以這一條不構成建議,大家可以按自己的偏好來。

把項目擴展成微服務要做哪些工作

下面說一下假如要做微服務,我們專欄中學到的技能要做哪些更新才能讓它適配微服務。

日志組件增加服務名

從單體架構變成微服務架構,日志如果不能串聯和歸因那維護起來肯定會比使用單體架構時還要難上幾倍。我們的項目里封裝的 logger 已經做了日志的trace 和 span 的埋點,直接用到微服務架構下肯定是沒問題的。

不過還是需要增加一些服務標示,這些標識主要是收集日志的日志組件對日志做分類用,做運維的同學應該會比較關注這些字段。

這個不難改,我們只需要在項目logger 的初始化方法中加上它即可。

func New(ctx context.Context) *logger {
var traceId, spanId, pSpanId string
if ctx.Value("traceid") != nil {
  traceId = ctx.Value("traceid").(string)
 }
if ctx.Value("spanid") != nil {
  spanId = ctx.Value("spanid").(string)
 }
if ctx.Value("psapnid") != nil {
  pSpanId = ctx.Value("pspanid").(string)
 }

return &logger{
  ctx:     ctx,
  traceId: traceId,
  spanId:  spanId,
  pSpanId: pSpanId,
        perfix: config.App.Name // 增加日志的服務名前綴
  _logger: _logger,
 }
}

gRPC 服務間怎么傳遞追蹤參數

大家都知道我們日志里的trace_id, span_id 這些追蹤參數在Http 的API接口調用中是通過 Header 往下繼續傳遞的,那如果是網關調內部的RPC服務該怎么把它們繼續傳遞下去呢?

其實跟發HTTP請求可以配置HTTP客戶端攜帶 Header 和 Context 一樣,RPC客戶端也支持類似功能。以 gRPC 服務為例,客戶端調用RPC 方法時,在可以攜帶的元數據里設置這些追蹤參數。

traceID := ctx.Value("trace-id").(string)
traceID := ctx.Value("span-id").(string)
md := metadata.Pairs("xx-traceid", traceID, "xx-spanid", spanID)
// 新建一個有 metadata 的 context
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 單向的 Unary RPC
response, err := client.SomeRPCMethod(ctx, someRequest)

gRPC 的服務端的處理方法里,可以再通過 metadata 把元數據里存儲的追蹤參數取出來。

func (s server) SomeRPCMethod(ctx context.Context, req *xx.someRequest) (reply *xx.SomeReply, err error) {

  remote, _ := peer.FromContext(ctx)
  remoteAddr := remote.Addr.String()
  // 生成本次請求在當前服務的 spanId
  spanID := utils.GenerateSpanID(remoteAddr)

  traceID, pSpanID := "", ""
  md, _ := metadata.FromIncomingContext(ctx)
  if arr := md["xx-tranceid"]; len(arr) > 0 {
      traceID = arr[0]
  }
  if arr := md["xx-spanid"]; len(arr) > 0 {
      pSpanID = arr[0]
  }
  return
}

當然如果我們每個客戶端調用和RPC 服務方法里都這么搞一遍得累死,gRPC 里也有類似全局路由中間件的概念,叫攔截器,我們可以把追蹤參數傳遞這部分邏輯封裝在客戶端和服務端的攔截器里。

gRPC客戶端攔截器

func UnaryClientInterceptor(ctx context.Context, ... , opts ...grpc.CallOption) error {
 md := metadata.Pairs("xx-traceid", traceID, "xx-spanid", spanID)
 mdOld, _ := metadata.FromIncomingContext(ctx)
 md = metadata.Join(mdOld, md)
 ctx = metadata.NewOutgoingContext(ctx, md)

 err := invoker(ctx, method, req, reply, cc, opts...)

 return err
}

// 調用gRPC服務
conn, err := grpc.Dial(*address, grpc.WithInsecure(),grpc.WithUnaryInterceptor(UnaryClientInterceptor))

gRPC服務端攔截器

func UnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
 remote, _ := peer.FromContext(ctx)
 remoteAddr := remote.Addr.String()
 spanID := utils.GenerateSpanID(remoteAddr)

 // set tracing span id
 traceID, pSpanID := "", ""
 md, _ := metadata.FromIncomingContext(ctx)
 if arr := md["xx-traceid"]; len(arr) > 0 {
  traceID = arr[0]
 }
 if arr := md["xx-spanid"]; len(arr) > 0 {
  pSpanID = arr[0]
 }
  // 把 這些ID再搞到 ctx 里,其他兩個就省略了
  ctx := Context.WithValue(ctx, "traceId", traceId)
  resp, err = handler(ctx, req)

  return
}

微服務如何保持數據一致性

上面聊怎么做微服務拆分時我們聊到過,業務領域中的每個子域可以映射為一個服務,每個服務有都自己的領域模型。

微服務架構的一個關鍵特性是每個服務之間都是松耦合的,僅通過 API 或者消息進行通信,這就要求每個服務都擁有自己的私有數據庫,不能是一個服務能連多個庫,如果那樣就當于把自己的領域全都暴露出去了。

那業務規則要求一個操作修改多個庫內的數據實例該怎么辦?

一個合格的微服務,不能在一個業務邏輯中修改自己服務的數據庫的同時又去調用API修改其他服務的數據庫,而應該借助事件消息,完成數據的最終一致性。

上面這一條呢,說是這么說,據我觀察很多時候不是這樣的,所以大家可以把它視做一個參照物,但不用把它奉為圭臬,必須完全遵守。尤其是一些有歷史的老業務,數據庫本就不好按領域做拆分。

那上面聊了如果一個業務操作對A服務的數據做了變更后還需要對B服務里的數據做變更,這個時候我們應該通過事件消息完成服務B的變更。

事件消息也就是發消息隊列對吧,雖然微服務保證的是最終一致性,但我們還是要保證服務內的變更和發送事件消息這兩個操作的原子性的。這個該怎么做呢?

這個就涉及到事件的存儲和發布方式了,通常的做法是首先在本地有一個Events 表,記錄所有領域對象發布的領域事件。

CREATE TABLE `tbl_events` (
`event_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`event_type` varhcar(100) NOT NULL  COMMENT '事件名稱',
`entity_id` bigint(20) unsigned NOT NULL COMMENT '聚合的標識,userId orderId 等數據'
`entity_type` varhcar(100) NOT NULL  COMMENT '聚合類型',
`event_data` varchar(50000) NOT NULL COMMENT '事件Body'
`occurred_on` datetime NOT NULL COMMENT '事件發布時間',
`publis_state` tinyint(3) unsinged NOT NULL COMMENT '發布狀態'
)

圖片圖片

我們在向消息隊列發布事件消息時,要在同一個數據庫事務中先寫Events表再把消息發送給隊列,如果隊列發布失敗,在表中記錄發布失敗后再退出事務。

這里也可以所有服務公用一個事件庫,Events表按照某些維度做垂直拆表,因為Events設計地是通用的不會暴露服務的領域,所以我個人認為多個服務公用一個也沒啥關系。

這樣做的話除了能保證數據的最終一致性外,還有利于我們做好事件溯源,比如一個訂單的狀態在訂單表中只能體現它當前的狀態,它經過了哪些狀態變更是沒法查到的。

有了這個Events表后,我們做事件溯源或者審計類的需求時就會好做很多。比如類似 “給7 天前簽到的用戶發消息”、“把某個商品添加到購物車又刪除的用戶發促銷紅包”等功能,通過分析事件流里的數據會很容易實現。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2018-07-04 14:17:10

微服務代碼開發

2019-01-07 08:10:54

微服務單體 Web

2019-07-31 10:21:15

單體架構微服務

2022-08-22 14:27:30

微服務遷移

2022-12-21 16:13:31

微服務架構

2022-03-29 08:30:15

微服務架構單體架構

2023-12-19 22:29:37

架構微服務系統

2021-06-29 06:42:54

單體架構微服務

2022-04-11 17:33:29

微服務架構單體

2021-10-21 09:10:34

微服務架構數據

2023-10-24 08:00:00

單體架構微服務

2020-05-26 20:36:19

微服務架構轉型

2023-10-12 00:07:27

Service單體微服務

2024-01-19 11:57:42

2019-09-25 08:57:24

單體式架構微服務

2022-08-05 07:37:39

單體架構遷移微服務

2024-11-19 08:10:00

2023-11-01 11:17:26

單體架構微服務架構

2021-01-14 09:55:21

Java微服務Go

2022-08-28 16:36:51

架構開發微服務
點贊
收藏

51CTO技術棧公眾號

亚洲一区国产精品| 在线观看亚洲视频| 91猫先生在线| 国产福利第一视频在线播放| 看片网站欧美日韩| 91精品天堂福利在线观看 | 国产精品一区久久| 免费国产羞羞网站美图| 国产精品高潮呻吟久久久久| 欧美视频在线观看免费| 亚洲精品无人区| 超碰福利在线观看| 日日摸夜夜添夜夜添亚洲女人| 精品国产一区二区三区久久久狼| 视频免费在线观看| av成人亚洲| 亚洲h在线观看| 无码免费一区二区三区免费播放 | 国产精品极品美女在线观看| 久久久不卡影院| 5g国产欧美日韩视频| 天堂网免费视频| 欧美日韩三区| 最新国产精品拍自在线播放| 91丨porny丨对白| 亚洲综合伊人| 欧美在线观看你懂的| 欧美精品自拍视频| 黄色一级大片在线免费看产| 久久久蜜臀国产一区二区| 成人av网站观看| 亚洲一区二区激情| 久久久成人网| 午夜精品久久久久久久99热浪潮| 国产成人综合在线视频| 成人毛片在线| 亚洲欧美中文日韩在线| www.88av| 国产精品三p一区二区| 欧美一卡二卡三卡| 国产色视频在线播放| 日韩在线影院| 日韩欧美黄色动漫| 波多野结衣之无限发射| av在线不卡免费| 亚洲一区二区三区在线看| 成人手机视频在线| 欧美18hd| 国产精品国产三级国产aⅴ原创| 中文字幕精品三区| 久久久久久亚洲| 日本a级片视频| 亚洲a一区二区三区| 中文字幕久久亚洲| 我想看黄色大片| 精品久久中文| 在线观看国产精品91| av电影网站在线观看| 色棕色天天综合网| 国产一区二区成人| аⅴ天堂中文在线网| 欧州一区二区| 一色桃子一区二区| 懂色av蜜桃av| 亚洲草久电影| 欧美成人免费小视频| 免费在线黄色片| 精久久久久久| 欧美影院在线播放| 99在线国产| 自拍偷拍18p| 强制捆绑调教一区二区| 国产精品老牛影院在线观看| 日韩av.com| 51一区二区三区| 欧美性大战久久久久久久 | 成全电影大全在线观看| 一区二区三区四区蜜桃| 日韩xxxx视频| 欧美xxxxxx| 欧美日韩午夜精品| 欧美午夜精品理论片| 中文久久电影小说| 日韩成人小视频| 日本精品在线观看视频| 色婷婷一区二区三区| 成年无码av片在线| 成人免费毛片播放| 欧美一区免费观看| 在线中文字幕亚洲| 国模精品视频一区二区| 黄色片免费观看视频| 免费欧美在线视频| 99久久精品久久久久久ai换脸| 四虎在线免费看| 国产精品国产精品国产专区不片| 日本中文字幕一级片| 精品人人视频| 欧美美女视频在线观看| 亚洲妇女无套内射精| 亚洲欧洲免费| 久久亚洲一区二区三区四区五区高| 国产一级大片在线观看| 久久婷婷一区| 亚洲wwwav| 亚洲人成色777777老人头| 99精品国产91久久久久久| 亚洲精品成人a8198a| 51漫画成人app入口| 欧美在线999| 五月天丁香社区| 欧洲福利电影| 91国产中文字幕| 中文字幕在线观看1| www.欧美色图| 一区二区三区在线视频看| 人狥杂交一区欧美二区| 欧美高清一级片在线| 一区二区三区免费在线观看视频| 五月久久久综合一区二区小说| 97在线免费观看| 国产乱码精品一区二区| av中文字幕不卡| avove在线观看| 成人视屏在线观看| 欧美精品一区二区三区在线播放| 日韩一区二区三区四区视频| 国产精品一区毛片| 2014亚洲精品| 精品人妻人人做人人爽| 天堂av在线播放| 一区二区三区日韩精品视频| 少妇网站在线观看| 亚洲亚洲免费| 国内揄拍国内精品| 国产高清免费av| 中文字幕在线播放不卡一区| 熟妇人妻va精品中文字幕 | 欧美另类z0zx974| 99这里有精品| 国产乱码精品一区二区三区日韩精品 | a级大胆欧美人体大胆666| 91麻豆精品91久久久久久清纯 | 亚洲精品网站在线观看| 手机在线看福利| 亚洲va久久| 69av成年福利视频| 色婷婷av一区二区三区之e本道| 亚洲视频免费在线观看| 日韩av.com| 色婷婷热久久| 国产欧美最新羞羞视频在线观看| 黄色电影免费在线看| 一本大道综合伊人精品热热 | 亚洲综合免费视频| 日本一区二区三区在线不卡| 中文字幕第80页| 操欧美老女人| 国产精品视频xxx| 2017亚洲天堂1024| 欧美美女一区二区| 国产高潮国产高潮久久久91| 国产一区欧美二区| 亚洲成人激情在线| 久热精品在线观看视频| 国产在线观看91一区二区三区| 欧美亚洲日本黄色| 看电影就来5566av视频在线播放| 在线观看91视频| 99成人在线观看| 精品亚洲欧美一区| 欧美一级特黄aaaaaa在线看片| 久久久久久久久成人| 欧美激情亚洲精品| 亚州av在线播放| 色94色欧美sute亚洲线路一久| 蜜桃av乱码一区二区三区| 青娱乐精品在线视频| 成人手机视频在线| 999久久精品| 欧洲精品久久久| 在线观看美女网站大全免费| 欧美高清激情brazzers| 久久久久久久久久久久国产| 91一区二区三区在线观看| 国产一区二区视频免费在线观看 | 亚洲欧美日本精品| 亚洲男人天堂网址| 最新中文字幕一区二区三区| av不卡中文字幕| 久久久亚洲一区| 在线视频欧美一区| 荡女精品导航| 国产精品久久久久久久av大片| jizz性欧美10| 日韩av资源在线播放| 中文字幕日本人妻久久久免费| 亚洲免费三区一区二区| 亚洲 欧美 日韩在线| 三级亚洲高清视频| 懂色av粉嫩av蜜臀av| 天堂网av成人| 成人免费网站在线看| 英国三级经典在线观看| 菠萝蜜影院一区二区免费| 午夜小视频免费| 欧美色图天堂网| 日韩久久精品视频| 国产精品福利一区二区三区| 日韩av手机在线播放| 久久se精品一区二区| 无码aⅴ精品一区二区三区浪潮| 国产精品久久观看| 免费电影一区| 97久久超碰| 成人欧美在线观看| 色哟哟视频在线| 欧美日韩国产免费观看视频| 99在线免费观看视频| 国产精品第一| 欧美一级视频在线观看| 亚洲按摩av| 色妞一区二区三区| 日韩在线免费看| 精品国产凹凸成av人网站| 一级全黄少妇性色生活片| 欧美性高潮床叫视频 | 一区二区三区在线观看国产| 久久久久久成人网| 久久久久久久久久久黄色| 97精品人妻一区二区三区蜜桃| 精品一区二区三区免费毛片爱| 黄色三级视频片| 午夜一区不卡| 无码专区aaaaaa免费视频| 中文字幕一区二区av| 中文字幕中文字幕99| 欧美中文字幕一区二区| 日本精品一区| 国产成人精品一区二区免费看京 | 欧美在线www| www.51av欧美视频| 欧美激情第三页| 青青青国内视频在线观看软件| 久久精品精品电影网| 久热国产在线| 久久精品国产亚洲精品2020| 日本在线人成| 久久色免费在线视频| 国产素人视频在线观看| 麻豆乱码国产一区二区三区| 免费黄色电影在线观看| 美乳少妇欧美精品| 中文字幕中文字幕在线中高清免费版| 久久伊人免费视频| 怡红院在线播放| 九九九久久久久久| 欧美人动性xxxxz0oz| 国内揄拍国内精品| www在线观看黄色| 日本欧美国产在线| 久久sese| 国产精品一区二区性色av| 日本一区二区三区中文字幕| 91免费看国产| 日韩免费精品| 国产精品有限公司| 一道在线中文一区二区三区| 欧美一区视久久| 久久社区一区| 亚洲精品少妇一区二区| 亚洲精品男同| 欧美日韩在线免费播放| 粉嫩av一区二区夜夜嗨| 欧美日韩日本国产| 五月天激情四射| 欧美日精品一区视频| 国产人妻精品一区二区三区| 精品处破学生在线二十三| 四虎影院在线域名免费观看| 尤物yw午夜国产精品视频明星| 在线观看av的网站| 久国内精品在线| 欧美调教sm| 成人信息集中地欧美| 91夜夜蜜桃臀一区二区三区| 欧美另类视频在线| 天天影视综合| 免费看国产曰批40分钟| 日韩va欧美va亚洲va久久| 伊人国产精品视频| 91色乱码一区二区三区| 国产一二三av| 天天影视涩香欲综合网| 亚洲天堂免费av| 亚洲国产成人精品女人久久久 | 欧美成人在线免费视频| 日本不卡1234视频| 成人午夜激情网| 亚洲成aⅴ人片久久青草影院| 亚洲欧美日韩不卡| 国产一区二区三区久久久久久久久 | 国产欧美亚洲日本| 日韩大片在线观看| 韩日视频在线观看| 美日韩一区二区三区| 国产ts丝袜人妖系列视频| 国产精品久久久一本精品| 免费观看一区二区三区毛片| 欧美一级欧美一级在线播放| 青青草视频在线观看| 欧美第一淫aaasss性| 成人免费一区| 精品福利影视| 欧美日韩国产高清| 牛夜精品久久久久久久| 99久久精品国产导航| 好吊色视频在线观看| 欧美日韩亚洲综合一区| 日本私人网站在线观看| 欧美黑人一区二区三区| 日韩三级一区| 日韩欧美精品久久| 欧美天天视频| 日本美女久久久| 国产精品对白交换视频| 国产精品免费无遮挡无码永久视频| 精品剧情v国产在线观看在线| 麻豆tv免费在线观看| 亚洲美女视频在线观看| a在线观看免费视频| 久久免费视频一区| 精品成人久久久| 亚洲成人av在线| 日本大胆在线观看| 亚洲一区二区免费| 亚洲a在线视频| 久久精品视频在线观看免费| 国产女人18毛片水真多成人如厕| 日韩在线视频免费播放| 亚洲成人xxx| freexxx性亚洲精品| 国产日产精品一区二区三区四区| 欧美另类专区| 亚洲高清av一区二区三区| 亚洲视频在线一区| 国产一区二区三区三州| 深夜精品寂寞黄网站在线观看| 素人啪啪色综合| 五月婷婷综合色| 青青草国产成人av片免费| 亚洲图片另类小说| 色哟哟一区二区三区| 久久精品色图| 国产精品精品视频| 日韩一区自拍| 天堂av.com| 亚洲午夜精品在线| 欧美一级淫片免费视频魅影视频| 性色av一区二区三区免费| 欧美黄色录像| 欧美伦理视频在线观看| 中文av一区二区| 国产露脸91国语对白| 欧美黄色三级网站| 精品精品国产毛片在线看| 亚洲 高清 成人 动漫| 久久久久国产精品麻豆ai换脸| 无码久久精品国产亚洲av影片| 深夜精品寂寞黄网站在线观看| 精品视频91| 日韩精品一区二区在线视频| 91免费观看视频在线| 中文字幕乱码无码人妻系列蜜桃| 日韩中文字幕国产| 日韩欧美高清一区二区三区| 日日碰狠狠添天天爽超碰97| 国产日韩欧美亚洲| 国产永久免费视频| 久久久久久美女| 欧美极品中文字幕| 999热精品视频| 亚洲成人一区二区| 超碰97在线免费观看| 亚洲自拍偷拍区| 国产欧美午夜| 国精品人伦一区二区三区蜜桃| 欧美一区二区三区视频免费 | 欧美一区二区三区……| 日本在线电影一区二区三区| 伊人久久久久久久久| 色悠久久久久综合欧美99| 欧美激情视频在线播放| 国产精品一级久久久| 日本欧美韩国一区三区| 久久国产免费观看| 亚洲性日韩精品一区二区| 欧美片网站免费| www.欧美日本| 午夜天堂影视香蕉久久|