Go微服务实战 - 从0到1搭建一个类Instagram应用(持续更新)
概要
近几年各大移动应用基本都有社区Community(或动态Moments)的功能,展现形式各不相同,比如
国内的有:微博、朋友圈、抖音、小红书、keep、绿洲、即刻等
国外的有:Instagram、Twitter、HelloTalk等
特别是近几年流行的社交类应用,更是一个不可或缺的feature了,本人刚好近几年也一直从事此类的开发,所以准备搭建一套出来。
社区(动态)在APP中的作用
简单来说就是使用动态功能可以通过增加人与人之间的沟通进而提高用户在应用内的活跃度,让用户在应用内停留的时间更长(个人观点)。
为什么要做这么一套服务?
主要有两个目的
- 之前都是使用 RESTful API 来开发的,这次基础服务会使用gRPC来实现,同时也对之前做的一些不好的地方做下优化和改进
- 把实现思路开放出来,希望可以帮助到需要的同学
通过这套微服务可以学到什么?
- 微服务如何划分
- 代码目录如何分层
- RESTful的使用
- gRPC/ProtocolBuffer的使用
- GORM/Redis/RabbitMQ在Go中的使用
- 如何写单元测试
- 链路追踪的使用
- 如何在K8s中部署微服务
- 使用Prometheus+Grafana进行监控
- 等等...
当然最基本的用户功能也是需要有的,那么如果一个用户发了一条动态,粉丝如何收到呢? 所以这里也离不开关系服务。可以先来看下整体架构。
业务架构图

技术选型
- 网关Gateway Apache APISIX
- 开发语言 Go
- 开发框架 eagle 微服务框架
- 分布式缓存 Redis
- 数据存储 MySQL
- 数据库操作 GORM
- RPC通信 gRPC + Protocol Buffer
- 应用部署 Docker + K8s
- 监控告警 Prometheus + Grafana
- 分布式链路追踪 OpenTelemetry(Jaeger)
- 消息队列 Redis/RabbitMQ
项目分层架构
在开发具体的服务之前,让我们先了解一下项目内的分层架构

微服务划分
该微服务系统整体会包含如下4大服务:
1. 用户服务(gRPC+Protocol Buffer)
该服务主要提供以下功能
- 用户登录
- 用户注册
- 修改密码
- 更新用户信息
- 获取用户信息
- 批量获取用户信息
2. 关系服务(gRPC+Protocol Buffer)
该服务主要提供以下功能
- 关注
- 取消关注
- 批量获取关注关系
- 粉丝列表
- 关注列表
3. 动态服务(gRPC+Protocol Buffer)
该服务主要提供以下功能
- 发布动态
- 获取动态详情
- 点赞动态
- 评论动态
- 我发布过的动态列表
- 我关注的动态列表
- 最新的动态列表
- 评论列表
- 回复评论
- 点赞评论
- 回复列表
- 通知列表
4. 聚合层服务
主要对外提供API服务,面向的是前端,比如WEB, iOS, Android、小程序等
上面的几个服务大部分接口都会从此服务进行逻辑调用处理。比如处理用户数据,关系数据等
开发 Plan
会按照服务逐个进行开发,然后在聚合服务中进行数据组装,最后供客户端进行调用。
- 聚合服务 ins-api
- 用户相关API开发
- 关系相关API开发
- 动态相关API开发
- 发布动态
- 获取动态详情
- 点赞动态
- 评论动态
- 回复评论
- 点赞评论
- 我发布过的动态列表
- 我关注的动态列表
- 最新的动态列表
- 评论列表
- 回复列表
- 用户服务 user-service
- 画架构图
- 数据库定义
- proto定义
- 生成repo/cache/service
- 业务逻辑实现
- 注册grpc服务进行测试
- cache 单元测试
- repo生成mock, 单元测试
- 服务部署
- 链路追踪
- 关系服务 relation-service
- 画架构图
- 数据库定义
- proto定义
- 定义repo/service
- 业务逻辑实现
- 注册grpc服务进行测试
- 服务部署
- 链路追踪
- 动态服务 moment-service
- 画架构图
- 数据库定义
- proto定义
- 定义repo/service
- 业务逻辑实现
- 注册grpc服务进行测试
- 服务部署
- 链路追踪
项目源码
https://github.com/go-microservice
目前已经完成了一半多的工作,后面会继续补充具体服务的详细内容,包括但不限于开发流程、测试、部署、链路追踪等。
Go微服务实战 - 从0到1搭建一个类Instagram应用(持续更新)的更多相关文章
- Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)
作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...
- Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)
概要 用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了.所以他的重要性不言而喻.本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程. 目录 Go微服务实战 - 从 ...
- ASP.NET Core微服务实战系列
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...
- Spring Cloud微服务实战阅读笔记(一) 基础知识
本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识 1:什么是微服务架构 是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...
- 微服务实战(三):深入微服务架构的进程间通信 - DockOne.io
原文:微服务实战(三):深入微服务架构的进程间通信 - DockOne.io [编者的话]这是采用微服务架构创建自己应用系列第三篇文章.第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使 ...
- SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
- .Net微服务实战之负载均衡(上)
系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 相关源码:https://github.com/SkyChenSky/Sikiro P ...
- .Net微服务实战之负载均衡(下)
系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战 ...
- .Net微服务实战之可观测性
系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战 ...
随机推荐
- 高级数据结构学习笔记 / Data Structure(updating)
树状数组 查询操作:O(logn) 修改操作:O(logn) #define lowbit(x) (x & -x) int tr[N]; // 树状数组 // 添加c个大小为x的数值 vo ...
- async和await详解
async和await详解 1.非UI线程中执行 Test()函数带有async 和await ,返回值写成Task. 1 using System; 2 using System.Threadin ...
- 关于2022年3月9日之后Typora登录不了--已解决
p.s.今天是2022.7.27,软件版本:13.6.1 (以下所有方法,亲自尝试后整理出的) 报错信息: This beta version of typora is expired, please ...
- Javascript 构造函数、原型对象、实例之间的关系
# Javascript 构造函数.原型对象.实例之间的关系 # 创建对象的方式 # 1.new object() 缺点:创建多个对象困难 var hero = new Object(); // 空对 ...
- MySQL Shell无法拉起MGR集群解决办法
MySQL Shell无法拉起MGR集群解决办法 用MySQL Shell要重新拉起一个MGR集群时,可能会提示下面的错误信息: Dba.rebootClusterFromCompleteOutage ...
- ClickHouse与Elasticsearch压测实践
1 需求分析 1.1 分析压测对象 1)什么是ClickHouse 和Elasticsearch ClickHouse 是一个真正的列式数据库管理系统(DBMS).在 ClickHouse 中,数据始 ...
- 前端Long类型丢失精度问题
有时候后端向前端传输Long类型,数字过长会出现丢失精度的问题 比如后端传来的是这样一个长数字串 那么前端的弹窗显示的是 ![](https://img2022.cnblogs.com/blog/22 ...
- RHEL7从安装的字符界面转为桌面GUI图形化步骤
1.光驱装载原版光盘镜像 2.挂载光盘镜像 mount /dev/sr0 /media 3.配置本地yum源 vi /etc/yum.repos.d/local.repo [rhel] name=rh ...
- **手把手教你安装 Anaconda + Tensor flow+Pycharm**
手把手教你安装 Anaconda + Tensor flow+Pycharm 这篇博文主要讲一下自己安装Anaconda + Tensor flow + Pycharm 的一个过程. 1. ANACO ...
- 《网页设计基础——CSS的四种引入方式详解》
网页设计基础--CSS的四种引入方式详解 一.行内式: 规则: 1. 行内式是所有样式方法中最为直接的一种,它直接对HTML的标记使用style属性,然后将CSS代码直接写在其中. 格 ...