作者: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 ,测试了下很好用,哈哈,后面搞好也会写进来)

下一篇我们来看看:

  1. 怎么改造 gateway 服务
  2. 怎么改造 rpc 服务
  3. jobs 怎么定义?怎么和项目结合?

未完待续~~~


框架地址

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

欢迎使用 go-zero 并 star 支持我们

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

企业项目迁移go-zero全攻略(一)的更多相关文章

  1. 废弃fastjson!大型项目迁移Gson保姆级攻略

    前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...

  2. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  3. Moon.Orm3.8技术全攻略

    Moon.ORM技术全攻略  一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...

  4. 生成 PDF 全攻略【2】在已有PDF上添加内容

    项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...

  5. 从小工到专家 ——读《Java程序员职场全攻略》有感

    从小工到专家 ——读<Java程序员职场全攻略>有感   <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...

  6. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  7. (转)战斗bug技巧全攻略

    原文地址:http://www.cnblogs.com/manuosex/p/3736077.html 程序员不是有一幅这样的对联吗 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然 ...

  8. Android-x86虚拟机安装配置全攻略

    转自Android-x86虚拟机安装配置全攻略 注:这里安装从简,具体请参考虚拟机Vmware安装运行安卓4.0详细教程 Android-x86虚拟机安装配置网上有很多,但是全部说明白的确不多,希望这 ...

  9. [置顶] 创建GitHub技术博客全攻略

    [置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...

  10. Android使用XML全攻略(1)

    Android使用XML全攻略(1)    Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...

随机推荐

  1. css进阶 07-CSS面试题

    07-CSS面试题 #常见问题 #你是如何理解 HTML 语义化的? 语义化:指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化). 举例:段落用 p,边栏用 aside,主要内容用 ...

  2. FFmpeg 初级使用

    ffmpeg来处理多种媒体文件,对帧进行操作的时候非常的复杂,下面介绍下使用FFmpeg对视频文件的操作. 1,安装 windows安装ffmpeg: 下载ffmpeg文件解压文件到c盘配置环境变量C ...

  3. RHCSA 复习

    1.用户 # -->当前用户为root用户 $ -->当前用户为普通用户 [root@fafa ~]# su - 用户   ----切换用户 2.查看.修改主机名: ***保存在/etc/ ...

  4. CCNP之静态路由实验报告

                   静态路由实验报告 一.实验要求: 1.内网IP基于172.16.0.0/16自行子网划分 2.除了R2--R4路由器各有两个环回接口 3.R1下的PC自动获取IP地址 4 ...

  5. RESTful API风格

    前言 之前写的接口,有用过Webservices,MVC,ashx,但都没个统一的请求规范,随百度. 参考链接,原文出处 http://www.ruanyifeng.com/blog/2014/05/ ...

  6. C#中RDLC报表判断某字段的值为null

    =iif(Isnothing(Fields!VerifyStateName.Value),"未上报",Fields!VerifyStateName.Value)   空值时赋予默认 ...

  7. python序列(二)列表的删除操作

    1.使用del命令删除列表中的指定位置上的元素 >>> s=[1,2,3,4] >>> del s[1] >>> s [1, 3, 4] 2.使用 ...

  8. JVM笔记【1】-- 运行时数据区

    目录 (一)java内存区域管理 1.1 程序计数器 1.2 虚拟机栈 1.3 本地方法栈 1.4 java堆 1.5 方法区 1.5.1 运行时常量池 (二)直接内存 (一)java内存区域管理 C ...

  9. 【探索之路】机器人篇(2)-ROS系统并创建工作空间和项目

    在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:ht ...

  10. JDBC(六)—— 数据库事务

    数据库事务 事务 一组逻辑操作单元,使数据从一种状态变换到另一种状态 事务处理 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式. 当在一个事务中执行多个操作时,要么所有事 ...