go-zero 开发入门-加法客服端示例

2023-12-16

定义 RPC 接口文件

接口文件 add.proto 的内容如下:

syntax = "proto3";
package add;

// 当 protoc-gen-go 版本大于 1.4.0 时需加上 go_package,否则编译报错“unable to determine Go import path for”
option go_package = "./add";

message AddReq {
    int32 a = 1;
    int32 b = 2;
}

message AddResp {
    int32 sum = 1;
}

service Adder {
    rpc add(AddReq) returns(AddResp);
}

接口文件 add.proto 可放在项目的根目录下。

编译 RPC 接口文件

在 add.proto 文件所在目录下,使用 go-zero 的脚手架工具 goctl 编译 add.proto 文件:

# goctl rpc protoc add.proto --go_out=./protoc --go-grpc_out=./protoc --zrpc_out=.
Done.

编译成功后的目录结构:

.
├── adder
│   └── adder.go # 客户端直接可使用的 SDK 代码
├── add.go # 服务端 main 函数所在文件
├── add.proto # RPC 接口文件
├── etc
│   └── add.yaml # 配置文件
├── go.mod
├── internal
│   ├── config # 存放配置对应的数据结构
│   │   └── config.go
│   ├── logic # 业务逻辑代码放在这个目录下
│   │   └── addlogic.go
│   ├── server # RPC 服务端代码
│   │   └── adderserver.go
│   └── svc # 上下文代码
│       └── servicecontext.go
└── protoc
    └── add
        ├── add_grpc.pb.go # protoc 生成的 gRPC 代码
        └── add.pb.go # protoc 生成的 proto 代码

目录下原只有文件 add.proto,编译成功后产生了多个新的文件和目录。在进一步之前,还需执行“go mod tidy”整理依赖。

RPC 服务端开发

  • 编辑文件 addlogic.go:
package logic

import (
    "context"
    "fmt" // 新增的

    "add/internal/svc" // add 为 go.mod 中的 module 名,internal 为 go.mod 所在目录下的子目录,svc 为 internal 的子目录
    "add/protoc/add"

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

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

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

func (l *AddLogic) Add(in *add.AddReq) (*add.AddResp, error) {
    // todo: add your logic here and delete this line
    var s add.AddResp // 新增的
    s.Sum = in.A + in.B // 新增的
    fmt.Printf("%d + %d = %d\n", in.A, in.B, s.Sum) // 新增的
    //return &add.AddResp{}, nil // 删除的
    return &s, nil // 新增的
}
  • 编译生成可执行程序文件:
go build -o add_server add.go
  • 启动服务端:
# ./add_server 
Starting rpc server at 0.0.0.0:8080...
  • 使用 grpcurl 测试:
grpcurl -plaintext -d '{"a": 1, "b": 2}' 127.0.0.1:8080 add.Adder/add

使用 grpcurl 的前提是开启 reflection 反射,否则执行报如下错误:

Failed to list services: server does not support the reflection API

对于 goctl 生成的,只需要在 etc 下的 yaml 配置文件增加:

Mode: dev

或者:

Mode: test

开启 reflection 的代码在根目录的 add.go 文件中:

if c.Mode == service.DevMode || c.Mode == service.TestMode {
    reflection.Register(grpcServer)
}

RPC 客户端开发

  • 编辑客户端文件 add_client.go:

客户端通过调用 adder/adder.go 中的函数 Add 来访问服务端,客户端代码文件 add_client.go 内容如下:

package main

import (
    "context"
    "fmt"

    "add/adder"
    "add/protoc/add"

    "github.com/zeromicro/go-zero/core/conf"
    "github.com/zeromicro/go-zero/zrpc"
)

func main() {
    var clientConf zrpc.RpcClientConf
    conf.MustLoad("etc/client.yaml", &clientConf)

    client := zrpc.MustNewClient(clientConf)
    adder := adder.NewAdder(client)

    addReq := &add.AddReq{ A:1, B:2 }
    addResp, err := adder.Add(context.Background(), addReq)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(addReq)
    fmt.Println(addResp)
    fmt.Println("sum=", addResp.Sum)
}

文件 add_client.go 也放在根目录下,和 add.go 同目录。

  • 编译生成可执行程序文件:
go build -o add_client add_client.go
  • 执行客户端:
# ./add_client
{"@timestamp":"2023-12-07T11:38:39.231+08:00","caller":"p2c/p2c.go:181","content":"p2c - conn: 127.0.0.1:8080, load: 1029, reqs: 1","level":"stat"}
sum:3

  • goctl 的安装参见:

(https://blog.csdn.net/Aquester/article/details/134843086)[https://blog.csdn.net/Aquester/article/details/134843086]

  • etcd 的安装参见:

(https://blog.csdn.net/Aquester/article/details/134843461)[https://blog.csdn.net/Aquester/article/details/134843461]

  • grpcurl 下载:

(https://github.com/fullstorydev/grpcurl/releases)[https://github.com/fullstorydev/grpcurl/releases]

下载 x86_64 版本的 Linux 二进制包:

(https://github.com/fullstorydev/grpcurl/releases/download/v1.8.9/grpcurl_1.8.9_linux_x86_64.tar.gz)[https://github.com/fullstorydev/grpcurl/releases/download/v1.8.9/grpcurl_1.8.9_linux_x86_64.tar.gz]

grpcurl 是一个命令行工具,允许与 gRPC 服务器交互,基本上是对 gRPC 服务器的 curl 。grpcurl 的参数“-plaintext”表示不使用 TLS/SSL 进行加密通信,参数“-d”用于指定请求消息的 JSON 格式。

grpcurl 的 list 和 describe 可列出 gRPC 服务端反射的 protobuf:

grpcurl --plaintext 127.0.0.1:8080 list

grpcurl 服务调用格式:

grpcurl -plaintext grpc.server.com:80 my.custom.server.Service/Method

如果为 TLS:

# grpcurl grpc.server.com:443 my.custom.server.Service/Method

带请求参数调用格式:

# grpcurl -d '{"id": 1234, "tags": ["foo","bar"]}' grpc.server.com:443 my.custom.server.Service/Method
  • grpcui 安装:
# go install github.com/fullstorydev/grpcui/cmd/grpcui@latest

gRPCui 是 gRPC 的交互式 Web UI,基于 grpcurl,并提供一个 GUI 来发现和测试 gRPC 服务,类似于 Postman 或 Swagger UI 等 HTTP 工具,但是用于 gRPC API 而不是 REST。

  • 升级 goctl:

升级:

goctl env check -i -f

升级检查:

goctl env
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go-zero 开发入门-加法客服端示例 的相关文章

随机推荐

  • Windows的最大威胁是尽然是“套皮安卓”的鸿蒙系统

    前言 自从鸿蒙问世以来 套皮安卓的言论就没有断过 但是那些现在还在说鸿蒙是套皮安卓的人 你知不知道微软已经组建了专门的 战略团队 来对付鸿蒙 因为这些专业的人早已经知道鸿蒙将是Windows的巨大威胁了 微软作为一个垄断操作系统多年的巨无霸
  • 短视频时代:如何设计吸引人的黄金3秒开头

    在短视频时代 一个好的开头对于视频的点击率和观看率至关重要 黄金3秒 作为短视频开头最关键的时刻 决定了观众是否愿意继续观看你的视频 那么 如何设计一个吸引人的黄金3秒开头呢 下面将为你揭秘抓住观众注意力的秘诀 一 利用好奇心 好奇心是人类
  • 从大厂到高校,鸿蒙人才“红透半边天”

    前言 近两个月来 纯血鸿蒙未发先火 连带让鸿蒙人才的培养和争夺 也红透半边天 最近 华为人才在线官网公示了2023年教育部产学合作协同育人项目华为第二批项目立项 其中 哈尔滨工业大学 天津大学 电子科技大学等16所高校鸿蒙项目立项已通过 这
  • 深入探讨Android启动优化策略

    深入探讨Android启动优化策略 在当今激烈竞争的移动应用市场 应用的启动速度直接影响着用户的第一印象和满意度 作为主流的移动操作系统之一 Android的启动优化是开发者必须关注的关键领域 本文将详细介绍一些强大有效的Android启动
  • Java 17 & Java 11:新功能探索与改进措施知多少?

    7是Java编程语言的最新 LTS 长期支持 版本 于 2021年9月14日发布 如果您目前使用的是Java11 那么也许是时候考虑迁移到 Java 17啦 方便我们体验新功能以及了解新版本的改善措施 在本文中 我们将讨论 Java 17
  • 鸿蒙开发入门:应用配置文件概述(FA模型)

    应用配置文件概述 FA模型 每个应用项目必须在项目的代码目录下加入配置文件 这些配置文件会向HarmonyOS的编译工具 HarmonyOS操作系统和应用市场提供描述应用的基本信息 应用配置文件需申明以下内容 应用的软件包名称 应用的开发厂
  • 从面试官角度看Handler:掌握技巧,事半功倍!

    引言 在Android开发领域 Handler是一项关键技能 尤其在面试中 对Handler的深刻理解和熟练运用往往是衡量一位Android开发者水平的重要标志 本文将从面试官的角度出发 针对Android Handler技术展开详细的解析
  • 鸿蒙程序员突然走俏招聘市场,大厂为什么要争相鸿蒙高手?

    前言 近期 一股奇特的暖流席卷了国内的IT就业市场 如果你浏览一下各大招聘网站 你会发现一个令人惊讶的现象 鸿蒙程序员的招聘需求激增 众多大厂纷纷抛出橄榄枝 竞相争夺这些稀缺的人才 一时间 鸿蒙程序员成为了招聘市场的香饽饽 各大公司似乎都在
  • 鸿蒙开发一员难求,你知道现在鸿蒙工程师这个岗位有多火热吗?

    前言 你知道现在鸿蒙工程师这个岗位有多火热吗 只要有一年开发经验 我所在的公司都能开到35K的月薪 这本来是至少5年以上开发经验 还得有成功项目经验的 主程 才有的待遇 关键是这样了 还找不上人 本来有一个都答应入职了 第二天就要办手续 人
  • 机器学习的12个基础问题

    1 阐述批归一化的意义 算法 1 批归一化变换 在一个 mini batch 上应用于激活 x 批归一化是一种用于训练神经网络模型的有效方法 这种方法的目标是对特征进行归一化处理 使每层网络的输出都经过激活 得到标准差为 1 的零均值状态
  • 如何应对Android面试官->CAS基本原理

    基本原理 CAS基本原理 Compare And Swap 利用了现代处理器都支持 CAS 指令 循环这个指令 直到成功为止 什么是原子操作 如何实现原子操作 原子操作 要么全部完成 要么全部都不完成的操作 例如 synchronized
  • 人为制造redis的热key、大key引发的线上事故

    背景 Redis中间件 我们主要是用来做缓存 缓解数据库的访问压力 我们搭建的是redis集群 在一个风和日丽的下午 突然收到运维的报警信息 运维 小李 你们使用的redis中间件所在的服务器 有大量的流量流出 宽带快要占满了 网卡都冒烟了
  • 【性能优化】MySql查询性能优化必知必会

    本文内容主要包括以下几个方面 分析查询SQL MySQL查询优化器 数据库存储结构 索引 索引维护 索引设计 SQL优化 表结构设计 分库分表 查询功能架构设计 分析查询SQL MySQL提供了一个性能分析工具 EXPLAIN 它可以帮助我
  • 【面向过程】springboot接受到一个请求后做了什么

    从启动开始 先从springboot怎么启动开始 启动完成之后建立web容器才能在容器中处理http请求 什么是 springboot 在spring的官网上 对springboot这样描述到 Spring Boot 可以轻松创建独立的 生
  • 什么是主动学习(Active Learning)?定义,原理,以及主要方法

    数据是训练任何机器学习模型的关键 但是 对于研究人工智能的企业和团队而言 数据仍是实现成功的最大障碍之一 首先 您需要大量数据来创建高性能模型 更重要的是 您需要标注准确的数据 虽然许多团队一开始都是手动标注数据集 但更多团队已逐渐实现数据
  • java服务调用mysql报错

    一 前言 前端服务调用后端服务时出现以下报错 原因是使用mysql5 7版本数据库中存在ONLY FULL GROUP BY这个配置项导致的不兼容 MySQLSyntaxErrorException Expression 32 of SEL
  • Linux新建一个服务

    新建一个服务 你可以创建一个Systemd服务单元 以便在系统启动时运行特定的脚本或程序 首先 创建一个 service 文件 例如my service service 并将其放在 etc systemd system 目录下 在这个文件中
  • 鸿蒙开发入门:应用配置文件概述(二)

    应用配置文件概述 Stage模型 每个应用项目必须在项目的代码目录下加入配置文件 这些配置文件会向编译工具 操作系统和应用市场提供应用的基本信息 在基于Stage模型开发的应用项目代码下 都存在一个app json5及一个或多个module
  • linux设置两个文件权限完全相同方法

    linux设置两个文件权限完全相同方法 第二个文件设置为具有与第一个文件完全相同的权限 1 使用stat命令查看第一个文件的权限 stat c a 文件1 2 使用chmod命令将第二个文件设置为与第一个文件相同的权限 chmod refe
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d