go-zero服務(wù)部署配置及源碼解讀
服務(wù)部署
生產(chǎn)環(huán)境搭建
docker & k8s搭建
詳細(xì)請看我的下一篇文章
http://www.dbjr.com.cn/jiaoben/294839eda.htm
git私有倉庫 & 容器私有倉庫 & CI、DI
詳細(xì)請看我的下一篇文章
配置文件編寫 & 生成
dockerfile
我們先用網(wǎng)關(guān)部分代碼來演示
- 執(zhí)行代碼
./cmd.sh gen dockerfile gateway
- 生成文件
code/service/gateway/api/Dockerfile
### 加載基礎(chǔ)鏡像 FROM golang:alpine AS builder LABEL stage=gobuilder ENV CGO_ENABLED 0 ENV GOOS linux ### 設(shè)置 go module 代理 ENV GOPROXY https://goproxy.cn,direct WORKDIR /build/zero ### 下載依賴文件 ADD go.mod . ADD go.sum . RUN go mod download COPY . . COPY service/gateway/api/etc /app/etc ### 編譯源代碼 RUN go build -ldflags="-s -w" -o /app/gateway service/gateway/api/gateway.go ### 生成docker鏡像 FROM alpine RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata ENV TZ Asia/Shanghai WORKDIR /app COPY --from=builder /app/gateway /app/gateway COPY --from=builder /app/etc /app/etc CMD ["./gateway", "-f", "etc/gateway.prod.yaml"]
從生成的Dockerfile可以看到主要有兩個(gè)部分
- 加載golang基礎(chǔ)鏡像,將代碼編譯為二進(jìn)制文件
- 加載運(yùn)行環(huán)境基礎(chǔ)鏡像并生成gateway運(yùn)行環(huán)境的docker鏡像
為啥分為兩個(gè)部分呢,我們不能直接把編譯代碼和打包鏡像放一起嗎,這當(dāng)然是可以的,但是這樣會(huì)導(dǎo)致docker鏡像包會(huì)很大,而把編譯和打包分開后可以大大減少docker鏡像包的大小,方便我們快速分發(fā)和部署。
編譯代碼&鏡像打包
? go-zero-mall git:(master) ? ./cmd.sh docker build gateway -------- docker build gateway -------- time: 2022-05-02 00:19:58 msg: ------------ docker build gateway ------------ Untagged: gateway:latest Deleted: sha256:0eedc326b97f06a3c5d19665309369c4c163e430b6c3d17de8ba9a1ebaf37ca8 [+] Building 31.9s (19/19) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 733B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/alpine:latest 3.7s => [internal] load metadata for docker.io/library/golang:alpine 3.4s => [builder 1/8] FROM docker.io/library/golang:alpine@sha256:42d35674864fbb57 0.0s => [internal] load build context 1.2s => => transferring context: 35.78MB 1.1s => [stage-1 1/5] FROM docker.io/library/alpine@sha256:4edbd2beb5f78b1014028f4 0.0s => CACHED [builder 2/8] WORKDIR /build/zero 0.0s => CACHED [builder 3/8] ADD go.mod . 0.0s => CACHED [builder 4/8] ADD go.sum . 0.0s => CACHED [builder 5/8] RUN go mod download 0.0s => [builder 6/8] COPY . . 0.6s => [builder 7/8] COPY service/gateway/api/etc /app/etc 0.0s => [builder 8/8] RUN go build -ldflags="-s -w" -o /app/gateway service/gatew 26.1s => CACHED [stage-1 2/5] RUN apk update --no-cache && apk add --no-cache ca-ce 0.0s => CACHED [stage-1 3/5] WORKDIR /app 0.0s => CACHED [stage-1 4/5] COPY --from=builder /app/gateway /app/gateway 0.0s => CACHED [stage-1 5/5] COPY --from=builder /app/etc /app/etc 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:0eedc326b97f06a3c5d19665309369c4c163e430b6c3d17de8 0.0s => => naming to docker.io/library/gateway:latest 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
docker images
查看docker鏡像信息
? go-zero-mall git:(master) ? docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gateway latest 0eedc326b97f 7 days ago 41.6MB
自動(dòng)部署文件編寫deploy.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: go-zero-mall-gateway name: go-zero-mall-gateway namespace: zero #一定要寫名稱空間 spec: progressDeadlineSeconds: 600 replicas: 3 selector: matchLabels: app: go-zero-mall-gateway strategy: rollingUpdate: maxSurge: 50% maxUnavailable: 50% type: RollingUpdate template: metadata: labels: app: go-zero-mall-gateway spec: imagePullSecrets: - name: aliyun-docker-hub #提前在項(xiàng)目下配置訪問阿里云的賬號密碼 affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: go-zero-mall-gateway topologyKey: kubernetes.io/hostname containers: - image: $REGISTRY/$ALIYUNHUB_NAMESPACE/gateway:latest imagePullPolicy: Always name: app ports: - containerPort: 8000 protocol: TCP resources: limits: cpu: 200m memory: 60Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always terminationGracePeriodSeconds: 30 --- apiVersion: v1 kind: Service metadata: labels: app: go-zero-mall-gateway name: go-zero-mall-gateway namespace: zero spec: ports: - name: http port: 8000 protocol: TCP targetPort: 8000 selector: app: go-zero-mall-gateway sessionAffinity: None type: ClusterIP
通過自動(dòng)部署文件我們可以指定一些關(guān)鍵指標(biāo)
- 服務(wù)名稱
- pod數(shù)量
- 自動(dòng)擴(kuò)容閥值
- 服務(wù)權(quán)重
- 容器端口
- cpu&memory最大使用量
通過這些指標(biāo)我們的服務(wù)基本可以穩(wěn)定運(yùn)行啦
Jenkins文件編寫Jenkinsfile
pipeline { agent { node { label 'go' } } stages { stage('clone code') { agent none steps { git(url: 'https://gitee.com/go-open-project/go-zero-mall.git', changelog: true, poll: false) sh 'ls -al' } } stage('deploy user') { // agent none steps { container ('go') { withCredentials([ kubeconfigFile( credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG' )]) { sh 'envsubst < code/service/user/rpc/deploy.yaml | kubectl apply -f -' } } } } stage('deploy product') { // agent none steps { container ('go') { withCredentials([ kubeconfigFile( credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG' )]) { sh 'envsubst < code/service/product/rpc/deploy.yaml | kubectl apply -f -' } } } } stage('deploy order') { // agent none steps { container ('go') { withCredentials([ kubeconfigFile( credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG' )]) { sh 'envsubst < code/service/order/rpc/deploy.yaml | kubectl apply -f -' } } } } stage('deploy gateway') { // agent none steps { container ('go') { withCredentials([ kubeconfigFile( credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG' )]) { sh 'envsubst < code/service/gateway/api/deploy.yaml | kubectl apply -f -' } } } } } environment { DOCKER_CREDENTIAL_ID = 'dockerhub-id' GITHUB_CREDENTIAL_ID = 'github-id' KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' REGISTRY = 'registry.cn-shanghai.aliyuncs.com' DOCKERHUB_NAMESPACE = 'ttsimple' ALIYUNHUB_NAMESPACE = 'ttsimple' GITHUB_ACCOUNT = 'kubesphere' APP_NAME = 'go-zero-mall-gateway' } parameters { string(name: 'TAG_NAME', defaultValue: '', description: '') } }
我們在 DevOps 中設(shè)置好環(huán)境變量、倉庫地址、webhook 后便可在我們推送代碼后自動(dòng)部署我們的項(xiàng)目
說明:我們的容器是在開發(fā)環(huán)境打包的,我們當(dāng)然也可以通過 Jenkins 來自動(dòng)打包鏡像
- 自動(dòng)部署狀態(tài)
- 服務(wù)運(yùn)行狀態(tài)
- 調(diào)用線上用戶登錄接口
總結(jié)
- 通過 go-zero 可以方便生成dockerfile
- 在
deploy.yaml
中指定服務(wù)部署指標(biāo) - 在
Jenkinsfile
中指定服務(wù)從哪里來,分別需要部署哪些服務(wù),等等。 私有部署
- 鏡像服務(wù)可以使用
Harbor
搭建, - 鏡像制品可以使用云服務(wù)或
Jenkins
來打包生成, - 私有倉庫可以使用云服務(wù),gitee,開源倉庫服務(wù)來搭建
- 鏡像服務(wù)可以使用
以上就是go-zero服務(wù)部署配置及源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于go-zero服務(wù)部署配置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制
Casbin是用于Golang項(xiàng)目的功能強(qiáng)大且高效的開源訪問控制庫。本文主要介紹了go語言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制,感興趣的可以了解下2021-06-06golang?recover函數(shù)使用中的一些坑解析
這篇文章主要為大家介紹了golang?recover函數(shù)使用中的一些坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Golang結(jié)構(gòu)化日志包log/slog的使用詳解
官方提供的用于打印日志的包是標(biāo)準(zhǔn)庫中的 log 包,該包雖然被廣泛使用,但是缺點(diǎn)也很多,所以Go 1.21新增的 log/slog 完美解決了以上問題,下面我們就來看看log/slog包的使用吧2023-09-09go-zero接入skywalking實(shí)現(xiàn)鏈路追蹤的詳細(xì)教程
SkyWalking是一個(gè)開源的服務(wù)追蹤系統(tǒng),它專注于分布式系統(tǒng)的可觀測性和服務(wù)性能分析,它的主要目標(biāo)是幫助開發(fā)者理解和優(yōu)化微服務(wù)架構(gòu)中的服務(wù)間交互情況,本文介紹了go-zero接入skywalking鏈路追蹤的詳細(xì)教程,需要的朋友可以參考下2024-08-08Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學(xué)習(xí)Golang,發(fā)現(xiàn)了一個(gè)問題,覺著有必要給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Golang map如何生成有序json數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-07-07Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解
結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實(shí)現(xiàn)方法2021-09-09