go-zero 微服务实战系列(一、开篇)
前言
在社区中经常看到有人问有没有基于 go-zero 的比较完整的项目参考,该类问题本质上是想知道基于 go-zero 的项目的最佳实践。完整的项目应该是一个完整的产品功能,包含产品需求、架构设计、关键流程的编码、表设计以及各种性能优化和数据一致性等,是一个真正贴近生产级的项目,是可以直接拿来在自己的生产项目中进行参考的,而目前社区并没有类似的比较完整的开源项目参考,因此决定和大家一起从零开始基于 go-zero 构建一个完整的贴近生产的项目。
该系列的主题是基于 go-zero 构建一个高并发的系统,为神马要选择这个主题呢?我猜大家一定感受到了 CRUD 的枯燥,而是希望项目是高并发的是带有一定挑战的,可能我们工作中的项目请求量比较低,主要以实现功能为主。但是,现代的互联网产品随时都有面对突发大流量的可能,比如我们的商城平时可能业务流量比较平稳,但某一天运营突然说要做一次秒杀活动来推广,如果没有提前做好应对高并发的准备,我们的服务很可能是扛不住的,结果也就可想而知。所以我们平时就需要提前储备足够多的高并发的知识,当遇到高并发需求的场景的时候就能够从容应对。
该系列为实战系列,过于基础的知识可能会比较少涉及,所以需要大家具备以下基础能力:
- 了解go语言语法和基本使用姿势,请参考文档
- 本系列项目数据库使用Mysql,请参考文档
- 本系列项目缓存使用Redis,请参考文档
- 本系列项目消息队列使用Kafka,请参考文档
- 了解go-zero基本使用,请参考文档
为什么选择go-zero?
go-zero 为我们提供了许多高并发场景下的实用工具,比如为了降低接口耗时我们往往需要并发的请求依赖的服务,这个时候我们可以使用 mapreduce 并行的处理请求;面对海量请求为了降低Redis压力和提高响应时间,我们可以使用 collection 构建本地缓存;避免用户连续请求造成服务压力可以使用 limit 做用户级别的限流等等。好的框架能够给我的项目开发带来事半功倍的效果,Go-zero的简洁易用性与内置的开箱即用的工具和服务治理能力助力我们构建一个高并发高可靠的系统。
产品需求
为了更加贴近我们真实的项目开发,项目会基于真实的产品需求进行构建。商城是我们平时接触比较多而又比较复杂的系统,所以我们决定通过构建商城系统来和大家一起学习如何基于 go-zero 构建高并发系统。商城的功能点非常多,我们没有办法把所有的功能点都一一演示,但会实现一个 mvp版本,我们会在mvp版本中把 go-zero 的核心功能和构建高并发商城系统的核心点都演示出来。
如下思维导图列出了该电商系统主要实现的功能:

产品原型图
原型图是我们实现功能的主要参考,下面列出了商城系统主要的页面UI,通过这些UI在心中可以大致构建出系统的架构,构建不出来也木有问题,跟随文章一点点前进即可,奥利给!!!
首页和分类原型图
可以看到首页功能比较复杂,包含了搜索功能、Banner轮播图、抢购入口、排行榜、推荐等,分类中包含了不同分类的推荐商品


购物车和我的订单原型图
购物车展示了当前登录用户的购物车商品列表,除了商品基本信息还包括了商品数量。我的订单列表中展示了处于不同状态的商品列表


商品详情和商品评价原型
商品详情展示了商品的详情信息,同时在该页面可以添加购物车以及立即购买等,用户还可以点击收藏对该商品进行收藏,商品的评价功能是必不可少的,你是不是在购买某件商品的时候也会先看看该商品的用户评价呢?


以上贴出了商城项目主要实现的功能点和主要页面的原型图,我们的项目也会围绕这些主要的功能点展开。比较核心的功能点,比如请求量非常高的首页Banner我们如何优化,抢购商品如何保证不超卖,交易过程中分布式事务的实现等我们都会重点介绍。
系列文章目录
第一篇即为本篇文章,主要对项目做一个概览。
第二篇文章会介绍我们的微服务的划分以及工程目录结构的定义和使用 goctl 做一些项目代码的初始化工作。
第三篇文章会先定义项目的 API,只有定义好 API 协议之后才能真正的开始写代码,如何协议定义的不清楚会大大增加项目返工的几率,定义好API后紧接着我们需要进行表结构设计,数据库我们使用 MySQL。
第四篇文章主要是和大家一起熟悉下 go-zero 的基本使用,主要包括数据库的增删改查,缓存的操作,自定义中间件,常用工具包比如 mapreduce 的使用等等。
第五六七篇我们着重介绍缓存的使用姿势,在高并发系统中缓存的地位不言而喻,不夸张的说如何缓存设计的不好,那高并发系统也就不复存在。我们会介绍如何利用缓存优化请求量巨大的首页Banner,商品列表缓存实现,以及常见的Cache Aside模式代码该怎么写,还有缓存的一致性、击穿、穿透、雪崩等优化等等。
第八篇和第九篇会介绍如何实现一个简单的秒杀功能,秒杀功能可谓是高并发读和高并发写的典型代表,通过这两篇可以了解到秒杀功能的优化技巧和基本姿势。
第十篇介绍在微服务架构下经常遇到的分布式事务的问题,经过微服务拆分后,微服务间独占数据库,没法利用本地事务,通过该篇文章可以了解到在 go-zero 中的分布式事务的实现方式。
第十一篇介绍我们的业务代码如何写单元测试。
第十二篇服务的可观测性,上线后的服务需要具有可观测性,包括日志、指标监控、链路追踪等。
第十三篇我们会把服务部署上线并进行功能测试。

结束语
本篇文章首先介绍了该系列由来的背景以及我们为什么会选择构建高并发系统这个主题,接着介绍了我们需要构建的高并发的商城系统的主要功能点以及主要的页面原型图,最后列出了本系列的文章标题列表,通过标题列表可以快速了解整个系列的知识体系。
构建一个高并发的系统并不是一件容易的事情,涉及的知识点非常多,但我相信只要我们一起努力就一定能克服这些困难,让自己的技术能力更上一层楼。好在我们可以站在巨人的肩膀上,go-zero 为我们提供了非常强大的构建高并发服务的能力,为我们的系统保驾护航。
希望本篇文章对你有所帮助,谢谢。
每周一、周四更新
参考
https://github.com/zhoushuguang/lebron
项目地址
https://github.com/zeromicro/go-zero
欢迎使用 go-zero 并 star 支持我们!
微信交流群
关注『微服务实践』公众号并点击 交流群 获取社区群二维码。
go-zero 微服务实战系列(一、开篇)的更多相关文章
- go-zero微服务实战系列(三、API定义和表结构设计)
前两篇文章分别介绍了本系列文章的背景以及根据业务职能对商城系统做了服务的拆分,其中每个服务又可分为如下三类: api服务 - BFF层,对外提供HTTP接口 rpc服务 - 内部依赖的微服务,实现单一 ...
- go-zero微服务实战系列(十一、大结局)
本篇是整个系列的最后一篇了,本来打算在系列的最后一两篇写一下关于k8s部署相关的内容,在构思的过程中觉得自己对k8s知识的掌握还很不足,在自己没有理解掌握的前提下我觉得也很难写出自己满意的文章,大家看 ...
- ASP.NET Core微服务实战系列
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...
- 微服务实战系列--Nginx官网发布(转)
这是Nginx官网写的一个系列,共七篇文章,如下 Introduction to Microservices (this article) Building Microservices: Using ...
- Chris Richardson微服务实战系列
微服务实战(一):微服务架构的优势与不足 微服务实战(二):使用API Gateway 微服务实战(三):深入微服务架构的进程间通信 微服务实战(四):服务发现的可行方案以及实践案例 微服务实践(五) ...
- Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇(内附开发 demo)
简介 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. 系列 云原生 API 网关,gRPC-Gateway V2 初探 业务流程 官方开发接入文档 ...
- 微服务实战系列(二)-注册中心Springcloud Eureka客户端
1. 场景描述 前几天介绍了下springcloud的Eureka注册中心(springcloud-注册中心快速构建),今天结合springboot-web介绍下eureka客户端服务注册. 2. 解 ...
- 微服务实战系列(四)-注册中心springcloud alibaba nacos
1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...
- 微服务实战系列(五)-注册中心Eureka与nacos区别
1. 场景描述 nacos最近用的比较多,介绍下nacos及部署吧,刚看了下以前写过类似的,不过没写如何部署及与eureka区别,只展示了效果,补补吧. 2.解决方案 2.1 nacos与eureka ...
随机推荐
- Java中的反射以及简单运用(原理+例子)
Java反射 学习内容 1. 为什么要使用反射 2. 反射的概念 3. Java反射加载过程 4. 字节码对象理解 5. 获取字节码对象(.class)的三种方式 6. 反射常用API 8. 反射综合 ...
- python函数基础算法简介
一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...
- Zalando Postgres Operator 快速上手
本指南旨在让您快速了解在本地 Kubernetes 环境中使用 Postgres Operator. 前提条件 由于 Postgres Operator 是为 Kubernetes (K8s) 框架设 ...
- 1.5 万字 + 40 张图解 HTTP 常见面试题
作者:小林coding 图解计算机基础网站:https://xiaolincoding.com 大家好,我是小林,我最开始写的第一篇图解文章就是这篇: 那时候我也就不到 100 读者,如今这篇阅读都快 ...
- Go单体服务开发最佳实践
单体最佳实践的由来 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也非常低,我们应该使用更简单的技术架构来加速业务价值的交付,此时单体的优势就体现出来 ...
- Djang内置分页和自定义分页
内置分页 views from django.core.paginator import Paginator,Page,PageNotAnInteger def DJs_pages(request): ...
- Linux内核浅入浅出
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 01 前言 拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是Linux内核是什么,它用于什么?且听 ...
- 用 Python 为接口测试自动生成用例
用Python为接口自动生成测试用例 基于属性的测试会产生大量的.随机的参数,特别适合为单元测试和接口测试生成测试用例 尽管早在2006年haskell语言就有了QuickCheck来进行" ...
- Python技法:实用运维脚本编写(进程/文件/目录操作)
Python在很大程度上可以对shell脚本进行替代.笔者一般单行命令用shell,复杂点的多行操作就直接用Python了.这篇文章就归纳一下Python的一些实用脚本操作. 1. 执行外部程序或命令 ...
- 记一次百万行WPF项目代码的重构记录
此前带领小组成员主导过一个百万行代码上位机项目的重构工作,分析项目中存在的问题做了些针对性的优化,整个重构工作持续了一年半之久. 主要针对以下问题: 1.产品型号太多导致代码工程的分支太多,维护时会产 ...