Go - 分布式微服务(持续更新中)
Go - 分布式微服务
环境搭建
wget https://go.dev/dl/go1.17.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz
go version
export GOBIN=$GOPATH/bin
export PATH=$GOBIN:$PATH
export GOROOT=/usr/local/go
export GOPROXY=https://goproxy.cn/,direct
# goctl
go install github.com/zeromicro/go-zero/tools/goctl@latest
服务拆分
一个商城项目可以拆分为
用户服务(user)、订单服务(order)、产品服务(product)、支付服务(pay)...
每个服务都可以再分为 api 服务和 rpc 服务
api 服务对外,可提供给 app 调用
rpc 服务是对内的,可提供给内部 api 服务或者其他 rpc 服务调用
创建项目
mkdir mall && cd mall && go mod init mall
mkdir service && cd service
用户服务
api服务 | 端口: 8000 | rpc服务 | 端口: 9000 |
---|---|---|---|
login | 用户登录接口 | login | 用户登录接口 |
register | 用户注册接口 | register | 用户注册接口 |
userinfo | 用户信息接口 | userinfo | 用户信息接口 |
... |
mkdir -p user/api user/rpc user/model
产品服务
api服务 | 端口: 8001 | rpc服务 | 端口: 9001 |
---|---|---|---|
create | 产品创建接口 | create | 产品创建接口 |
update | 产品修改接口 | update | 产品修改接口 |
remove | 产品删除接口 | remove | 产品删除接口 |
detail | 产品详情接口 | detail | 产品详情接口 |
... |
mkdir -p product/api product/rpc product/model
订单服务
api服务 | 端口: 8002 | rpc服务 | 端口: 9002 |
---|---|---|---|
create | 订单创建接口 | create | 订单创建接口 |
update | 订单修改接口 | update | 订单修改接口 |
remove | 订单删除接口 | remove | 订单删除接口 |
detail | 订单详情接口 | detail | 订单详情接口 |
... |
mkdir -p order/api order/rpc order/model
支付服务
api服务 | 端口: 8003 | rpc服务 | 端口: 9003 |
---|---|---|---|
create | 支付创建接口 | create | 支付创建接口 |
detail | 支付详情接口 | update | 支付详情接口 |
callback | 支付回调接口 | remove | 支付回调接口 |
... |
mkdir -p pay/api pay/rpc pay/model
$ tree mall
mall
├── common
├── go.mod
└── service
├── order
│ ├── api
│ ├── model
│ └── rpc
├── pay
│ ├── api
│ ├── model
│ └── rpc
├── product
│ ├── api
│ ├── model
│ └── rpc
└── user
├── api
├── model
└── rpc
用户服务
生成 User model
创建sql文件
vi ./user/model/user.sql
create table `user` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名', `gender` varchar(255) NOT NULL DEFAULT '' COMMENT '性别', `mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '手机号码', `password` varchar(255) NOT NULL DEFAULT '' COMMENT '登陆密码', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_mobile_unique` (`mobile`) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
运行模板生成命令
$ goctl model mysql ddl -src ./model/user.sql -dir ./model -c Done. $ tree model model ├── usermodel_gen.go ├── usermodel.go ├── user.sql └── vars.go
生成 user api 服务
创建 api 文件
vi ./user/api/user.api
type ( // 用户登录 LoginRequest { Mobile string `json:"mobile"` Password string `json:"password"` } LoginResponse { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` } // 用户登录 // 用户注册 RegisterRequest { Name string `json:"name"` Gender int64 `json:"gender"` Mobile string `json:"mobile"` Password string `json:"password"` } RegisterResponse { Id int64 `json:"id"` Name string `json:"name"` Gender int64 `json:"gender"` Mobile string `json:"mobile"` } // 用户注册 // 用户信息 UserInfoResponse { Id int64 `json:"id"` Name string `json:"name"` Gender int64 `json:"gender"` Mobile string `json:"mobile"` } // 用户信息 ) service User { @handler Login post /api/user/login(LoginRequest) returns (LoginResponse) @handler Register post /api/user/register(RegisterRequest) returns (RegisterResponse) } @server( jwt: Auth ) service User { @handler UserInfo post /api/user/userinfo returns (UserInfoResponse) }
运行模板生成命令
$ goctl api go -api ./api/user.api -dir ./api Done. $ tree api api ├── etc │ └── user.yaml ├── internal │ ├── config │ │ └── config.go │ ├── handler │ │ ├── loginhandler.go │ │ ├── registerhandler.go │ │ ├── routes.go │ │ └── userinfohandler.go │ ├── logic │ │ ├── loginlogic.go │ │ ├── registerlogic.go │ │ └── userinfologic.go │ ├── svc │ │ └── servicecontext.go │ └── types │ └── types.go ├── user.api └── user.go 7 directories, 13 files
产品服务
订单服务
支付服务
Auth 验证
服务监控
链路追踪
分布式事务
参考
https://github.com/zeromicro/go-zero/blob/master/readme-cn.md
https://learnku.com/articles/64566
推荐阅读
Nginx - 上手到精通(持续更新中)
简介 {代码...} 架构由内核 和 一系列模块组成内核 {代码...} 模块 {代码...} 安装 {代码...} 守护进程 {代码...} 优化主要通过设置/etc/nginx/nginx.conf来实现顶层配置 {代码...} events配置 {代码...} http配...
BewaterMyfriends阅读 404
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。
robin赞 23阅读 3.2k评论 6
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。
机器铃砍菜刀赞 24阅读 58k评论 2
年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。
去去1002赞 16阅读 11.5k评论 2
年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...
去去1002赞 15阅读 11.9k评论 4
万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...
JavaGuide赞 8阅读 1.7k
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...
白鲸鱼赞 9阅读 5.3k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。