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服务端口: 8000rpc服务端口: 9000
login用户登录接口login用户登录接口
register用户注册接口register用户注册接口
userinfo用户信息接口userinfo用户信息接口
...
mkdir -p user/api user/rpc user/model

产品服务

api服务端口: 8001rpc服务端口: 9001
create产品创建接口create产品创建接口
update产品修改接口update产品修改接口
remove产品删除接口remove产品删除接口
detail产品详情接口detail产品详情接口
...
mkdir -p product/api product/rpc product/model

订单服务

api服务端口: 8002rpc服务端口: 9002
create订单创建接口create订单创建接口
update订单修改接口update订单修改接口
remove订单删除接口remove订单删除接口
detail订单详情接口detail订单详情接口
...
mkdir -p order/api order/rpc order/model

支付服务

api服务端口: 8003rpc服务端口: 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

不知名公司IT从业者一枚

19 声望
1 粉丝
0 条评论
推荐阅读
Nginx - 上手到精通(持续更新中)
简介 {代码...} 架构由内核 和 一系列模块组成内核 {代码...} 模块 {代码...} 安装 {代码...} 守护进程 {代码...} 优化主要通过设置/etc/nginx/nginx.conf来实现顶层配置 {代码...} events配置 {代码...} http配...

BewaterMyfriends阅读 404

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.2k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.5k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

不知名公司IT从业者一枚

19 声望
1 粉丝
宣传栏