<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微服務(wù)從代碼到k8s部署應(yīng)有盡有系列(一)

          共 6341字,需瀏覽 13分鐘

           ·

          2022-03-02 23:45

          從本篇文章開始,我們用一個(gè)系列來(lái)講解從需求到上線、從代碼到k8s部署、從日志到監(jiān)控等各個(gè)方面的微服務(wù)完整實(shí)踐。

          實(shí)戰(zhàn)項(xiàng)目地址:https://github.com/Mikaelemmmm/go-zero-looklook

          一、項(xiàng)目簡(jiǎn)介

          整個(gè)項(xiàng)目使用了go-zero開發(fā)的微服務(wù),基本包含了go-zero以及相關(guān)go-zero作者開發(fā)的一些中間件,所用到的技術(shù)?;臼莋o-zero項(xiàng)目組的自研組件,基本是go-zero全家桶了。

          項(xiàng)目目錄結(jié)構(gòu)如下:

          • app:所有業(yè)務(wù)代碼包含api、rpc以及mq(消息隊(duì)列、延遲隊(duì)列、定時(shí)任務(wù))
          • common:通用組件 error、middleware、interceptor、tool、ctxdata等
          • data:該項(xiàng)目包含該目錄依賴所有中間件(mysql、es、redis、grafana等)產(chǎn)生的數(shù)據(jù),此目錄下的所有內(nèi)容應(yīng)該在git忽略文件中,不需要提交。
          • deploy:
            • gencode:生成api、rpc,以及創(chuàng)建kafka語(yǔ)句,復(fù)制粘貼使用
            • mysql:生成model的sh工具
            • filebeat: docker部署filebeat配置
            • go-stash:go-stash配置
            • nginx: nginx網(wǎng)關(guān)配置
            • prometheus :prometheus配置
            • script:
            • goctl: 該項(xiàng)目goctl的template,goctl生成自定義代碼模版,template用法可參考go-zero文檔,復(fù)制到home目錄下.goctl即可, 該項(xiàng)目用到goctl版本是v1.3.0
          • doc : 該項(xiàng)目系列文檔

          二、用到技術(shù)棧

          • go-zero
          • nginx網(wǎng)關(guān)
          • filebeat
          • kafka
          • go-stash
          • elasticsearch
          • kibana
          • prometheus
          • grafana
          • jaeger
          • go-queue
          • asynq
          • asynqmon
          • dtm
          • docker
          • docker-compose
          • mysql
          • redis

          三、項(xiàng)目架構(gòu)圖

          四、業(yè)務(wù)架構(gòu)圖

          五、項(xiàng)目環(huán)境搭建

          本項(xiàng)目采用air熱加載功即時(shí)修改代碼及時(shí)生效,并且不需要每次都要重啟,改了代碼自動(dòng)就在容器中重新加載了,本地不需要啟動(dòng)服務(wù),本地安裝的sdk就是寫代碼自動(dòng)提示使用的,實(shí)際運(yùn)行是以來(lái)容器中cosmtrek/air的golang環(huán)境。所以使用goland、vscode都一樣

          1、clone代碼&更新依賴

          $?git?clone[email protected]:Mikaelemmmm/go-zero-looklook.git
          $?go?mod?tidy

          2、啟動(dòng)項(xiàng)目所依賴的環(huán)境

          $?docker-compose?-f?docker-compose-env.yml?up?-d

          jaeger: http://127.0.0.1:16686/search

          asynq (延時(shí)、定時(shí)消息隊(duì)列): http://127.0.0.1:8980/

          kibana: http://127.0.0.1:5601/

          Elastic search: http://127.0.0.1:9200/

          Prometheus: http://127.0.0.1:9090/

          Grafana: http://127.0.0.1:3001/, 默認(rèn)賬號(hào)、密碼都是admin

          Mysql: 自行客戶端工具(Navicat、Sequel Pro)查看

          • host : 127.0.0.1
          • port : 33069
          • username : root
          • pwd : PXDN93VRKUm8TeE7

          Redis: ?自行工具(redisManager)查看

          • host : 127.0.0.1
          • port : 63799
          • pwd : G62m50oigInC30sf

          Kafka: ?自行客戶端工具查看

          • host : 127.0.0.1
          • port : 9092

          3、拉取項(xiàng)目依賴鏡像

          因?yàn)楸卷?xiàng)目是用air熱加載的,所以是在air+golang鏡像中運(yùn)行,直接docker-compose也可以,但是考慮依賴可能會(huì)比較大,會(huì)影響啟動(dòng)項(xiàng)目,所以最好先把這個(gè)鏡像拉取下來(lái)再去啟動(dòng)項(xiàng)目,拉取air+golang項(xiàng)目依賴的鏡像命令如下

          $?docker?pull?cosmtrek/air:latest

          4、導(dǎo)入mysql數(shù)據(jù)

          創(chuàng)建數(shù)據(jù)庫(kù)looklook_order && 導(dǎo)入deploy/sql/looklook_order.sql數(shù)據(jù)

          創(chuàng)建數(shù)據(jù)庫(kù)looklook_payment && 導(dǎo)入deploy/sql/looklook_payment.sql數(shù)據(jù)

          創(chuàng)建數(shù)據(jù)庫(kù)looklook_travel && 導(dǎo)入deploy/sql/looklook_travel.sql數(shù)據(jù)

          創(chuàng)建數(shù)據(jù)庫(kù)looklook_usercenter && 導(dǎo)入looklook_usercenter.sql數(shù)據(jù)

          5、啟動(dòng)項(xiàng)目

          $?docker-compose?up?-d?

          【注】依賴的是項(xiàng)目根目錄下的docker-compose.yml配置

          6、查看項(xiàng)目運(yùn)行情況

          訪問(wèn) http://127.0.0.1:9090/ , 點(diǎn)擊上面菜單“Status”,再點(diǎn)擊Targets , 藍(lán)色的就是啟動(dòng)成了,紅色就是沒(méi)啟動(dòng)成功

          【注】如果是第一次拉取項(xiàng)目,每個(gè)項(xiàng)目容器第一次構(gòu)建拉取依賴,這個(gè)看網(wǎng)絡(luò)情況,可能會(huì)比較慢有的服務(wù),所以會(huì)導(dǎo)致項(xiàng)目啟動(dòng)失敗或者被依賴的服務(wù)啟動(dòng)失敗自己也啟動(dòng)失敗了,這個(gè)很正常,如果碰到項(xiàng)目啟動(dòng)不起來(lái)的情況,比如order-api ,這時(shí)候我們?nèi)タ聪氯罩揪涂梢?/p>

          $?docker?logs?-f?order-api?

          很明顯是因?yàn)閛rder-rpc啟動(dòng)時(shí)間太久了,而order-api一直等他啟動(dòng),order-rpc一定時(shí)間內(nèi)沒(méi)有啟動(dòng)成功,order-api沒(méi)耐心了(超時(shí)了),就算后面order-rpc啟動(dòng)起來(lái),它也不管了,這時(shí)候再去重啟一次order-api就可以了,這個(gè)只是第一次創(chuàng)建容器會(huì)這樣,之后只要不銷毀容器就不會(huì),我們?nèi)サ巾?xiàng)目根目錄下重啟一下

          $?docker-compose?restart?order-api

          【注意】一定要去到項(xiàng)目根目錄下重啟 ,因?yàn)閐ocker-compose.yml在項(xiàng)目根目錄

          然后我們?cè)倏匆幌?,這里我們使用docker logs 看了

          ??__????_???___??
          ?/?/\??|?|?|?|_)?
          /_/--\?|_|?|_|?\_?,?built?with?Go?1.17.6

          mkdir?/go/src/github.com/looklook/app/order/cmd/api/tmp
          watching?.
          watching?desc
          watching?desc/order
          watching?etc
          watching?internal
          watching?internal/config
          watching?internal/handler
          watching?internal/handler/homestayOrder
          watching?internal/logic
          watching?internal/logic/homestayOrder
          watching?internal/svc
          watching?internal/types
          !exclude?tmp
          building...
          running...

          可以看到order-api已經(jīng)成功了 ,再去prometheus看一下

          可以看到prometheus也顯示成功了,同理把其他的也排查一次,啟動(dòng)成功就可以了

          7、訪問(wèn)項(xiàng)目

          由于我們使用nginx做的網(wǎng)關(guān),nginx網(wǎng)關(guān)配置在docker-compose中,也是配置在docker-compose中,nignx對(duì)外暴露端口是8888,所以我們通過(guò)8888端口訪問(wèn)

          $?curl??-X?POST?"http://127.0.0.1:8888/usercenter/v1/user/register"?-H?"Content-Type:?application/json"?-d?"{\"mobile\":\"18888888888\",\"password\":\"123456\"}"?

          返回:
          {"code":200,"msg":"OK","data":{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzM5NjY0MjUsImlhdCI6MTY0MjQzMDQyNSwiand0VXNlcklkIjo1fQ.E5-yMF0OvNpBcfr0WyDxuTq1SRWGC3yZb9_Xpxtzlyw","accessExpire":1673966425,"refreshAfter":1658198425}}

          【注】 如果是訪問(wèn)nginx失敗,訪問(wèn)成功可以忽略,可能是nginx依賴后端服務(wù),之前因?yàn)楹蠖朔?wù)沒(méi)啟動(dòng)起來(lái),nginx這里沒(méi)啟動(dòng)起來(lái),重啟一次nginx即可,項(xiàng)目根目錄下重啟

          $?docker-compose?restart?nginx

          六、日志收集

          將項(xiàng)目日志收集到es(filebeat收集日志->kafka -> go-stash消費(fèi)kafka日志->輸出到es中, kibana查看es數(shù)據(jù))

          所以我們要提前在kafka中創(chuàng)建日志的topic

          進(jìn)入kafka容器

          $?docker?exec?-it?kafka?/bin/sh

          創(chuàng)建log的topic

          $?cd?/opt/kafka/bin
          $?./kafka-topics.sh?--create?--zookeeper?zookeeper:2181?--replication-factor?1?-partitions?1?--topic?looklook-log

          訪問(wèn)kibana http://127.0.0.1:5601/ , 創(chuàng)建日志索引

          點(diǎn)擊左上角菜單(三個(gè)橫線那個(gè)東東),找到Analytics - > 點(diǎn)擊discover

          然后在當(dāng)前頁(yè)面,Create index pattern->輸入looklook-* ?-> Next Step ->選擇@timestamp->Create index pattern

          然后點(diǎn)擊左上角菜單,找到Analytics->點(diǎn)擊discover ,日志都顯示了 (如果不顯示,就去排查filebeat、go-stash,使用docker logs -f filebeat查看)

          七、本項(xiàng)目鏡像介紹

          所有服務(wù)啟動(dòng)成功,應(yīng)該是如下這些,自行對(duì)比

          • nginx : 網(wǎng)關(guān) (nginx->api->rpc)
          • cosmtrek/air : 我們業(yè)務(wù)代碼開發(fā)依賴的環(huán)境鏡像,之所以用這個(gè)是因?yàn)閍ir熱加載,寫代碼實(shí)時(shí)編譯太方便了,這個(gè)鏡像是air+golang,實(shí)際上我們啟我們自己的業(yè)務(wù)服務(wù)后,我們的業(yè)務(wù)服務(wù)是運(yùn)行在此鏡像中的
          • wurstmeister/kafka :業(yè)務(wù)使用的kafka
          • wurstmeister/zookeeper :kafka依賴的zookeeper
          • redis:業(yè)務(wù)使用的redis
          • mysql: 業(yè)務(wù)使用的數(shù)據(jù)庫(kù)
          • prom/prometheus:監(jiān)控業(yè)務(wù)
          • grafana/grafana :prometheus的ui很難看,用來(lái)顯示prometheus收集來(lái)的數(shù)據(jù)
          • elastic/filebeat :收集日志到kafka
          • go-stash : 消費(fèi)kafka中日志,脫敏、過(guò)濾然后輸出到es
          • docker.elastic.co/elasticsearch/elasticsearch :存儲(chǔ)收集的日志
          • docker.elastic.co/kibana/kibana :顯示elasticsearch
          • jaegertracing/jaeger-query 、jaegertracing/jaeger-collector、jaegertracing/jaeger-agent:鏈路追蹤
          • go-stash : filebeat收集日志到kafka后,go-stash去消費(fèi)kafka進(jìn)行數(shù)據(jù)脫敏、過(guò)濾日志中內(nèi)容,最后輸出到es中

          八、項(xiàng)目開發(fā)建議

          • app下放所有業(yè)務(wù)服務(wù)代碼
          • common放所有服務(wù)的公共基礎(chǔ)庫(kù)
          • data項(xiàng)目依賴中間件產(chǎn)生的數(shù)據(jù),實(shí)際開發(fā)中應(yīng)該在git中忽略此目錄以及此目錄下產(chǎn)生的數(shù)據(jù)
          • 生成api、rpc代碼:

          一般我們?cè)谏蒩pi,rpc代碼時(shí)候手動(dòng)去敲goctl的命令比較長(zhǎng),也記不住,所以我們直接去deploy/script/gencode/gen.sh中復(fù)制代碼即可。比如我在usercenter服務(wù)中新增加了一個(gè)業(yè)務(wù),修改密碼,寫完api文件之后,進(jìn)入到usercenter/cmd目錄下,直接復(fù)制deploy/script/gencode/gen.sh中的生成api命令運(yùn)行即可

          $?goctl?api?go?-api?./api/desc/*.api?-dir?./api?-style=goZero

          生成rpc也一樣,在寫完proto文件后,直接粘貼復(fù)制deploy/script/gencode/gen.sh中的生成rpc命令運(yùn)行即可

          $?goctl?rpc?proto?-src?rpc/pb/*.proto?-dir?./rpc?-style=goZero
          $?sed?-i?'s/,omitempty//g'??./rpc/pb/*.pb.go

          【注】建議在生成rpc文件時(shí)候,再多執(zhí)行一次下面那個(gè)命令,把protobuf生成的omitempty給刪除掉,不然字段為nil就不返回了

          • 生成kafka代碼:

            因?yàn)楸卷?xiàng)目使用了go-queue的kq做消息隊(duì)列,kq又依賴的kafka,實(shí)際就是使用了kafka做消息隊(duì)列,但是kq默認(rèn)是需要我們提前把topic建好的,不許默認(rèn)自動(dòng)生成,所以命令也準(zhǔn)備好了,直接復(fù)制deploy/script/gencode/gen.sh中的創(chuàng)建kafka的topic代碼即可

            ?kafka-topics.sh?--create?--zookeeper?zookeeper:2181?--replication-factor?1?-partitions?1?--topic?{topic}
          • 生成model代碼,直接運(yùn)行deploy/script/mysql/genModel.sh ?參數(shù)

          • api項(xiàng)目中的.api文件我們做了拆分,統(tǒng)一放到每個(gè)api的desc文件夾下,因?yàn)槿绻袃?nèi)容都寫在api中可能不便于查看,所以做了拆分,把所有方法寫到一個(gè)api中,其他的實(shí)體以及req、rep統(tǒng)一放到一個(gè)文件夾單獨(dú)定義比較清晰

          • 生成model、錯(cuò)誤處理時(shí)候使用了template重新定義,該項(xiàng)目用到的自定義的goctl的模版在項(xiàng)目data/goctl下

          九、后續(xù)

          由于項(xiàng)目中由于涉及到的技術(shù)棧稍微有點(diǎn)多,將分章節(jié)一步一步講解,敬請(qǐng)關(guān)注。

          項(xiàng)目地址

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

          歡迎使用 go-zerostar 支持我們!



          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。

          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲狼友 | 激情婷婷亚洲 | 日本成人一级性片在线观看 | 正在播放国产AV | 久久激情国产 |