企业项目迁移go-zero全攻略(一)
作者: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/Mikaelemmmm/gozerobasic
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 系列文章见『微服务实践』公众号
企业项目迁移go-zero全攻略(一)的更多相关文章
- 废弃fastjson!大型项目迁移Gson保姆级攻略
前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...
- 打造一个高逼格的android开源项目——小白全攻略 (转)
转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...
- Moon.Orm3.8技术全攻略
Moon.ORM技术全攻略 一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...
- 生成 PDF 全攻略【2】在已有PDF上添加内容
项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...
- 从小工到专家 ——读《Java程序员职场全攻略》有感
从小工到专家 ——读<Java程序员职场全攻略>有感 <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...
- 用C#制作PDF文件全攻略
用C#制作PDF文件全攻略 目 录 前 言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...
- (转)战斗bug技巧全攻略
原文地址:http://www.cnblogs.com/manuosex/p/3736077.html 程序员不是有一幅这样的对联吗 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然 ...
- Android-x86虚拟机安装配置全攻略
转自Android-x86虚拟机安装配置全攻略 注:这里安装从简,具体请参考虚拟机Vmware安装运行安卓4.0详细教程 Android-x86虚拟机安装配置网上有很多,但是全部说明白的确不多,希望这 ...
- [置顶] 创建GitHub技术博客全攻略
[置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...
- Android使用XML全攻略(1)
Android使用XML全攻略(1) Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...
随机推荐
- js上 十七、数组-3
十七.数组-3 #课堂案例 \1. 封装一个chunk(arr,size)的函数,把该数组arr按照指定的size分割成若干个数组块. 例如:chunk([1,2,3,4],2) 返回结果:[[1,2 ...
- js上 四、数据类型转换
1. 转布尔类型 Boolean():可以将任意类型的数据转为布尔类型: 语法:Boolean(值) 规则:
- JQuery ajax request及Java服务端乱码问题及设置
今天花了半天功夫才搞定2个乱码问题 1. 原先一直用form提交,现在改作JQuery ajax 提交,发现乱码. 2. window.location url中含有中文提交后,乱码. 第一个问题: ...
- 逆袭故事|从“点点点”到月薪17K,这个女孩子做到啦
姓:XXX,XX VIP 学员,一名自动化测试工程师!之前在某大型培训机构转行学习软件测试时就是木子老师的学生,她也一直关注木子老师的动态,后来知道木子老师打算开设测试开发高级提升班,等开了班就报名了 ...
- ceph如何快速卸载所有osd及擦除磁盘分区表和内容并重新加入
我的ceph集群中有4台服务器,16个osd,因为某些原因,集群中的数据都不要了,但是集群要保留给新的应用使用,集群现有的osd情况如下 [root@ceph-host-01 ~]# cat /etc ...
- Core3.0全局捕获异常
前言 此方法由百度所得,找不到原文链接了 步骤 1.创建异常捕获类 using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; u ...
- [UWP] - 用Json格式来发送一个Post请求到WCF服务
测试实体类:(需要在客户端和服务端建了有相同字段名称的实体) public class CompositeType { public CompositeType() { SubCompositeTyp ...
- [leetcode349]Intersection of Two Arrays
设计的很烂的一道题 List<Integer> res = new ArrayList<>(); // int l1 = nums1.length; // int l2 = n ...
- springboot文件上传问题记录
最近做项目需要开发一个通过excel表格导入数据的功能,上传接口写好调试的时候遇到几个问题,记录一下. 报错1: 15:50:57.586 [[1;33mhttp-nio-8763-exec-8 [0 ...
- MVC和WebApi路由机制比较
1.MVC使用的路由 在MVC中,默认路由机制是通过解析url路径来匹配Action.比如:/User/GetList,这个url就表示匹配User控制器下的GetList方法,这是MVC路由的默认解 ...