我們用一個系列來講解從需求到上線、從代碼到k8s部署、從日志到監控等各個方面的微服務完整實踐。
整個項目使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中間件,所用到的技術棧基本是go-zero項目組的自研組件,基本是go-zero全家桶了。
實戰項目地址:https://github.com/Mikaelemmmm/go-zero-looklook
序言
在介紹之前,我先說一下整體思路,如果你的業務日志量不是特別大恰好你又使用的是雲服務,那你直接使用雲服務日志就可以了,比如阿里雲的SLS,基本就是點點鼠標配置幾步就可以將你的日志收集到阿里雲的SLS里面了,直接就可以在阿里雲中查看收集上來的日志了,感覺也沒必要折騰。
如果你的日志量比較大,那就可以上日志系統了。
1、日志系統
我們將業務日志打印到console、file之后,市面上比較常用的方式是elk、efk等基本思路一樣,我們拿常說的elk來舉例,基本思路就是logstash收集過濾到elasticsearch中,然后kibana呈現
但是logstash本身是使用java開發的,占用資源是真滴高,我們用go做業務,本身除了快就是占用資源少構建塊,現在在搞個logstash浪費資源,那我們使用go-stash替代logstash,go-stash是go-zero官方自己開發的並且在線上經過長期大量實踐的,但是它不負責收集日志,只負責過濾收集上來信息。
go-stash: https://github.com/kevwan/go-stash
2、架構方案
filebeat收集我們的業務日志,然后將日志輸出到kafka中作為緩沖,go-stash獲取kafka中日志根據配置過濾字段,然后將過濾后的字段輸出到elasticsearch中,最后由kibana負責呈現日志
3、實現方案
在上一節錯誤處理中,我們可以看到已經將我們想要的錯誤日志打印到了console控制台中了,現在我們只需要做后續收集即可
3.1 kafka
#消息隊列
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- 9092:9092
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
TZ: Asia/Shanghai
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- looklook_net
depends_on:
- zookeeper
先配置好kafka、zookeeper
然后我們進入kafka中先創建好filebeat收集日志到kafka的topic
進入kafka容器
$ docker exec -it kafka /bin/sh
修改kafka監聽配置(或者你把配置文件掛載到物理機在修改也可以)
$ vi /opt/kafka/config/server.properties
listeners=PLAINTEXT://kafka:9092 # 原文件中,要加kafka listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka:9092 #源文件中,要加kafka advertised.listeners=PLAINTEXT://:9092
創建topic
$ cd /opt/kafka/bin
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
3.2 filebeat
在項目根目錄下 docker-compose-env.yml文件中可以看到我們配置了filebeat
filebeat的配置我們掛載到 deploy/filebeat/conf/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/lib/docker/containers/*/*-json.log
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.kafka:
enabled: true
hosts: ["kafka:9092"]
#要提前創建topic
topic: "looklook-log"
partition.hash:
reachable_only: true
compression: gzip
max_message_bytes: 1000000
required_acks: 1
配置比較簡單,可以看到我們收集所有日志直接 輸出到我們配置的kafka中 , topic配置上一步kafka中創建的topic即可
3.3 配置go-stash
我們來看下go-stash的配置文件 deploy/go-stash/etc/config.yaml
Clusters:
- Input:
Kafka:
Name: gostash
Brokers:
- "kafka:9092"
Topics:
- looklook-log
Group: pro
Consumers: 16
Filters:
- Action: drop
Conditions:
- Key: k8s_container_name
Value: "-rpc"
Type: contains
- Key: level
Value: info
Type: match
Op: and
- Action: remove_field
Fields:
# - message
- _source
- _type
- _score
- _id
- "@version"
- topic
- index
- beat
- docker_container
- offset
- prospector
- source
- stream
- "@metadata"
- Action: transfer
Field: message
Target: data
Output:
ElasticSearch:
Hosts:
- "http://elasticsearch:9200"
Index: "looklook-{{yyyy-MM-dd}}"
配置消費的kafka以及輸出的elasticsearch , 以及要過濾的字段等
3.4 elastic search、kibana
訪問kibana http://127.0.0.1:5601/ , 創建日志索引
點擊左上角菜單(三個橫線那個東東),找到Analytics - > 點擊discover
然后在當前頁面,Create index pattern->輸入looklook-* -> Next Step ->選擇@timestamp->Create index pattern
然后點擊左上角菜單,找到Analytics->點擊discover ,稍等一會,日志都顯示了 (如果不顯示,就去排查filebeat、go-stash,使用docker logs -f filebeat查看)
我們在代碼中添加一個錯誤日志嘗試一下,代碼如下
func (l *BusinessListLogic) BusinessList(req types.BusinessListReq) (*types.BusinessListResp, error) {
logx.Error("測試的日志")
...
}
我們訪問這個業務方法,去kibana中搜索 data.log : "測試",如下圖
4、結尾
到此日志收集就完成了,接下來我們要實現鏈路追蹤
項目地址
https://github.com/zeromicro/go-zero
歡迎使用 go-zero
並 star 支持我們!
微信交流群
關注『微服務實踐』公眾號並點擊 交流群 獲取社區群二維碼。