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

BewaterMyfriends
19 声望1 粉丝

IT从业者 数字游民 创业者


« 上一篇
Go - RPC
下一篇 »
Go - 操作redis