Go单体服务开发最佳实践

2023-11-15

单体最佳实践的由来

  • 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也非常低,我们应该使用更简单的技术架构来加速业务价值的交付,此时单体的优势就体现出来了。

  • 正如我直播分享时经常提到,我们在使用单体快速交付业务价值的同时,也需要为业务的发展预留可能性,我们可以在单体里面清晰的拆分业务模块。

  • go-zero 社区里也有很多小伙伴在问,咱们单体开发的最佳实践应该是怎样的。

go-zero 作为一个被广泛使用的渐进式微服务框架来说,也是我在多个大型项目完整发展过程中沉淀出来的,自然我们也充分考虑了单体服务开发的场景。

如图所示的使用 go-zero 的单体架构,也可以支撑很大体量的业务规模,其中 Service 是单体服务的多个 Pod

我就通过本文详细跟大家分享一下如何使用 go-zero 快速开发一个有多个模块的单体服务。

单体示例

我们用一个上传下载的单体服务来讲解 go-zero 单体服务开发的最佳实践,为啥用这么个示例呢?

  • go-zero 社区里经常有同学会问上传文件怎么定义 API 文件,然后用 goctl 自动生成。初见此类问题会觉得比较奇怪,为啥不用 OSS 之类的服务呢?发现很多场景是用户需要上传一个excel,然后服务端解析完也就丢弃此文件了。一是文件较小,二是用户量也不大,就不用那么复杂的通过 OSS 来绕一圈了,我觉得也挺合理的。

  • go-zero 社区也有同学问下载文件怎么通过定义一个 API 文件然后 goctl 自动生成。此类问题之所以通过 Go 来做,问下来一般两个原因,一是业务刚开始,能简单点布一个服务搞定就一个吧;二是希望能吃上 go-zero 的内置 JWT 自动鉴权。

仅以此为示例,无需深入探讨上传下载是否应该通过 Go 来实现。那么接下来我们就看看我们怎么通过 go-zero 来解决这么一个单体服务,我们称之为文件(file)服务。架构如下图:

单体实现

API 定义

使用过 go-zero 的同学都知道,我们提供了一个 API 格式的文件来描述 RESTful API,然后可以通过 goctl 一键生成对应的代码,我们只需要在 logic 文件里填写对应的业务逻辑即可。我们就来看看 downloadupload 服务怎么定义 API.

Download 服务定义

示例需求如下:

  • 通过 /static/<filename> 路径下载名为 <filename&

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go单体服务开发最佳实践 的相关文章

随机推荐

  • 2022.11.29(面经五,笔试+技术面)

    2022 11 29 面经五 笔试题目不难 多刷力扣就成 1 什么是面向对象 面向对象 是把构成问题的事务分解成各个对象 而建立对象的目的也不是为了完成一个个步骤 而是为了描述某个事物在解决整个问题的过程中所发生的行为 附加 面向过程 分析
  • 【自我提高】树莓派GPIO的几种语言控制方法 C 篇

    使用C语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 C 语言下使用 wiringPi GPIO 进行编程 要安装 wiringPi pi raspberrypi sud
  • perl 入门推荐

    整理了一些perl链接 perl没有太多复杂概念 了解基础后 就可以编写各种需求脚本了 perl 相同功能 实现的方法有很多 只需了解最最基本的那种方法就好 剩下的就是百度 熟能生巧 举一反三 理解消化 perl语言 一个视频全解决 在线播
  • 合宙Air700E/4G模块使用AT指令查询基础信息

    Air700E使用AT指令查询基础信息 前言 AT指令使用 AT 确认AT固件 AT CGMR 请求制造商版本 AT CGMM 返回制造商型号编码 AT CGSN x 查询产品序列号 AT CGSN 1 查询IMEI AT CGSN 2 查
  • Flask项目(三)定义登录装饰器、图片服务、缓存机制、celery

    Flask项目 定义登录装饰器 redis文档 图片服务 封装七牛方法 城区数据下拉列表 缓存 用户认证相关 发布房源 map 函数 celery 基本使用 房屋管理 定义登录装饰器 utils commons py from werkze
  • x86汇编_MUL/IMUL乘法指令_笔记52

    32位模式下整数乘法可以实现32 16或8位的操作 64位下还可以使用64位操作数 MUL执行无符号乘法 IMUL执行有符号乘法 MUL指令 无符号数乘法 32 位模式下 MUL 无符号数乘法 指令有三种类型 执行 8 位操作数与 AL 寄
  • gitee删除上传到的远程分支的提交记录

    在实际开发中可能也经常会遇到写完代码后提交到远程分支但发现写的提交信息有误 不符合规范 由于自己的gitee账号可能没有修改提交记录的权限 因此最佳的解决方法是 撤销本地分支当前的提交记录 将代码回滚到上一个版本 提交前 重新强制再提交一版
  • 大数据挖掘、分析与应用

    第一讲 基础知识 大数据指无法在可承受的时间范围内用常规软件工具进行捕捉 管理和处理的数据集合 是需要新处理模式才能具有更强的决策力 洞察力和流程优化能力的海量高增长率和多样化的信息资产 数据挖掘 DataMining 是有组织有目的地收集
  • 安装SQLServer2008出现[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1

    问题 当我们卸载SQLServer2008后再重新安装后会出现以下问题 原因是卸载有时不能完全清理文件 解决方法 找到文件C Users user name AppData Local Microsoft Corporation删除Land
  • 深度学习Pytorch(十)——基于torchvision的目标检测模型

    深度学习Pytorch 十 基于torchvision的目标检测模型 文章目录 深度学习Pytorch 十 基于torchvision的目标检测模型 一 定义数据集 二 为PennFudan编写自定义数据集 1 下载数据集 2 为数据集编写
  • C++ 中基础的几种变量作用域,类作用域(C++复习向p5)

    文章目录 三种变量 变量作用域 初始化变量 类作用域 三种变量 局部变量 函数 代码块中的变量 形式参数 函数参数中定义的变量 在函数体中有效 全局变量 所有函数外部声明的变量 变量作用域 局部作用域 局部变量在函数执行完后销毁 全局作用域
  • 最全面的Socket使用解析

    前言 Socket的使用在Android的网络编程中非常重要 今天我将带大家全面了解Socket及其使用方法 目录 1 网络基础 1 1 计算机网络分层 计算机网络分为五层 物理层 数据链路层 网络层 运输层 应用层 其中 网络层 负责根据
  • 一次内网 Harbor 镜像仓库导出迁移过程记录

    1 整体思路 Harbor 提供有丰富的 API 接口 可以获取所有项目信息 镜像和标签等信息 通过编写 shell 脚本循环处理即可实现批量导出镜像包的需求 登陆 Harbor 后 左下角有 API 控制中心按钮 进入可以查看和调试 2
  • centos 安装配置l2tp实现***

    centos 安装配置l2tp实现 1 前言 L2TP是一种工业标准的Internet隧道协议 功能大致和PPTP协议类似 比如同样可以对网络数据流进行加密 不过也有不同之处 比如PPTP要求网络为IP网络 L2TP要求面向数据包的点对点连
  • OSI七层模型---数据链路层(以太网帧、MAC地址、MTU、MSS、ARP协议)

    我们首先来了解一下物理层的作用 物理层的主要目的是实现比特流的透明传输 为数据链路层提供服务 物理层接口解决了用几根线 多大电压 每根线什么功能 以及几根线之间是怎么协调的问题 物理层介质解决了数据载体材质以及价格优缺点的问题 通信技术解决
  • 01_I.MX6U芯片简介

    目录 I MX6芯片简介 Corterx A7架构简介 Cortex A处理器运行模型 Cortex A 寄存器组 IMX6U IO表示形式 I MX6芯片简介 ARM Cortex A7内核可达900 MHz 128 KB L2缓存 并行
  • 李宏毅 机器学习 2016 秋:6、Classification: Logistic Regression

    文章目录 六 Classification Logistic Regression 六 Classification Logistic Regression 我们来讲 Logistic Regression 我们在上一份投影片里面 我们都已
  • 点云Las格式分析及python实现

    目录 一 Las格式分析 1 公共头 2 变长记录 3 参考文献 二 安装laspy 2 0 2 三 代码实现 一 Las格式分析 1 公共头 公共头用来记录数据集的基本信息 如Li DAR点总数 数据范围 Li DAR点格式 变长记录总数
  • 在switch语句中使用字符串以及实现原理

    对于Java语言来说 在Java 7之前 switch语句中的条件表达式的类型只能是与整数类型兼容的类型 包括基本类型char byte short和int 与这些基本类型对应的封装类Character Byte Short和Integer
  • Go单体服务开发最佳实践

    单体最佳实践的由来 对于很多初创公司来说 业务的早期我们更应该关注于业务价值的交付 并且此时用户体量也很小 QPS 也非常低 我们应该使用更简单的技术架构来加速业务价值的交付 此时单体的优势就体现出来了 正如我直播分享时经常提到 我们在使用