作者: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
,测试了下很好用,哈哈,前面搞好也会写进来)
下一篇咱们来看看:
- 怎么革新
gateway 服务
? - 怎么革新
rpc 服务
? jobs
怎么定义?怎么和我的项目联合?
未完待续~~~
框架地址
https://github.com/tal-tech/go-zero
欢送应用 go-zero 并 star 反对咱们 ????
go-zero 系列文章见『微服务实际』公众号