基于gozero实现奶茶门店系统的设计与实践

624 阅读3分钟

GoZero 是一个 Go 语言实现的高性能微服务框架,它提供了各种功能,如路由、RPC、Web 服务、消息队列等,适用于构建高并发、低延迟的分布式应用。以下是一个基于 GoZero 框架来实现“霸王茶姬”门店系统的设计思路与代码示例。

image.png

设计思路

“霸王茶姬”是一个茶饮门店品牌,我们可以通过 GoZero 来构建一个门店管理系统,主要实现以下功能:

  1. 门店管理:门店的新增、删除、修改、查询功能。
  2. 订单管理:用户可以通过系统进行下单、支付,门店可以查询订单并进行配送。
  3. 商品管理:门店管理商品的库存、价格、折扣等信息。
  4. 用户管理:用户的注册、登录、信息更新等。
  5. 数据统计:统计门店的销售数据、订单情况等。

系统模块

  • 用户模块:用户注册、登录、查看订单等。
  • 门店模块:门店的增、删、改、查操作。
  • 订单模块:用户下单、支付、查询订单等。
  • 商品模块:管理商品信息,库存等。
  • 统计模块:根据门店的销售情况、订单数据生成报表。

技术栈

  • GoZero:作为核心框架,处理 HTTP 和 RPC 请求。
  • MySQL:存储数据,使用 GoZero 自带的 ORM。
  • Redis:用于缓存,提升查询效率。
  • Nacos/Zookeeper:做服务注册与发现。

基本目录结构

/tea-store
|-- api
|   |-- user.api       // 用户模块
|   |-- store.api      // 门店模块
|   |-- order.api      // 订单模块
|-- service
|   |-- user
|   |-- store
|   |-- order
|-- handler
|   |-- user_handler.go
|   |-- store_handler.go
|   |-- order_handler.go
|-- model
|   |-- user.go
|   |-- store.go
|   |-- order.go
|-- config
|   |-- config.yaml    // 配置文件
|-- main.go            // 启动文件

1. 定义用户模块

首先在 api/user.api 中定义接口规范:

syntax = "proto3";

package user;

service UserService {
    // 用户注册
    rpc Register (RegisterRequest) returns (RegisterResponse);
    // 用户登录
    rpc Login (LoginRequest) returns (LoginResponse);
    // 查看订单
    rpc GetOrders (GetOrdersRequest) returns (GetOrdersResponse);
}

message RegisterRequest {
    string username = 1;
    string password = 2;
}

message RegisterResponse {
    bool success = 1;
}

message LoginRequest {
    string username = 1;
    string password = 2;
}

message LoginResponse {
    string token = 1;
}

message GetOrdersRequest {
    string user_id = 1;
}

message GetOrdersResponse {
    repeated string orders = 1;
}

然后在 handler/user_handler.go 中编写实现:

package handler

import (
	"context"
	"github.com/zeromicro/go-zero/core/logx"
	"user/rpc/user"
)

type UserHandler struct {
	logx.Logger
}

func (h *UserHandler) Register(ctx context.Context, req *user.RegisterRequest) (*user.RegisterResponse, error) {
	// 实现用户注册逻辑
	return &user.RegisterResponse{Success: true}, nil
}

func (h *UserHandler) Login(ctx context.Context, req *user.LoginRequest) (*user.LoginResponse, error) {
	// 实现用户登录逻辑
	return &user.LoginResponse{Token: "mockToken123"}, nil
}

func (h *UserHandler) GetOrders(ctx context.Context, req *user.GetOrdersRequest) (*user.GetOrdersResponse, error) {
	// 实现查询用户订单逻辑
	orders := []string{"order1", "order2", "order3"}
	return &user.GetOrdersResponse{Orders: orders}, nil
}

2. 门店模块

api/store.api 中定义门店相关接口:

syntax = "proto3";

package store;

service StoreService {
    // 创建门店
    rpc CreateStore (CreateStoreRequest) returns (CreateStoreResponse);
    // 获取门店信息
    rpc GetStoreInfo (GetStoreInfoRequest) returns (GetStoreInfoResponse);
}

message CreateStoreRequest {
    string name = 1;
    string location = 2;
}

message CreateStoreResponse {
    bool success = 1;
}

message GetStoreInfoRequest {
    string store_id = 1;
}

message GetStoreInfoResponse {
    string name = 1;
    string location = 2;
}

handler/store_handler.go 中编写实现:

package handler

import (
	"context"
	"github.com/zeromicro/go-zero/core/logx"
	"store/rpc/store"
)

type StoreHandler struct {
	logx.Logger
}

func (h *StoreHandler) CreateStore(ctx context.Context, req *store.CreateStoreRequest) (*store.CreateStoreResponse, error) {
	// 实现创建门店逻辑
	return &store.CreateStoreResponse{Success: true}, nil
}

func (h *StoreHandler) GetStoreInfo(ctx context.Context, req *store.GetStoreInfoRequest) (*store.GetStoreInfoResponse, error) {
	// 获取门店信息
	return &store.GetStoreInfoResponse{Name: "霸王茶姬", Location: "上海"}, nil
}

3. 订单模块

api/order.api 中定义订单接口:

syntax = "proto3";

package order;

service OrderService {
    // 创建订单
    rpc CreateOrder (CreateOrderRequest) returns (CreateOrderResponse);
    // 获取订单信息
    rpc GetOrderInfo (GetOrderInfoRequest) returns (GetOrderInfoResponse);
}

message CreateOrderRequest {
    string user_id = 1;
    string store_id = 2;
    repeated string items = 3;
}

message CreateOrderResponse {
    string order_id = 1;
}

message GetOrderInfoRequest {
    string order_id = 1;
}

message GetOrderInfoResponse {
    string status = 1;
    repeated string items = 2;
}

handler/order_handler.go 中编写实现:

package handler

import (
	"context"
	"github.com/zeromicro/go-zero/core/logx"
	"order/rpc/order"
)

type OrderHandler struct {
	logx.Logger
}

func (h *OrderHandler) CreateOrder(ctx context.Context, req *order.CreateOrderRequest) (*order.CreateOrderResponse, error) {
	// 创建订单逻辑
	return &order.CreateOrderResponse{OrderId: "order123"}, nil
}

func (h *OrderHandler) GetOrderInfo(ctx context.Context, req *order.GetOrderInfoRequest) (*order.GetOrderInfoResponse, error) {
	// 获取订单信息
	return &order.GetOrderInfoResponse{Status: "Completed", Items: []string{"item1", "item2"}}, nil
}

4. 启动文件 main.go

main.go 中启动 GoZero 服务:

package main

import (
	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/zrpc"
	"log"
	"user/rpc/user"
	"store/rpc/store"
	"order/rpc/order"
)

func main() {
	var c conf.Config
	err := conf.Load("config.yaml", &c)
	if err != nil {
		log.Fatal(err)
	}

	userService := user.NewUserService(zrpc.MustNewClient(c.RpcClientConf))
	storeService := store.NewStoreService(zrpc.MustNewClient(c.RpcClientConf))
	orderService := order.NewOrderService(zrpc.MustNewClient(c.RpcClientConf))

	go userService.Start()
	go storeService.Start()
	go orderService.Start()

	select {} // 阻塞主线程
}

结语

通过以上设计,可以实现一个简单的基于 GoZero 框架的“霸王茶姬”门店系统,涵盖了用户、门店、订单等基本功能模块。这个系统也可以进一步扩展,加入更多复杂的功能,如支付集成、实时库存管理、门店动态调度等。