V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Gota
V2EX  ›  Go 编程语言

从零开始搭建一个简单实用的微服务模板

  •  
  •   Gota ·
    gota33 · 2022-04-24 04:33:46 +08:00 · 2784 次点击
    这是一个创建于 726 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近总结了下平时工作中写的微服务, 抽出来一个比较简单直观的微服务项目启动模板. 如果对 Go 微服务选工具库或组织代码有所疑虑的话可以读读看, 限于篇幅这里就放个引言, 全篇可以点链接.


    引言

    微服务算是一个 Go 语言的主要应用场景, 与 Java 不同 Go 语言生态中并不存在一个像 Spring 那样具有绝对统治力的后端框架. 一般大家都是按照自己的业务需求, 组合一些工具库来实现微服务. 这次就带大家一起来实现一个简单实用的项目模板.

    首先分享下我平常写微服务时常用的库:

    1. 日志: github.com/sirupsen/logrus
    2. 命令行: github.com/urfave/cli/v2
    3. 服务器: github.com/gofiber/fiber/v2
    4. HTTP 客户端: github.com/go-resty/resty/v2
    5. 参数校验: github.com/go-playground/validator/v10
    6. JWT: github.com/dgrijalva/jwt-go
    7. MySQL: github.com/go-sql-driver/mysql
    8. 错误处理: github.com/gota33/errors
    9. 初始化工具: github.com/gota33/initializr

    这次的项目模板准备支持的特性:

    1. 命令行启动
    2. 优雅退出
    3. 配置仓库
    4. 访问日志
    5. JWT
    6. 结构化错误处理
    7. 请求校验

    全篇: https://blog.igota.net/posts/20220422/

    8 条回复    2022-04-28 10:37:08 +08:00
    mengdodo
        1
    mengdodo  
       2022-04-24 08:50:53 +08:00
    跟风贴一个

    ```
    ├── cmd # 执行目录
    │ ├── api.go # Api 入口文件
    │ ├── games.go # websocekt 单用户入口文件
    │ ├── createRsaPem.go # 手动生成 rsa 非对称密钥
    ├── configs # 配置文件
    │ ├── local.yaml # 本地环境
    │ ├── dev.yaml # 测试环境
    │ ├── pro.yaml # 正式环境
    ├── app
    │ ├── api
    │ │ ├── routes
    │ │ │ ├── api
    │ │ ├── controller
    │ │ ├── model //数据结构体
    │ │ ├── middleware
    │ │ │ ├── responseJson.go //包裹响应数据为 json
    │ │ │ ├── tokenAuth.go //token 验证中间件
    │ │ ├── proto //protobuf
    │ │ ├── utls //公共函数存放
    │ ├── game # 游戏服务器( Nano server )
    ├── internal
    │ ├── pkg # 项目基础包
    │ │ ├── jwt # jwt 生成和验证函数库
    │ │ ├── algoutil # 常用工具函数
    │ │ │ ├── algoutil.go
    │ │ ├── crypto # md5 rsa sha1 x509 base64 相关工具
    │ │ │ ├── crypto.go
    │ │ ├── errutil # 游戏服务器中错误码和错误信息统一管理
    │ │ │ ├── code.go
    │ │ │ ├── errutil.go
    │ │ ├── whitelist # 白名单验证工具函数
    │ │ │ ├── white_list.go
    ├── http.go # api 项目公用框架入口
    ├── websocket.go # websocket 项目公用框架入口

    ```
    Dganzh
        2
    Dganzh  
       2022-04-24 14:23:42 +08:00
    不错不错,学习学习
    golangLover
        3
    golangLover  
       2022-04-25 09:00:26 +08:00 via Android
    学习了谢谢
    twistedmeadows
        4
    twistedmeadows  
       2022-04-25 17:59:04 +08:00
    学习了!先收藏!
    sciel
        5
    sciel  
       2022-04-26 09:01:24 +08:00 via iPhone
    怎么没有讲服务注册、发现、调用、限流、熔断呢。
    Gota
        6
    Gota  
    OP
       2022-04-26 09:22:45 +08:00
    @sciel 微服务治理其实是个挺大的话题,这里简单说两句。

    在前 Kubernetes 时代确实需要在微服务代码中实现相关的治理功能,不过自从 Kubernetes 成为主流之后这就不再是一个必选项了,我们只要专心写业务代码,再搭配合适的 Ingress 实现就可以做到同样的效果。

    考虑到每篇文章的正交性,这篇文章还是主要讲怎么组织业务代码,Part 2 中可能会提一下 Kubernetes 的部署配置,但也不会太深入,毕竟这个话题想讲明白估计得写一个系列了。
    sciel
        7
    sciel  
       2022-04-26 11:32:04 +08:00
    @Gota 期待你深入浅出的讲解,我觉得单个节点程序,很多常用的框架都可以使用。如果可以重点讲讲如何将节点组织起来,可能给大家的收获会更多。
    FanZhen
        8
    FanZhen  
       2022-04-28 10:37:08 +08:00
    学习学习~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2960 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:15 · PVG 19:15 · LAX 04:15 · JFK 07:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.