Go-Zero 短链项目 DevOps 实战,利用 Drone CI/CD 打通上云(Kubernetes)迭代流程

简介: Go-Zero 短链项目 DevOps 实战,利用 Drone CI/CD 打通上云(Kubernetes)迭代流程

Go-Zero 官方短链项目教程:快速构建高并发微服务

关于 go-zero,大家可以看文档。为少认为它是中国目前最好用的 golang 微服务框架。

完整的 Go-Zero ShortUrl DevOps Demo

准备工作



我这里直接在 K8S 开发集群中部署相关实例。

生产求稳,建议大家还是买云数据库服务。

部署 Mysql、Redis、Etcd。


微信图片_20220611000610.png

微信图片_20220611000631.png

部署 Drone、Drone-Runner-Kube

微信图片_20220611000641.png

开始探索



准备 DevOps 部署相关配置


微信图片_20220611000658.png


Dockerfile.alpine.base


FROM alpine:3.12
RUN addgroup -S app \
    && adduser -S -g app app \
    && apk --no-cache add \
    ca-certificates curl netcat-openbsd


Dockerfile.base


FROM golang:1.15-alpine
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
RUN mkdir -p /shorturl/
WORKDIR /shorturl
COPY go.mod go.mod
RUN go mod download


Dockerfile.prod.rpc


### shorturl:base
FROM hub.your-domain.com/library/shorturl:base as builder
WORKDIR /shorturl-rpc
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/shorturl-rpc rpc/transform/*.go
### shorturl-alpine:base
FROM hub.your-domain.com/library/shorturl-alpine:base
LABEL maintainer="为少"
WORKDIR /home/app
COPY --from=builder /shorturl-rpc/bin/shorturl-rpc .
COPY ./rpc/transform/etc ./rpc/transform/etc
RUN chown -R app:app ./
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
USER app
CMD ["./shorturl-rpc", "-f", "rpc/transform/etc/transform.yaml"]


Dockerfile.prod.api


### shorturl:base
FROM hub.your-domain.com/library/shorturl:base as builder
WORKDIR /shorturl-api
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/shorturl-api api/*.go
### shorturl-alpine:base
FROM hub.your-domain.com/library/shorturl-alpine:base
LABEL maintainer="为少"
WORKDIR /home/app
COPY --from=builder /shorturl-api/bin/shorturl-api .
COPY ./api/etc ./api/etc
RUN chown -R app:app ./
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
USER app
CMD ["./shorturl-api", "-f", "api/etc/shorturl-api.yaml"]


shorturl-api-configmap.yaml


apiVersion: v1
kind: ConfigMap
metadata:
  name: shorturl-api
data:
  shorturl-api.yaml: |-
    Name: shorturl-api
    Host: 0.0.0.0
    Port: 8888
    Transform:
      Etcd:
        Hosts:
          - your-ip:2379
        Key: transform.rpc


shorturl-rpc-configmap.yaml


apiVersion: v1
kind: ConfigMap
metadata:
  name: shorturl-transform-rpc
data:
  transform.yaml: |-
    Name: transform.rpc
    Log:
      Mode: console
    ListenOn: 0.0.0.0:8081
    Etcd:
      Hosts:
      - your-ip:2379
      Key: transform.rpc
    DataSource: root:123456@tcp(your-ip:3306)/shorturl?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
    Table: shorturl
    Cache:
      - Host: your-ip:6379


.drone.yml


kind: pipeline
type: kubernetes
name: ShortUrl(transform.rpc)
steps:
  - name: 更新 Charts(transform.rpc)
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" k8s-devops/helm-shorturl/shorturl/Chart.yaml;
          sed -i "s/SHORTURL/shorturl-transform-rpc/g" k8s-devops/helm-shorturl/shorturl/Chart.yaml;
          sed -i "s/IMAGE/shorturl-transform-rpc/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/APICONFIGMAP//g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/RPCCONFIGMAP/shorturl-transform-rpc/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/CONTAINERPORT/8081/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/INGRESS/false/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/8080/8081/g" k8s-devops/helm-shorturl/shorturl/templates/NOTES.txt;
        )'
      - cat k8s-devops/helm-shorturl/shorturl/Chart.yaml
      - cat k8s-devops/helm-shorturl/shorturl/values.yaml
  - name: 构建 transform.rpc Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.prod.rpc
      repo: hub.your-domain.com/library/shorturl-transform-rpc
      tags: ${DRONE_COMMIT}
      registry: hub.your-domain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
  - name: 上云 HelmV3(transform.rpc) -> K8S
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./k8s-devops/helm-shorturl/shorturl
      release: shorturl-transform-rpc
      namespace: shorturl
      api_server:
        from_secret: api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true
trigger:
  branch:
    - main
---
kind: pipeline
type: kubernetes
name: ShortUrl(shorturl-api)
steps:
  - name: 更新 Charts(shorturl-api)
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" k8s-devops/helm-shorturl/shorturl/Chart.yaml;
          sed -i "s/SHORTURL/shorturl-api/g" k8s-devops/helm-shorturl/shorturl/Chart.yaml;
          sed -i "s/IMAGE/shorturl-api/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/APICONFIGMAP/shorturl-api/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/RPCCONFIGMAP//g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/CONTAINERPORT/8888/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/INGRESS/true/g" k8s-devops/helm-shorturl/shorturl/values.yaml;
          sed -i "s/8080/8888/g" k8s-devops/helm-shorturl/shorturl/templates/NOTES.txt;
        )'
      - cat k8s-devops/helm-shorturl/shorturl/Chart.yaml
      - cat k8s-devops/helm-shorturl/shorturl/values.yaml
  - name: 构建 shorturl-api Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.prod.api
      repo: hub.your-domain.com/library/shorturl-api
      tags: ${DRONE_COMMIT}
      registry: hub.your-domain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
  - name: 上云 HelmV3(shorturl-api) -> K8S
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./k8s-devops/helm-shorturl/shorturl
      release: shorturl-api
      namespace: shorturl
      api_server:
        from_secret: api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true
trigger:
  branch:
    - main


微信图片_20220611000802.png

微信图片_20220611000816.png

验证


我这里已经部署好了一个开发测试的 Pod 实例,大家可以试用。

shorten api 调用


# curl -i "https://shorturl.your-domain.com/shorten?url=https://www.your-domain.com"
curl -i "https://shorturl.hacker-linner.com/shorten?url=https://www.hacker-linner.com"


expand api 调用


# curl -i "https://shorturl.your-domain.com/expand?shorten=6d11a1"
curl -i "https://shorturl.hacker-linner.com/expand?shorten=6d11a1"


利用工具查看 Redis 与 Etcd 中的键值对


微信图片_20220611000832.png

微信图片_20220611000842.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
448 0
|
5月前
|
存储 人工智能 Go
Go-Zero全流程实战即时通讯
Go-Zero 是一个功能丰富的微服务框架,适用于开发高性能的即时通讯应用。它具备中间件、工具库和代码生成器,简化开发流程。本文介绍其环境搭建、项目初始化及即时通讯功能实现,涵盖用户认证、消息收发和实时推送,帮助开发者快速上手。
383 0
|
3月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
200 4
|
6月前
|
人工智能 Java Linux
Go 调度器:一个线程的执行流程
本文详细解析了Go语言运行时调度器的初始化流程,重点介绍了GMP模型的构建过程。内容涵盖调度器初始化函数`runtime·schedinit`、线程与处理器的绑定、P结构体的创建与初始化,以及主Goroutine的启动流程。通过源码分析,帮助读者深入理解Go运行时的底层机制。
145 0
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
Devops jenkins 测试技术
DevOps实践:持续集成与持续部署(CI/CD)的实现之路
【9月更文挑战第33天】在软件开发的海洋中,DevOps是一艘能够加速航行、提升航程质量的巨轮。本文将作为你的航海图,指引你理解并实现DevOps文化中的核心环节——持续集成(CI)与持续部署(CD)。我们将从基础概念出发,逐步深入到实际操作,带你领略代码到部署的全过程。准备好扬帆起航,让我们共同探索如何通过自动化工具和流程优化,让软件交付变得既高效又可靠。
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
监控 Devops 测试技术
DevOps实践: 持续集成和持续部署(CI/CD)的入门指南
【9月更文挑战第10天】在快速迭代的软件开发世界中,DevOps已经成为加速产品交付、提升软件质量和团队协作的关键策略。本文将深入浅出地介绍DevOps的核心组成部分——持续集成(Continuous Integration, CI)与持续部署(Continuous Deployment, CD)的基本概念、实施步骤以及它们如何革新传统的软件开发流程。你将学习到如何通过自动化工具简化开发流程,并理解为什么CI/CD是现代软件开发不可或缺的一环。
|
运维 安全 Devops
DevOps实践:持续集成与持续部署(CI/CD)的自动化之路
【10月更文挑战第22天】在软件交付的快速迭代中,DevOps文化和实践成为企业加速产品上市、保证质量和提升客户满意度的关键。本文将通过一个实际案例,深入探讨如何利用持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)实现软件开发流程的高效自动化,包括工具选择、流程设计以及问题解决策略。我们将一起探索代码从编写到部署的全自动化旅程,揭示其对企业运维效率和产品质量所带来的深远影响。
|
Devops jenkins Shell
DevOps实践:持续集成与持续部署(CI/CD)的探索之旅
【9月更文挑战第3天】在软件开发的世界里,DevOps已经成为了提升效率、加速产品迭代的关键。本文将深入浅出地探讨DevOps文化中的核心实践——持续集成(Continuous Integration,CI)和持续部署(Continuous Deployment,CD),并展示如何通过实际操作来优化开发流程。我们将一起踏上这段旅程,解锁自动化的魅力,让代码更流畅地转化为价值。

推荐镜像

更多