Go 微服务实战 - 从 0 到 1 搭建一个类 Instagram 应用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qloog
V2EX    推广

Go 微服务实战 - 从 0 到 1 搭建一个类 Instagram 应用

  •  
  •   qloog 2022 年 1 月 18 日 3750 次点击
    这是一个创建于 1452 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2022 年给自己定一个小目标,万一实现了呢? 不,是一定要实现

    概要

    近几年各大应用基本都有社区(动态)的功能,展现形式各不相同,比如国内的有:

    • 微博
    • 朋友圈
    • 抖音
    • 小红书

    国外的有:

    • Instagram
    • Twitter 等(当然他们做的就更糟早了)。

    也算是比较流行的一个 feature 了,刚好本人近几年也一直从事此类的开发,所以准备搭建一套出来。

    社区在 APP 中的作用

    简单来说就是使用动态功能可以提高用户在应用内的活跃度,让用户在应用内停留的时间更长(个人观点)。

    当然最基本的用户功能也是需要有的,那么如果一个用户发了一条动态,粉丝如何收到呢? 所以这里也离不开关系服务。可以先来看下整体架构。

    为什么要做这么一套服务?

    主要有两个目的

    1. 之前都是使用 restful API 来开发的,基础服务会用 gRPC 来实现,同时也对之前做的一些不好的地方做下优化和改进
    2. 把实现思路开放出来,希望可以帮助到需要的同学

    如果有觉得设计不好的地方也欢迎提供建议,共同改进。

    通过这套微服务可以学到什么?

    • 微服务如何划分
    • 代码目录如何分层
    • REST 的使用
    • gRPC/ProtocolBuffer 的使用
    • GORM/Redis/Kakfa 在 Go 中的使用
    • 链路追踪的使用
    • 微服务在 K8S 中如何部署
    • 等等...

    业务架构图

    arch

    服务划分

    该微服务系统整体会包含如下 4 大服务:

    1. 用户服务(gRPC+Protocol Buffer)

    该服务主要提供以下功能

    • 注册
    • 登录
    • 更新用户信息
    • 获取用户信息
    • 批量获取用户信息

    2. 关系服务(gRPC+Protocol Buffer)

    该服务主要提供以下功能

    • 关注
    • 取消关注
    • 批量获取关注关系
    • 粉丝列表
    • 关注列表

    3. 动态服务(HTTP)

    该服务主要提供以下功能

    • 发布动态
    • 获取动态详情
    • 点赞动态
    • 评论动态
    • 回复评论
    • 点赞评论
    • 我发布过的动态列表
    • 我关注的动态列表
    • 最新的动态列表

    4. 聚合层服务

    主要对外提供 API 服务,面向的是前端,比如 WEB, iOS, Android 等

    上面的几个服务大部分接口都会从此服务进行逻辑调用处理。比如处理用户数据,关系数据等

    技术选型

    • 开发框架 eagle 微服务框架
    • 开发语言 Go
    • 分布式缓存 Redis
    • 数据存储 MySQL
    • 数据库操作 GORM
    • RPC 通信 gRPC + Protocol Buffer
    • 应用部署 Docker + K8S + Helm
    • 监控告警 Prometheus + Grafana
    • 分布式链路追踪 Jaeger
    • 消息队列 Kafka/RabbitMQ

    开发步骤

    会按照服务逐个进行开发,最后在聚合服务中进行组合,最后供客户端进行调用。

    • 聚合服务 ins-app
      • 用户相关 API 开发
      • 关系相关 API 开发
      • 动态相关 API 开发
    • 用户服务 user-service
      • 画架构图
      • 数据库定义
      • proto 定义
      • 定义 repo/service
      • 业务逻辑实现
      • 注册 grpc 服务进行测试
    • 关系服务 relation-service
      • 画架构图
      • 数据库定义
      • proto 定义
      • 定义 repo/service
      • 业务逻辑实现
      • 注册 grpc 服务进行测试
    • 动态服务 moment-service
      • 画架构图
      • 数据库定义
      • proto 定义
      • 定义 repo/service
      • 业务逻辑实现
      • 注册 grpc 服务进行测试

    好,小目标定完了,后面就是撸起袖子加油干了了

    原文(不定期更新): https://legend-hero-0e2.notion.site/Go-0-1-Instagram-6597618e65a647d282a7d45ff2554246

    第 1 条附言    2022 年 1 月 19 日
    第 2 条附言    2023 年 7 月 5 日
    主体功能已经开发完毕,后面就是优化和持续迭代了
    https://github.com/go-microservice
    13 条回复    2022-02-10 11:19:47 +08:00
    wsseo
        1
    wsseo  
       2022 年 1 月 18 日
    没有地址
    nekota
        2
    nekota  
       2022 年 1 月 19 日 via iPhone
    很合理的架构。能展开讲一下聚合层和消息队列的应用吗?
        3
    ufan0  
       2022 年 1 月 19 日
    持续关注,期待更新
    rv54ntjwfm3ug8
        4
    rv54ntjwfm3ug8  
       2022 年 1 月 19 日   1
    你这是来推广你的框架吧 /t/669961 GitHub 1024casts/snake 重定向到 go-eagle/eagle
    推广贴请发在 推广 节点
    @Livid
    rv54ntjwfm3ug8
        5
    rv54ntjwfm3ug8  
       2022 年 1 月 19 日   1
    看了下 OP 已经发了不止一个花式推广贴了 /t/675331
    muzuiget
        6
    muzuiget  
       2022 年 1 月 19 日
    机智如我直奔评论区。
    Livid
        7
    Livid  
    MOD
    PRO
       2022 年 1 月 19 日
    @qloog 这个主题已经被移动。

    请阅读 V2EX 的节点使用说明:

    help/node
    qloog
        8
    qloog  
    OP
       2022 年 1 月 19 日
    @theklf4 推广的时代已经过去,现在主要是应用阶段
    qloog
        9
    qloog  
    OP
       2022 年 1 月 19 日
    qloog
        10
    qloog  
    OP
       2022 年 1 月 19 日
    @theklf4 不算吧,就是要做实战项目呢
    codespots
        11
    codespots  
       2022 年 1 月 20 日
    老哥,我还没用 yaf 写过一个实际项目,你这都从 go 进化到 go 的微服务了
    qloog
        12
    qloog  
    OP
       2022 年 2 月 10 日
    @codespots 跟上市场形式,转型要快
    codespots
        13
    codespots  
       2022 年 2 月 10 日   1
    @qloog 那看来我要 star 下了,跟着你学习 go 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:44 PVG 18:44 LAX 02:44 JFK 05:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86