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微服务实战 ...
随机推荐
- 【每天学一点-01】 在SpringBoot项目中使用Swagger2
今天在做毕设的时候,发现在前后端分离的情况下,去调用接口数据时很不方便,然后回想过去,和同学一起做项目的时候,他负责后端,我负责前端,当时调用他的弄好的接口可以说是非常方便,主要是可以通过UI页面直接 ...
- Java开发学习(十六)----AOP切入点表达式及五种通知类型解析
一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...
- 非root用户linux下安装FFTW
一.环境准备 确保g++可用本次编译是基于 GNU C++ 环境的,因此务必确定g++编译器可用,使用如下命令验证:命令:g++ --version出现类似如下输出则表明编译器可用: 二.下载FFTW ...
- PhoneBean实体类的封装和map输出键值对的设置
之前我们写好了bean类型.现在我们再看看这个需求中,map和reduce各自的流程. Map阶段: 字段切分以后保留如下字段:以第一行为例,就保留13726230503112 2481 24681 ...
- Mybatis 缓存原理
Mybatis 缓存原理 本文来自拉钩 java 高薪训练营,如果文章写的不好,看不懂可以找我要课程视频,不收费. 只愿在编程道路上,寻求志同道合的码友.v:15774135883 1 Mybatis ...
- Git 05 文件操作
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 文件的四种状 ...
- MyBatis-Plus(二、常用注解)
1.@TableName @TableName 用法:映射数据库的表名,如果数据库表名与实体类名不一致,用@TableName来映射. package com.example.mybatisplus. ...
- MySQL-报错:Error when bootstrapping CMake:
在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root@localhos ...
- Java基础——02
今日学习 Java API Scanner package cn.lsl.day03.demo01; //导包 import java.util.Scanner; public class demo0 ...
- KingbaseES批量数据加载的实践技巧
有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...