go-zero入门

本文简单介绍了go-zero,以及go-zero相关的安装配置。通过go-zero的hello world级别的一个的单体应用和一个包含两个服务的微服务应用,以实践的方式展示了go-zero项目的入门级搭建。

1. 简介

https://go-zero.dev/
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
go-zero 包含极简的 API定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go,ios,Android,Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

goctl -h
A cli tool to generate api, gRPC, model code

GitHub: https://github.com/zeromicro/go-zero
Site:   https://go-zero.dev

Usage:
  goctl [command]

Available Commands:
  api               Generate api related files
  bug               Report a bug
  completion        Generate the autocompletion script for the specified shell
  docker            Generate Dockerfile
  env               Check or edit goctl environment
  help              Help about any command
  kube              Generate kubernetes files
  migrate           Migrate from tal-tech to zeromicro
  model             Generate model code
  quickstart        quickly start a project
  rpc               Generate rpc code
  template          Template operation
  upgrade           Upgrade goctl to latest version

Flags:
  -h, --help      help for goctl
  -v, --version   version for goctl


Use "goctl [command] --help" for more information about a command.

架构图如下:
image.png

2. 快速开发单体应用

在上一节安装gRPC相关包的基础上

  1. 新建项目go_zero_demo
  2. go基础配置
go env -w GO111MODULE=on

go env -w GOPROXY=https://goproxy.cn,direct

检查配置

$ go env GO111MODULE
on
$ go env GOPROXY
https://goproxy.cn,direct
  1. 在项目目录通过下面命令安装
go get -u github.com/zeromicro/go-zero@latest
  1. 安装goctl、确保goctl可执行
go install github.com/zeromicro/go-zero/tools/goctl@latest
  1. 快速生成api服务
goctl api new hello

cd hello

go mod tidy

go run hello.go -f .\etc\hello-api.yaml

测试访问:http://localhost:8888/from/you
修改 /logic/hellologic.go

package logic

import (
	"context"

	"go_zero_demo/hello/internal/svc"
	"go_zero_demo/hello/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type HelloLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewHelloLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HelloLogic {
	return &HelloLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *HelloLogic) Hello(req *types.Request) (resp *types.Response, err error) {
	// todo: add your logic here and delete this line

	return &types.Response{
		Message: "hello, go-zero",
	}, nil
}

image.png

3. 微服务应用搭建

假设我们在开发一个商城项目,而开发者小明负责用户模块(user)和订单模块(order)的开发,我们姑且将这两个模块拆分成两个微服务
演示功能目标

  • 订单服务(order)提供一个查询接口
  • 用户服务(user)提供一个方法供订单服务获取用户信息

根据情景提要我们可以得知,订单是直接面向用户,通过http协议访问数据,而订单内部需要获取用户的一些基础数据,既然我们的服务是采用微服务的架构设计,那么两个服务(user,order)就必须要进行数据交换,服务间的数据交换即服务间的通讯,到了这里,采用合理的通讯协议也是一个开发人员需要考虑的事情,可以通过http,rpc等方式来进行通讯,这里我们选择rpc来实现服务间的通讯,相信这里我已经对"rpc服务存在有什么作用?"已经作了一个比较好的场景描述。当然,一个服务开发前远不止这点设计分析,我们这里就不详细描述了。从上文得知,我们
需要一个

  • user rpc
  • order api

两个服务来初步实现这个小demo。

3.1 用户服务 user rpc
  1. 创建相应文件目录,创建proto文件并写入代码:

image.png

syntax = "proto3";

package template;

option go_package = "./user";

message IdRequest {
  string id = 1;
}

message UserResponse {
  string id = 1;

  string name = 2;

  string gender = 3;
}

service User {
  rpc getUser(IdRequest) returns(UserResponse);
}
  1. 执行命令生成代码
cd mall\user\rpc

goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.

image.png

  1. 完善rpc服务端业务逻辑

这里提供给订单服务调用时返回用户id为1,名字是acezsq
image.png

3.2 订单服务order api
  1. 回到go_zero_demo/mall目录
  2. 创建order api服务目录
mkdir -p order/api

cd order/api
  1. 添加api文件order.api
type(
    OrderReq {
        Id string `path:"id"`
    }

    OrderReply {
        Id string `json:"id"`
        Name string `json:"name"`
    }
)

service order {
    @handler getOrder
    get /api/order/get/:id (OrderReq) returns (OrderReply)
}  
  1. 返回go_zero_demo\mall\order\api目录执行命令生成api服务代码
goctl api go -api order.api -dir .

image.png

  1. 配置etcd的服务发现

修改config文件
image.png
修改order.yaml文件,用于服务发现
image.png

  1. 将user用户服务的service添加到order订单服务image.png
  2. 完善业务逻辑

oder服务通过rpc获取user用户信息,然后进行处理
image.png

3.3 启动项目
  1. 启动etcd
  2. 启动用户服务

进入user目录的user.go

go mod tidy
go run user.go -f etc/user.yaml

image.png

  1. 启动订单服务

进入订单目录的order.go

go run order.go -f etc/order.yaml

image.png
在浏览器中访问订单服务
image.png
image.png
完整的项目代码链接:https://github.com/acezsq/go_zero_demo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值