天天看點

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

作者:kevwan

我們用一個系列來講解從需求到上線、從代碼到k8s部署、從日志到監控等各個方面的微服務完整實踐。

整個項目使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中間件,所用到的技術棧基本是go-zero項目組的自研元件,基本是go-zero全家桶了。

實戰項目位址:https://github.com/Mikaelemmmm/go-zero-looklook

1、概述

好的服務一定是可以被及時監控的,在go-zero-looklook中我們使用目前比較流行的prometheus來作為監控工具,然後使用grafana來顯示

go-zero已經在代碼中給我們內建好了prometheus

// StartAgent starts a prometheus agent.
func StartAgent(c Config) {
  if len(c.Host) == 0 {
    return
  }

  once.Do(func() {
    enabled.Set(true)
    threading.GoSafe(func() {
      http.Handle(c.Path, promhttp.Handler())
      addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
      logx.Infof("Starting prometheus agent at %s", addr)
      if err := http.ListenAndServe(addr, nil); err != nil {
        logx.Error(err)
      }
    })
  })
}
           

無論當我們啟動api、rpc都會額外啟動一個goroutine 提供prometheus的服務

【注】如果像我們之前order-mq這種使用serviceGroup管理的服務,在啟動檔案main中要顯式調用一下才可以,api、rpc不需要,配置都一樣

package main
.....
func main() {
  ....
  // log、prometheus、trace、metricsUrl.
  if err := c.SetUp(); err != nil {
    panic(err)
  }

  ......
}
           

2、實作

2.1 配置prometheus與grafana

在項目下的docker-compose-env.yml檔案中

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

我們來deploy/prometheus/server/prometheus.yml看看prometheus配置檔案

global:
  scrape_interval:
  external_labels:
    monitor: 'codelab-monitor'

# 這裡表示抓取對象的配置
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s  #重寫了全局抓取間隔時間,由15秒重寫成5秒
    static_configs:
      - targets: ['127.0.0.1:9090']

  - job_name: 'order-api'
    static_configs:
      - targets: ['order-api:9091']
        labels:
          job: order-api
          app: order-api
          env: dev
  - job_name: 'order-rpc'
    static_configs:
      - targets: ['order-rpc:9091']
        labels:
          job: order-rpc
          app: order-rpc
          env: dev
  - job_name: 'order-mq'
    static_configs:
      - targets: ['order-mq:9091']
        labels:
          job: order-mq
          app: order-mq
          env: dev
  - job_name: 'usercenter-api'
    static_configs:
      - targets: ['usercenter-api:9091']
        labels:
          job: usercenter-api
          app: usercenter-api
          env: dev
  - job_name: 'usercenter-rpc'
    static_configs:
      - targets: ['usercenter-rpc:9091']
        labels:
          job: usercenter-rpc
          app: usercenter-rpc
          env: dev
  - job_name: 'travel-api'
    static_configs:
      - targets: ['travel-api:9091']
        labels:
          job: travel-api
          app: travel-api
          env: dev
  - job_name: 'travel-rpc'
    static_configs:
      - targets: ['travel-rpc:9091']
        labels:
          job: travel-rpc
          app: travel-rpc
          env: dev
  - job_name: 'payment-api'
    static_configs:
      - targets: ['payment-api:9091']
        labels:
          job: payment-api
          app: payment-api
          env: dev
  - job_name: 'payment-rpc'
    static_configs:
      - targets: ['payment-rpc:9091']
        labels:
          job: payment-rpc
          app: payment-rpc
          env: dev
  - job_name: 'mqueue-rpc'
    static_configs:
      - targets: ['mqueue-rpc:9091']
        labels:
          job: mqueue-rpc
          app: mqueue-rpc
          env: dev
  - job_name: 'message-mq'
    static_configs:
      - targets: ['message-mq:9091']
        labels:
          job: message-mq
          app: message-mq
          env: dev
  - job_name: 'identity-api'
    static_configs:
      - targets: ['identity-api:9091']
        labels:
          job: identity-api
          app: identity-api
          env: dev
  - job_name: 'identity-rpc'
    static_configs:
      - targets: [ 'identity-rpc:9091' ]
        labels:
          job: identity-rpc
          app: identity-rpc
          env: dev
           

2.2 業務配置

實作上我們業務也不需要添加任何代碼(除了serviceGroup管理的服務)

我們隻需要在業務配置檔案中配置即可,我們拿usercenter來舉例

1)api

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

2)rpc

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

3)mq(serviceGroup)

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

【注】(再強調一次)如果像我們之前order-mq這種使用serviceGroup管理的服務,在啟動檔案main中要顯示調用一下才可以,api、rpc不需要

package main
.....
func main() {
  ....
  // log、prometheus、trace、metricsUrl.
  if err := c.SetUp(); err != nil {
    panic(err)
  }

  ......
}
           

2.3 檢視

通路 http://127.0.0.1:9090/ , 點選上面菜單“Status”,再點選Targets ,藍色的就是啟動成了,紅色就是沒啟動成功

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

2.4 配置grafana

通路http://127.0.0.1:3001, 預設賬号、密碼都是admin

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

配置資料源是prometheus

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

然後配置

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

【注】這裡是在docker中配置的,是以http的url不能寫127.0.0.1

檢視是否配置成功

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

配置dashboard

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

然後點選第一個

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

我們添加一個cpu名額,在下方輸入cpu選擇

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

然後我們就可以看到我們想要看的監控名額

微服務從代碼到k8s部署應有盡有系列(十三、服務監控)

3、結尾

這裡隻示範了一個名額,其他想看的名額自己配置就可以了,同時你也可以在grafana添加alert報警配置,這個就不作為示範了自行整理

項目位址

https://github.com/zeromicro/go-zero

歡迎使用 go-zero 并 star 支援我們!

微信交流群

關注『微服務實踐』公衆号并點選 交流群 擷取社群群二維碼。

繼續閱讀