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微服务实战 ...
随机推荐
- CentOS7添加swap分区
买了个云主机,只有1G内存,跑爬虫经常内存不足,于是只能添加swap来缓解: 1.官方推荐的swap大小定义 2.使用dd命令在根下创建swapfile dd if=/dev/zero of=/swa ...
- HashTable集合和练习题_计算一个字符串中每一个字符出现的次数
HashTable集合 /** * java.util.Hashtable<K,V>集合 implement Map<K,V>接口 * Hashtable:底层也是一个哈希表, ...
- 哎,又跟HR在小群吵了一架!
原创不易,求分享.求一键三连 书接上文: 跟HR在大群吵了一架... 难道,降本增效就是裁员吗 前段时间我问了自己一个问题,如果自己真的是公司内部的外包团队,会怎么样?自从思维转变后,很多事情居然得到 ...
- #万答10:mysqldump 是如何实现一致性备份的
万答10:mysqldump 是如何实现一致性备份的 实验场景 MySQL 8.0.25 InnoDB 实验步骤: 先开启 general_log 观察导出执行过程的变化 set global gen ...
- NC20242 [SCOI2005]最大子矩阵
题目链接 题目 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大. 注意:选出的k个子矩阵 不能相互重叠. 输入描述 第一行为n,m,k(1 ≤ n ≤ 100 ...
- java-Servlet编码/异常处理
1. Servlet输出中文(1)为什么会有乱码?out.println方法在输出时或者表单提交的时候,浏览器会对表单中的中文参数值进行编码; 注:会使用表单所在的页面打开时使用的编码方式进行编码服务 ...
- 论文解读(SEP)《Structural Entropy Guided Graph Hierarchical Pooling》
论文信息 论文标题:Structural Entropy Guided Graph Hierarchical Pooling论文作者:Junran Wu, Xueyuan Chen, Ke Xu, S ...
- Python自动化之常用模块学习
自动化常用模块 urllib和request模块学习笔记 '获取页面,UI自动化校验页面展示作用': #-*- coding : utf-8 -*-import urllib.requestimpor ...
- 定制化JDK升级引发的离奇事件
1.背景 由于Oracle对外宣称Oracle JDK停止免费用于商用.公司法务部门评估之后担心后续会惹上光司,于是就开始了JDK升级-将所有服务Oracle修改为OpenJDK.上周开始微服务JDK ...
- Python自学教程7:字典类型有什么用
字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通. Python字典的定义 字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔. 键必须是不可变 ...