Skip to content

Latest commit

 

History

History
230 lines (136 loc) · 13.4 KB

6-微服务.md

File metadata and controls

230 lines (136 loc) · 13.4 KB

Golang Lab6

目的

  • 掌握微服务架构和Web工作原理
  • 掌握HTTP协议和RPC调度方法
  • 掌握BASE、CAP理论

背景

由于疫情封校了,FanOne和小哥哥们外出Happy的计划泡汤了,只能在宿舍一起网聊。她的小哥哥们提出和她一起在手机上看片,为了让FanOne和她的小哥哥们可以快乐看片,请你写一个基于微服务架构的视频网站 (使用Kitex),让FanOne能够享受封校生活!

任务

请遵照以下接口文档完成功能

https://doc.west2.online/

本次作业新增了一个需要与AI组同学合作的接口

重构(约 20h+)

除了这个接口,你的主要任务是将上一轮的作业升级成微服务架构

如果你还不了解微服务架构,可以阅读这篇文章微服务架构 Intro

提醒

  1. 你是否在上一轮中有一些没完成或者遗漏的内容或者做的不好的地方(参考留档内容)?如果有,请在这一轮完成,并且在文档中提及
  2. 在从单体式架构升级到微服务架构的过程中,请考虑以下问题,并尽量解决
    • 你的架构是否会导致RPC循环调用?例如:在RPC用户个人信息(user_info)时,需要获取用户的视频数量、点赞数量等内容,这时候需要分别的向interaction和video两个模块发RPC
    • 如何保证微服务之间的安全性与权限管理
    • 如何保证不同微服务之间的数据一致性
    • 接口逻辑可能会有很大的变化,请注意接口逻辑的解耦

接口(约 10h+,含学习及对接过程)

新增接口

使用Milvus向量数据库实现以图搜图功能(AI模型由AI方向同学提供)

大致的流程

  1. 将图片或者图片集通过模型提取图片特征生成多维向量数据

  2. 将向量数据存储到milvus数据库中

  3. 后续搜索使用Milvus API进行相关性搜索得到符合条件的向量数据IDList

  4. 使用这个IDList去Mysql中查找到图片URL

更多细节,需要你们在4月28日后与AI同学进行详细对接

向量数据库Milvus入门及基本上手

服务注册与发现(约 5h+ , 含学习及使用过程)

服务注册与发现是一种机制,用于管理和维护微服务架构中各个服务的地址和元数据的组件。

通过服务注册与发现,可以动态地发现和调用其他微服务,从而简化了系统的管理和维护。

在这一轮中,你需要在你的项目中实现服务注册和发现

注册中心使用Nacos或者Etcd答辩时需展示

链路追踪(约 5h+ ,含学习及使用过程)

链路追踪(Traceability)是一种跟踪和记录数据、信息或事件流经过的路径和变化的能力。可以帮助开发人员快速定位系统中的性能问题和故障。

在这一轮中,你需要对项目使用链路追踪(例如Jaeger),答辩时需展示

Kubernetes(约 15h+ , 含项目部署调试过程)

在本轮作业中,你需要在你的本地运行k8s,并且将你的项目部署在本地的k8s集群上,答辩时需展示

推荐使用KubeSphere 提供的KubeKey安装KubeSphereKubernetes (使用all in one模式)

推荐阅读操作系统、容器和Kubernetes

以及我的踩坑记录和笔记KubeSphere安装记录(踩坑)使用KubeSphere部署MySQL

我觉得这部分很有可能会坐牢,请留出至少3小时以上的时间

PS:k8s会吃掉大量的内存,我认为虚拟机的性能可能不够

pprof 分析(约 7h+ ,仅包含学习和简单热点分析耗时)

在本轮作业中,你需要使用 pprof 进行程序热点分析,并在热点分析的基础上尝试对高耗时部分进行优化(整个使用 pprof、分析火焰图、进行具体的优化需要写在答辩文档上

golang pprof 实战

即使因具体的优化难度过高无法实现优化,也应该在文档中体现你的分析过程,过程远比结果重要

自动化测试报告(约 3h , 含学习及上手测试耗时)

在接口功能具体实现的基础上,这部分大约需要耗时 1 小时左右,耗时较短。

自动化测试可以帮助你,请在你的报告文档中提供利用 Apifox 实现的自动化测试报告链接。

Apifox 提供了简单的自动化测试工具,其提供的测试报告可以反应测试通过率、总耗时、接口请求耗时和平均接口请求耗时。

性能优化(约 10h+ , 和个人有关)

数据库优化

这一轮我们会重点关注你的数据库设计

要求:

  1. 合理的数据表设计(可以在文档中阐述思路和遇到的问题)
  2. 为每一个微服务使用单独的数据储存,至少不能共享一张表
  3. 你需要做到一定的数据库优化,并且将你做的优化写在文档上
    • 为每张表设计合理的索引
    • 考虑使用Sharding
    • 别的你能想到的优化,例如外键、trigger(注意触发器可能带来的性能问题)、定时任务等

调用优化

这是引入微服务设计后可能出现的问题——你的 RPC 太多了,更有可能出现循环调用的情况

请重视调用优化,这里给几个可行的解决循环调用的方案:

  1. 数据库层面进行优化,请针对计数类字段进行特别优化,例如,你可以利用定时任务来异步更新,而不需要同步更新(这里说的很简短,具体请结合接口文档及自己的项目分析)
  2. 重新对你的微服务拆分方案进行设计

但是,可能还会遇到其他的调用性能问题,不仅仅只是循环调用,请对自己的接口负责认真


性能提升可视化

在上一轮作业中,很多同学尝试很多性能优化的办法,但是有的优化可能不太合理

为了进一步理解性能优化的应用和效果,我们需要你进行一定的测试来显示出性能优化的效果(如使用Benchmark测试),并且在文档中展示出你的优化内容、优化效果以及描述接口逻辑的流程图(如有)

我们希望你的文档可以帮我们快速定位到项目中的代码位置(添加一些描述,或者给流程图添加一些提示内容)


同时,架构升级之后,也会有一些新的可优化的点出现

文档优化

请尽量做到可以直接根据文档知道你的项目亮点,不要简单的进行简短描述

在上一轮作业中,大部分人的文档都写的不是很好,我们希望你进一步优化你的文档,不限制格式、内容,但需要拥有以下内容(和上一轮一样)

  1. (Problem Restatement)问题重述:用最简短的话复述你这次需要完成的内容

  2. (問題が解決しました)问题解决:使用打勾(复选框)来示意你全部完成的内容,对于部分完成的内容,请不要打勾,而是描述你目前已经完成的内容

  3. (如有)(Spotlight)项目亮点:这部分不是必须的,如果你认为你的项目有一些巧思,请写上

  4. (如有)(Advancement)进阶:超出文档需求的完成量,比如实现了部分Bonus 内容,则在这部分描述

  5. (如有)(Argument)抱怨:你对这个文档存在的不足的抱怨,请尽量写,不要害羞,最好不要写个无

我非常建议大家在坐牢学习新知识的时候在文档里做一些笔记和记录,这有利于量化你的学习内容并且使知识更加系统,我们也可以更加了解你的学习过程~~(学不下去了就在文档里发电)~~

本次作业会综合衡量你的工作量,请酌情注意任务需求

Bonus

  1. 对项目提供监控特性(例如PrometheusSkywalking
  2. 项目支持负载均衡(Load Balance),实现轮询(Round-Robin)策略即可
  3. 项目中集成熔断降级功能,推荐使用框架 hystrix
  4. 数据库使用分库分表
  5. 尝试使用另一个很热门的rpc框架Kratos,写一份kitex 和 kratos 对比报告(对比往往要写一点Demo),报告内容包括
  • 框架的各种支持与扩展对比
  • 不同并发量下的吞吐率(每秒完成的调用数)和延迟(平均耗时)
  • 别的你的心得体会
  1. 添加一个上传视频的接口,具体实现为
  • 使用流式请求分片上传视频
  • 与用户绑定(即对于每个视频,都要求在数据库中设定上传者、上传时间等内容

参考

常见的RPC框架

公司 名称 地址
谷歌 grpc-go https://github.com/grpc/grpc-go
七牛 go-zero https://github.com/zeromicro/go-zero
Bilibili Kratos https://github.com/go-kratos/kratos
字节跳动 Kitex https://github.com/cloudwego/kitex
Apache Dubbo https://github.com/apache/dubbo-go
腾讯 Tars https://github.com/TarsCloud/TarsGo
斗鱼 jupiter https://github.com/douyu/jupiter

建议学习一些资料较为完善的RPC框架,比如grpc-go,这里不推荐go-micro,因为国内用的少且版本比较混乱。

标题 地址
Google API 设计指南 https://cloud.google.com/apis/design
如何才能更好的学习MIT 6.824? https://zhuanlan.zhihu.com/p/110168818
MIT 6.824课程中文学习资料 https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/
Sorosliu1029/6.824 https://github.com/Sorosliu1029/6.824
字节跳动自研高性能微服务框架Kitex的演进之旅 https://juejin.cn/post/7098631562232594462
RPC框架Kitex实践入门:性能测试指南 https://juejin.cn/post/7033972008257847304
高性能RPC框架CloudWeGo-Kitex内外统一的开源实践 https://juejin.cn/post/7148688078083915807
[译] Go 语言的整洁架构之道 —— 一个使用 gRPC 的 Go 项目整洁架构例子 https://juejin.cn/post/6844903687463108616
写给go开发者的gRPC教程-protobuf基础 https://juejin.cn/post/7191008929986379836
go基于grpc构建微服务框架-服务注册与发现 https://juejin.cn/post/6844903593758162958
《gor入门grpc》第一章:什么是gRPC https://segmentfault.com/a/1190000043343832
Raft算法动画演示 https://github.com/klboke/raft-animation

当然,这里面只列举了一部分内容,微服务的资料网上非常非常的多

提示

你可能需要先学习一定的云原生知识(不需要学习太深,我们现在只是做一个toy demo):云原生资料库

  • 每个厂都会有自己开源的RPC框架,选择哪个RPC框架都无所谓,主要是学习微服务的思想,本质都是一样的
  • 不过这些厂开源的RPC框架都非常的完善,以至于实现起来很简单,比如服务注册可以直接调用封装好的功能,虽然提高了开发流程,但不建议初学者这样使用,容易成为API工程师。建议使用相对原始一点的rpc框架如grpc-go来自己实现一个服务注册与发现的方法

如果你想深入学习分布式,可以参考下面这些提示,同时尝试完成所有的Bonus

  1. 学习MIT-6.824
  2. 了解分布式注册中心,如 etcd , zookeeper , euruka 等,并在代码中封装分布式系统中的服务注册、服务发现功能。有兴趣还可以了解一下Raft算法,参考hashicorp/raft
  3. 可以学习一些分布式存储方面的技术,如MySQL主从复制、读写分离、高可用配置,Redis的分布式锁(Redlock 算法)、主从模式和哨兵模式,ELK日志系统等。
  4. 可学习Kubernetes基础,并提前了解云原生方向 https://www.cncf.io/