百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

你还在手撕微服务?快试试 go-zero 的微服务自动生成

ccwgpt 2024-10-01 08:14 21 浏览 0 评论

0. 为什么说做好微服务很难?

要想做好微服务,我们需要理解和掌握的知识点非常多,从几个维度上来说:

  • 基本功能层面 并发控制&限流,避免服务被突发流量击垮 服务注册与服务发现,确保能够动态侦测增减的节点 负载均衡,需要根据节点承受能力分发流量 超时控制,避免对已超时请求做无用功 熔断设计,快速失败,保障故障节点的恢复能力
  • 高阶功能层面 请求认证,确保每个用户只能访问自己的数据 链路追踪,用于理解整个系统和快速定位特定请求的问题 日志,用于数据收集和问题定位 可观测性,没有度量就没有优化

对于其中每一点,我们都需要用很长的篇幅来讲述其原理和实现,那么对我们后端开发者来说,要想把这些知识点都掌握并落实到业务系统里,难度是非常大的,不过我们可以依赖已经被大流量验证过的框架体系。go-zero微服务框架就是为此而生。

另外,我们始终秉承工具大于约定和文档的理念。我们希望尽可能减少开发人员的心智负担,把精力都投入到产生业务价值的代码上,减少重复代码的编写,所以我们开发了goctl工具。

下面我通过书店服务来演示通过go-zero快速的创建微服务的流程,走完一遍,你就会发现:原来编写微服务如此简单!

1. 书店服务示例简介

为了教程简单,我们用书店服务做示例,并且只实现其中的增加书目和检查价格功能。

写此书店服务是为了从整体上演示go-zero构建完整微服务的过程,实现细节尽可能简化了。

2. 书店微服务架构图

3. goctl各层代码生成一览

所有绿色背景的功能模块是自动生成的,按需激活,红色模块是需要自己写的,也就是增加下依赖,编写业务特有逻辑,各层示意图分别如下:

  • API Gateway
  • RPC
  • model

下面我们来一起完整走一遍快速构建微服务的流程,Let’s Go!?♂?

4. 准备工作

  • 安装etcd, mysql, redis
  • 创建工作目录bookstore
  • 在bookstore目录下执行go mod init bookstore初始化go.mod

5. 编写API Gateway代码

bookstore/api目录下通过goctl生成api/bookstore.api

编辑bookstore.api,为了简洁,去除了文件开头的info,代码如下:

type用法和go一致,service用来定义get/post/head/delete等api请求,解释如下:

  • service bookstore-api {这一行定义了service名字
  • @server部分用来定义server端用到的属性
  • handler定义了服务端handler名字
  • get /add(addReq) returns(addResp)定义了get方法的路由、请求参数、返回参数等
  • 使用goctl生成API Gateway代码

生成的文件结构如下:

启动API Gateway服务,默认侦听在8888端口

测试API Gateway服务

返回如下:

可以看到我们API Gateway其实啥也没干,就返回了个空值,接下来我们会在rpc服务里实现业务逻辑

  • 可以修改internal/svc/servicecontext.go来传递服务依赖(如果需要)
  • 实现逻辑可以修改internal/logic下的对应文件
  • 可以通过goctl生成各种客户端语言的api调用代码
  • 到这里,你已经可以通过goctl生成客户端代码给客户端同学并行开发了,支持多种语言,详见文档
  • 6. 编写add rpc服务

    rpc/add目录下编写add.proto文件

    可以通过命令生成proto文件模板

    修改后文件内容如下:

    goctl生成rpc代码,在rpc/add目录下执行命令

    文件结构如下:

    直接可以运行,如下:

      $ go run add.go -f etc/add.yaml
      Starting rpc server at 127.0.0.1:8080...
    复制代码

    etc/add.yaml文件里可以修改侦听端口等配置

    7. 编写check rpc服务

    rpc/check目录下编写check.proto文件

    可以通过命令生成proto文件模板

    goctl生成rpc代码,在rpc/check目录下执行命令

    文件结构如下:

    etc/check.yaml文件里可以修改侦听端口等配置

    需要修改etc/check.yaml的端口为8081,因为8080已经被add服务使用了,直接可以运行,如下:

    8. 修改API Gateway代码调用add/check rpc服务

    • 修改配置文件bookstore-api.yaml,增加如下内容


    • 通过etcd自动去发现可用的add/check服务
    • 修改internal/config/config.go如下,增加add/check服务依赖
    • 修改internal/svc/servicecontext.go,如下:


    • 通过ServiceContext在不同业务逻辑之间传递依赖
    • 修改internal/logic/addlogic.go里的Add方法,如下:
    • 通过调用adder的Add方法实现添加图书到bookstore系统
    • 修改internal/logic/checklogic.go里的Check方法,如下:

    • 通过调用checker的Check方法实现从bookstore系统中查询图书的价格

    9. 定义数据库表结构,并生成CRUD+cache代码

    • bookstore下创建rpc/model目录:mkdir -p rpc/model
    • 在rpc/model目录下编写创建book表的sql文件book.sql,如下:
    • 创建DB和table create database gozero

    生成后的文件结构如下:

    10. 修改add/check rpc代码调用crud+cache代码

    • 修改rpc/add/etc/add.yaml和rpc/check/etc/check.yaml,增加如下内容:

    修改rpc/check/internal/logic/checklogic.go,如下:

    至此代码修改完成,凡是手动修改的代码我加了标注

    11. 完整调用演示

    • add api调用

    返回如下:

    • check api调用

    12. Benchmark

    因为写入依赖于mysql的写入速度,就相当于压mysql了,所以压测只测试了check接口,相当于从mysql里读取并利用缓存,为了方便,直接压这一本书,因为有缓存,多本书也是一样的,对压测结果没有影响。

    压测之前,让我们先把打开文件句柄数调大:

    ulimit -n 20000
    复制代码

    并日志的等级改为error,防止过多的info影响压测结果,在每个yaml配置文件里加上如下:

    Log:
        Level: error
    复制代码

    可以看出在我的MacBook Pro上能达到3万+的qps。

    13. 完整代码

    github.com/tal-tech/go…

    14. 总结

    我们一直强调工具大于约定和文档

    go-zero不只是一个框架,更是一个建立在框架+工具基础上的,简化和规范了整个微服务构建的技术体系。

    我们在保持简单的同时也尽可能把微服务治理的复杂度封装到了框架内部,极大的降低了开发人员的心智负担,使得业务开发得以快速推进。

    通过go-zero+goctl生成的代码,包含了微服务治理的各种组件,包括:并发控制、自适应熔断、自适应降载、自动缓存控制等,可以轻松部署以承载巨大访问量。

    有任何好的提升工程效率的想法,随时欢迎交流!

    相关推荐

    固识像系统曝光!类魂篝火点与多角色切换战斗有何亮点?

    由Tipsworks开发,叠纸网络发行的全端游戏《万物契约》今日发布了第一支实机演示PV。火子哥一直以来还是比较关注这款游戏的,今天就带大家来看看这次的实机演示透露出什么新东西。开头在经过了一段预渲染...

    Docker 架构详解与核心概念实战图解:一文读懂容器的前世今生

    不懂Docker架构,你只是“用容器的人”;理解了它的底层逻辑,才能成为真正的高手!在学习Docker之前,很多同学可能会陷入一个误区:“反正我用dockerrun就能跑起服务,架构这种...

    新考纲-系统架构设计师(软考高级)一站式通关课程(25章完结)

    新考纲-系统架构设计师(软考高级)一站式通关课程(25章完结)获课》jzit.top/5255/针对新旧考纲中新增的云原生和AI架构考点,考生可以采取以下应对策略:一、云原生考点应对策略深入理解云原生...

    前后端分离的项目管理系统框架

    技术栈:Thinkphp、Vue3、Typescript、Element-plus、pinia、Echarts等

    掌握这6种软件架构,构建可维护、可扩展的系统不再难

    说实话,大多数人不会一觉醒来突然决定:“今天,我要成为一名软件架构师!”通常的故事是这样的:一个小项目不断长大,代码像野兽一样在每个角落咆哮,而你终于意识到:“也许我应该早点考虑怎么架构这玩意儿。”软...

    Windows实时拓展架构-鸿道Intewell-win构型

    鸿道Intewell操作系统软件采用开放式结构,具备较高的模块化程度,根据应用场景需要进行自由裁剪定制。实时扩展构型用于在多核处理器上使用硬件隔离技术,允许在同一台目标机上同时运行一个通用操作系统(G...

    高手编写的自动化测试框架是如何管理用例?他们都会用到这个包。

    本文是接口自动化测试框架系列篇的第四篇,主要介绍yaml包的使用。自动化测试的本质是将功能测试用例交给代码去执行,测试人员往往是在自动化框架添加对应的测试用例即可(也叫测试脚本)。而维护测试用例...

    日资著名车企在自动化设备中采用的PLC程序标准框架

    日资著名车企在自动化设备中采用的PLC程序标准框架,通常融合了先进的自动化控制理念与严谨的日式管理风格,注重程序的可靠性、可维护性和扩展性。以下是一个详细的PLC程序标准框架说明:一、程序框架的基本结...

    Robot Framework实现多平台自动化测试框架搭建

    RobotFramework官方站:https://robotframework.org/一、robotframework安装pipinstallrobotframework二、robotf...

    chatgpt只用3秒钟就能写一个基于pytest的自动化框架

    以下是一个使用pytest框架进行百度登录界面自动化测试的示例代码:1.安装pytest首先需要安装pytest,可以使用以下命令进行安装:pipinstallpytest2.编写测试用例在项目...

    API 自动化测试框架分享

    前言接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率,仍然是大部分公司需要解决的问题。框架定位数据驱动设计模式,无需写测试代码脚本即可实现自动化等...

    资深测试必备技能!TestNG自动化测试框架实战详解

    1、TestNG导言在软件测试工作中,自动测试框架是不可或缺的,之前有Junit和Nunit框架,后有TestNG。TestNG不但吸取了Junit和Nunit框架的思想,而且创造了更强大的功能,它不...

    Java开发中的自动化测试框架:从零开始玩转测试工具

    Java开发中的自动化测试框架:从零开始玩转测试工具在Java开发的世界里,自动化测试框架就像一位忠诚的助手,它不仅能帮你发现代码中的“隐形炸弹”,还能让你的程序更健壮、更可靠。那么,今天就让我们一起...

    测试新手如何搭建自动化框架 ?手把手教会从0到1的搭建过程。

    1.接口自动化测试自动化测试虽然是测试中比较热的一门技术,但凡一个测试岗位,你几乎都能看到有自动化测试的要求。但不得不说,最入门的自动化测试其实已经烂大街了,就像国产神车H6,随处可见。当然...

    塞土族领导人:应在联合国决议规定框架内解决塞浦路斯问题

    新华社尼科西亚10月31日电(记者张章)塞浦路斯媒体10月31日报道说,塞土耳其族领导人阿肯哲日前表示,塞浦路斯问题的解决应在联合国安理会决议规定的框架内进行。据报道,阿肯哲30日晚在土耳其伊斯坦布尔...

    取消回复欢迎 发表评论: