当前位置: 首页 > news >正文

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

定义 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 logicimport ("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.ContextsvcCtx *svc.ServiceContextlogx.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 linevar 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 mainimport ("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.RpcClientConfconf.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

相关文章:

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

定义 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&qu…...

Python 快速入门——基础语法

python 的语法逻辑完全靠缩进,建议缩进 4 个空格。 如果是顶级代码,那么必须顶格书写,哪怕只有一个空格也会有语法错误。 下面示例中,满足 if 条件要输出两行内容,这两行内容必须都缩进,而且具有相同的缩进…...

EasyRecovery2024苹果电脑mac破解版安装包下载

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序,它不会往源驱上写任何东西,也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、…...

Git常用命令大全

1.强制推送(慎用,除非你认为其他冲突等可以丢弃 或者不是很重要) git push -- force2.创建文件等小命令 touch a // 创建一个a文件 echo 1234 >> a // 把1234这个内容放入a文件 cat a // 打开a文件 读取出a文件中的内容 mkdir test /…...

vue项目本地正常运行,打包到线上时无法访问js等资源

nginx配置错误,如: location /aaa/ {gzip on;gzip_static on;try_files $uri $uri/ /aaa/index.html;alias /home/ec2-user/data/aaa/;#这里必须以斜杆结束,否则就会报错}前端配置文件错误,如: config/index.js文件的b…...

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本(Version)首部长度(Header Length)区分服务(Differentiated Services Field)可选字段填充总长度(Total Length)标识、标…...

LangChain 25: SQL Agent通过自然语言查询数据库sqlite

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…...

Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

生产环境中热 key 处理 热 key 问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的 key 就是热 key,往往这样的 key 也是存储在了一个 redis 节点中,对该节点压力很大 那么对于热 key 的处理就是通过热…...

可惜+悲伤+唉=emmo...

拟合曲线: 参考论文:黄河清.NURBS曲面逆向造型关键算法的研究与应用 [D].西北工业大学,2004 三次NURBS曲线控制点的计算 首先给出拟合曲线的具体步骤: 1、节点矢量的求解方法为: 采用积累弦长参数化法,即&#xff1…...

[gRPC实现go调用go]

1什么是RPC RPC:Remote Procedure Call,远程过程调用。简单来说就是两个进程之间的数据交互。正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用。和本地过程调用相对的就是:假如两个…...

uniapp使用v-html调用接口,富文本图片 视频自适应大小

前端获取到后台数据 不做处理 就会出现下面问题 图片 视频超出视图显示不全 处理 //info 是富文本 <view v-ifinfo v-htmlreplaceWhite(info)></view>调用下面方法 replaceWhite(html) { // 处理富文本默认图片&#xff0c;视频大小let newContent html.replace…...

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…...

MySql数据库全量备份脚本

#!/bin/bash# 设置数据库连接信息 DB_HOST"localhost" DB_USER"root" DB_PASS"密码" DB_NAMES("db1" "db2" "db3" "db4")# 设置备份目录 BACKUP_DIR"/home/mysql/mysql-back/everyday" # 每天…...

windows10下jdk安装

文章目录 windows10下jdk安装说明what安装包下载执行安装包验证是否安装成功 windows10下jdk安装 说明 操作系统&#xff1a;windows10 版本&#xff1a;1.8 what JDK(Java Development Kit) 是 Java 语言的软件开发工具包 安装包下载 https://www.oracle.com/java/techn…...

Centos7防火墙及端口开启

1、防火墙 1.1、查看防火墙是否开启 systemctl status firewalld 1.2、开启防火墙 firewall-cmd --list-ports 1.3、重启防火墙 firewall-cmd --reload 2、端口 2.1、查看所有已开启的端口号 firewall-cmd --list-ports 2.2、手动开启端口 启动防火墙后&#xff0c;默认没有开…...

vue开发,axios网络请求框架基本用法和封装

axios安装 npm install axiosaxios基本用法 默认的get请求&#xff0c;参数用params追加&#xff0c;多个参数通过json对象的方式&#xff0c;例如params:‘{type:“home”,page:1}’ axios({url: https://api.videolog.net.cn/baidu/token,params: }).then(value > {co…...

对比SPI、UART、I2C通信的区别与应用

SPI、UART、I2C通信是常用的数字通信协议&#xff0c;它们在不同的场景下有不同的应用。下面&#xff0c;我将分别介绍它们的特点、区别与应用。 SPI通信 SPI通信是一种串行同步通信协议&#xff0c;它的全称为“Serial Peripheral Interface”。SPI通信是一种单主多从的通信方…...

CentOS7安装MySQL8.0

一、使用Yum安装 1. 使用wget下载MySQL的rpm包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm2. 安装下载好的rpm包 yum localinstall mysql80-community-release-el7-3.noarch.rpm 3. 安装mysql&#xff08;该步可能出现问题&#xff09; yum…...

【Go<—>Java】gRPC测试注意事项

在做go和Java之间gRPC调用之前需要完成以下两项工作&#xff1a; go语言版本的gRPC调用&#xff0c;实现server端和client端Java语言版本的gRPC调用&#xff0c;实现server端和client端 由于gRPC是跨语言的通信协议&#xff0c;所以我们可以相互调用&#xff0c;有以下2种调用…...

java面试题整合

1.Java数据类型 ✅ Java是一种静态类型语言&#xff0c;它具有丰富的数据类型用于声明变量和方法返回类型。Java中的数据类型分为两类&#xff1a;原始数据类型&#xff08;Primitive Data Types&#xff09;和引用数据类型&#xff08;Reference Data Types&#xff09;。 原…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...