乐趣区

关于golang:企业项目迁移gozero全攻略一

作者:Mikael

最近发现 golang 社区里出了一个新兴的微服务框架。看了一下官网提供的工具真的很好用,只须要定义好 .api 文件模版代码都能够一键生成,只须要关怀业务;同时 core 中的工具极大缩小了开发成本。

废话不多说,来看看这个微服务框架:go-zero

起源

聊聊与 go-zero 结缘

最先接触 go-zero 是 2020 年 10 月国庆假期,说来也巧,看到有人在 go-micro 群中问 go-zero 状况,过后 go-zero 作者在群中就大略答复了一下,引起了我的好奇,过后公司用的 go-micro1.x,因为 go-micro 版本真的太凌乱了,2 还没多少人用明确,当初又搞了个 3,而且这几个大版本之间高度不兼容,几乎一团糟。我抱着好奇心去 github.com 查看了 go-zero,过后并没有因为它的 star 数、文档少而放弃,哈哈,抱着试玩的心态去 go get 它,从此发现了新大陆,并退出了 go-zero 群,开始了 go-zero 之旅。

抉择它的几点起因

  • 微服务:在当初这个大环境下,单体服务诟病曾经越来越多了,我的项目大起来之后“牵一发而动全身”的教训亘古未有,保护越来越艰难,测试测起来也是很头疼,构建速度慢等等,在这样趋势下拥抱微服务成为了大趋势,go-zero 就是一个微服务框架并且能为我解决很多理论我的项目中遇到的痛点、难点
  • 稳定性:内外同源。稳定性是我很看重的,他们公司内外同源势必保障了此框架的稳定性。
  • 高并发:经验了 2020 年疫情期间,“晓黑板”轻松取得撑持千万日活服务
  • 工作效率:说到工作效率,必须要提的就是 goctl,goctl 配合 go-zero 所有代码根本都是能够通过这个工具生成,只须要关怀本人的业务逻辑即可,包含一键生成 dockerfile,k8s 的 yaml 文件,几乎不要太爽,大大提高了工作效率
  • 代码品质:大略看了一些 go-zero 的源码,代码品质上感觉还是没得喷的,至多感觉比我本人写的好很多,哈哈,这个每个人认识不同,大家能够去亲自看一下。
  • 团队:过后加了 go-zero 作者微信,感觉他为人很谦和,无论问一些比拟根底的货色还是一些线上实战经验,也总是会急躁给我解答、意见,在应用期间我也提了一些 bug,go-zero 团队都能及时的解决,迭代速度真的让我惊艳。大家应该都晓得,在国内做开源有如许不容易。
  • 比照 go 其余微服务框架:go 的微服务框架大略我玩过 go-micro、go-kit、kratos、rpcx、go-zero。

    • go-micro 我开始就说了是版本真心有点凌乱
    • go-kit 也不错然而材料相对来说较少
    • kratos 通过 b 站源码透露大家应该都晓得它了,前一段时间都断更了,差点安乐死,毛神在 issue 中说太忙了,不过他们在出 2.0 版本了,还是很期待
    • rpcx 玩了一下玩的不多,然而他们宣传是“好将来”也在用,go-zero 就是“好将来”的呀,哈哈
    • go-zero 下面我都说过了,就不再提了。

设计架构

在介绍 go-zero 理论应用前,先说一下整体架构,更不便了解

CI/CD

Step1:本地 deveploer 开发好代码之后提交到 gitlab(这里分支就不具体阐明了)

Step2:jenkins,应用 pipline 形式部署

  • 从 gitlab 拉取代码
  • docker build,基于最新 gitlab 上的 code 构建镜像
  • docker push,将构建好的镜像推送到镜像仓库(当然个别都是有本人公有镜像仓库比方 harbor,用阿里云的也能够)
  • kubectl apply -f xxx.yaml:应用 kubectl 部署到 k8s 中(阿里云 k8s 容器服务那么好用,不必岂不惋惜?)

kubectl 部署之后,k8s 就会依据你的 service 中的 yaml 定义的镜像来你的镜像仓库拉取方才你打包的最新镜像,so~~上线胜利啦!

嗯,有的同学说,阿里云 k8s 好用是好用,可是我不会写 or 不想写 Dockerfile,不会写 k8s 的 yaml or 不想写,没关系,goctl 说放开它,让我来

生成 Dockerfile

$ goctl docker -go user.go 

生成 k8s yaml

$ goctl kube deploy -name user-api -namespace blog -image user:v1 -o user.yaml -port 2233

所以,就是这么简略

拜访流程

app/web/pc 透过防火墙,首先拜访到阿里云的负载平衡 SLB,同时 SLB 能够将你的后端服务器 ip 暗藏起来,同时能够预防 DDOS 攻打,尽管有额度的,然而好过没有~~,而后 SLB 拜访到后面的 nginx,nginx 作为代理应用,k8s 中的 service 通过 nodeport 形式裸露进去在 nignx 中代理到该 service,同时在 nginx 中上报日志到 kafka,而后 api 能够在 etcd 中拿到多个 rpc 节点,调用多个后端 rpc 服务,rpc 负责跟 db 交互、或者调用其余 rpc 获取数据(当然 api、rpc 之间是通过 etcd 动静发现的)返回给 api,api 就是聚合数据,而后层层返回到客户端。

整体架构都是高可用高可用

我的项目设计

我的项目地址:https://github.com/Mikaelemmm…

go 的我的项目比拟灵便不像 java 曾经造成对立标准化了,所以对于不同我的项目的构造都不一样,我的做法是如下:

整个我的项目应用的一个大仓,我的项目 fishtwo 根目录下:

  • app : 利用外部程序
  • build:构建、以及脚本等
  • lib:应用程序用到的外部库
  • app 下分为 3 个模块:

    • gateway:api 服务
    • services:rpc 服务
    • jobs:日常要解决的工作(这个能够应用 go-zero 作者的 go-queue,测试了下很好用,哈哈,前面搞好也会写进来)

下一篇咱们来看看:

  1. 怎么革新 gateway 服务
  2. 怎么革新 rpc 服务
  3. jobs 怎么定义?怎么和我的项目联合?

未完待续~~~


框架地址

https://github.com/tal-tech/go-zero

欢送应用 go-zero 并 star 反对咱们 ????

go-zero 系列文章见『微服务实际』公众号

退出移动版