带你十天轻松搞定 Go 微服务系列(二)
Go语言精选
共 2515字,需浏览 6分钟
· 2022-02-21
上篇文章开始,我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下:
环境搭建 服务拆分(本文) 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 服务监控 链路追踪 分布式事务
期望通过本系列带你在本机利用 Docker 环境利用 go-zero 快速开发一个商城系统,让你快速上手微服务。
完整示例代码:https://github.com/nivin-studio/go-zero-mall
服务拆分
一个商城项目可拆分用户服务(user)、订单服务(order)、产品服务(product)、支付服务(pay)、售后服务(afterSale)...
每个服务都可以再分为 api
服务和 rpc
服务。api
服务对外,可提供给 app
调用。rpc
服务是对内的,可提供给内部 api
服务或者其他 rpc
服务调用。整个项目服务依赖流程图大致如下:
1 用户服务(user)
api 服务 | 端口:8000 | rpc 服务 | 端口:9000 |
---|---|---|---|
login | 用户登录接口 | login | 用户登录接口 |
register | 用户注册接口 | register | 用户注册接口 |
userinfo | 用户信息接口 | userinfo | 用户信息接口 |
... | ... | ... | ... |
2 产品服务(product)
api 服务 | 端口:8001 | rpc 服务 | 端口:9001 |
---|---|---|---|
create | 产品创建接口 | create | 产品创建接口 |
update | 产品修改接口 | update | 产品修改接口 |
remove | 产品删除接口 | remove | 产品删除接口 |
detail | 产品详情接口 | detail | 产品详情接口 |
... | ... | ... | ... |
3 订单服务(order)
api 服务 | 端口:8002 | rpc 服务 | 端口:9002 |
---|---|---|---|
create | 订单创建接口 | create | 订单创建接口 |
update | 订单修改接口 | update | 订单修改接口 |
remove | 订单删除接口 | remove | 订单删除接口 |
detail | 订单详情接口 | detail | 订单详情接口 |
list | 订单列表接口 | list | 订单列表接口 |
paid | 订单支付接口 | ||
... | ... | ... | ... |
4 支付服务(pay)
api 服务 | 端口:8003 | rpc 服务 | 端口:9003 |
---|---|---|---|
create | 支付创建接口 | create | 支付创建接口 |
detail | 支付详情接口 | detail | 支付详情接口 |
callback | 支付回调接口 | callback | 支付回调接口 |
... | ... | ... | ... |
5 创建项目目录
创建 mall
工程
$ mkdir mall && cd mall
$ go mod init mall
创建 common
目录
$ mkdir common
创建 service
目录
$ mkdir service && cd service
创建 user api
,user rpc
,user model
目录
$ mkdir -p user/api
$ mkdir -p user/rpc
$ mkdir -p user/model
创建 product api
,product rpc
,product model
目录
$ mkdir -p product/api
$ mkdir -p product/rpc
$ mkdir -p product/model
创建 order api
,order rpc
,order model
目录
$ mkdir -p order/api
$ mkdir -p order/rpc
$ mkdir -p order/model
创建 pay api
,pay rpc
,pay model
目录
$ mkdir -p pay/api
$ mkdir -p pay/rpc
$ mkdir -p pay/model
最终项目目录
├── common # 通用库
├── service # 服务
│ ├── order
│ │ ├── api # order api 服务
│ │ ├── model # order 数据模型
│ │ └── rpc # order rpc 服务
│ ├── pay
│ │ ├── api # pay api 服务
│ │ ├── model # pay 数据模型
│ │ └── rpc # pay rpc 服务
│ ├── product
│ │ ├── api # product api 服务
│ │ ├── model # product 数据模型
│ │ └── rpc # product rpc 服务
│ └── user
│ ├── api # user api 服务
│ ├── model # user 数据模型
│ └── rpc # user rpc 服务
└── go.mod
一些思考
微服务拆分并没有统一的标准,相同的业务在不同的公司很可能拆分方式会有所区别,用户规模、团队大小、组员能力等都会是考虑因素。但我们还是有一些基本原则可以遵循:
由粗到细,避免过度拆分,遵循渐进式演进的原则 不同服务之间应该是正交的,不要你中有我我中有你 避免环形依赖,服务依赖关系应该是有向无环图 避免不同服务之间共享同一个数据库
go-zero 也是一个渐进式微服务框架,你可以在业务早期使用单体来快速满足业务,当业务增长并有需要的时候,做最小的改动即可做到渐进式的服务拆分。
推荐阅读
评论
偷偷告诉你如何一台电脑开多个微信!
大家好,我是轩辕。前几天在粉丝群里,有人问我是怎么在一台电脑上同时登录两个微信的?正好之前写过一篇文章,分析过原理,分享给没看过的小伙伴学习一下。手机端多开微信估计很多人都知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢?其实很简单,你只需要写一个批
编程技术宇宙
0
Go Heap Profile 怎么了?
Go heap profile 是常常用来检查内存泄露和内存占用大问题的问题的手段,而且非常常用。而且,我们也经常创建两个间隔较长的 heap profile, 获取它们的差值来方便查看内存泄露: Hi, 使用多年的 go pprof 检查内存泄漏的方法居然是错的?! [1]今天,度厂的一位同学提出
GoCN
0
轻松掌握开源项目的二次开发技巧
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群本文作者:@方长_beezen 原文链接:https://juejin.cn/post/7358647992608489535前言随着软件行业的迅速
程序员成长指北
0
Go 1.22 的新增功能系列之二:reflect.TypeFor
Go 1.22 的第一个候选版本已经发布,这意味着最终版本即将发布,现在是我在博客中介绍我在这个周期中所做工作的时候了。像往常一样,我的贡献很小,但它们是我的,所以我将从幕后的角度来谈谈它们。首先是reflect.TypeFor。这是整个函数:// TypeFor returns the [Type
GoCN
0
springboot第70集:字节跳动后端三面经,一文让你走出微服务迷雾架构周刊
创建一个使用Kubernetes (K8s) 和 Jenkins 来自动化 GitLab 前端项目打包的CI/CD流水线,需要配置多个组件。下面,我将概述一个基本的设置步骤和示例脚本,以帮助你理解如何使用这些工具整合一个自动化流程。前提条件确保你已经有:Kubernetes 集群:用于部署 Jenk
程序源代码
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
Go早期是如何在Google内部发展起来的
2007年Go诞生于Google,2009年Google正式对外宣布了Go语言的开源!时至今日,距离Go开源已经过去了近15个年头了[1]!Go在Google公司内部究竟是怎样的一个状态呢?前Google员工Yves Junqueira近期撰文从其个人所见所闻谈了Go在Google的历程[2]!这里
GoCN
0
Go 1.22 的新增功能系列之一:cmp.Or
截至撰写本文时,Go 1.22 已经发布几个月了。早就该结束我为 1.22 所做的工作的系列了。抱歉耽搁了这么久,我最近忙于生活事务。如果您错过了我关于reflect.TypeFor(https://blog.carlana.net/post/2024/golang-reflect-type-for
GoCN
1