首页 > 其他分享 >使用grpc开发RPC服务

使用grpc开发RPC服务

时间:2024-08-11 15:29:06浏览次数:13  
标签:protobuf err grpc pb UserInfoService RPC 开发

grpc简介

gRPC是谷歌开源的一款跨平台、高性能的RPC框架,笔者目前主要使用它来进行后端微服务的开发。
可能会有的同学对RPC不太熟悉,其实在笔者看来,RPC和HTTP并无多大的区别都是一种调用方式,区别则是在于RPC会限制传输协议、传输的参数等,以此换取高效的传输流程,比如grpc就使用的是google开源的protobuf协议,使用TCP的方式进行传输,使得请求比起普通的JSON+HTPP更加快捷。关于更多protobuf的信息,可以查看这里

必要的准备

  • 了解Golang及其生态
  • 安装gRPc及protobuf,教程
  • 安装golang
  • 安装protobuf编译器
一、首先我们需要定义好整个服务的protobuf文件user.proto
syntax = "proto3";  // 指定语法格式,注意 proto3 不再支持 proto2 的 required 和 optional
package  proto;      // 指定生成的 user.pb.go 的包名,防止命名冲突

// service 定义开放调用的服务,即 UserInfoService 微服务
service  UserInfoService {
// rpc 定义服务内的 GetUserInfo 远程调用
rpc  GetUserInfo (UserRequest) returns (UserResponse) {
}
}

  
  

// message 对应生成代码的 struct

// 定义客户端请求的数据格式

message  UserRequest {

// [修饰符] 类型 字段名 = 标识符;

string  name = 1;

}

// 定义服务端响应的数据格式

message  UserResponse {

int32  id = 1;

string  name = 2;

int32  age = 3;

repeated  string  title = 4;  // repeated 修饰符表示字段是可变数组,即 slice 类型

}

然后我们通过protoc命令编译proto文件,生成对应的go文件

protoc -I . --go_out=plugins=grpc:. ./user.proto 

二、我们来实现server.go

首先我们应该明确实现的步骤:
1、实现GetUserInfo接口
2、使用gRPC建立服务,监听端口
3、将我们实现的服务注册到gRPC中去
话不多说,代码如下

package  main

import (
"fmt"
"log"
"net"
// Import the generated protobuf code
pb "go_mirco_service/proto"
"golang.org/x/net/context"
"google.golang.org/grpc"

)
type  UserInfoService  struct{}
var  u  = UserInfoService{}

func (u *UserInfoService) GetUserInfo(ctx context.Context, req *pb.UserRequest) (resp *pb.UserResponse, err error) {

name  := req.Name

if name ==  "leoython" {

resp  =  &pb.UserResponse{

Id: 233,

            Name: name,

Age: 20,

            Title: []string{"Gopher"},

        }

    }

err  =  nil

return

}

  

func  main() {

port  :=  ":2333"

l, err  := net.Listen("tcp", port)

if err !=  nil {

        log.Fatalf("listen error: %v\n", err)

    }

    fmt.Printf("listen %s\n", port)

s  := grpc.NewServer()

  

// 将 UserInfoService 注册到 gRPC

// 注意第二个参数 UserInfoServiceServer 是接口类型的变量

// 需要取地址传参

    pb.RegisterUserInfoServiceServer(s, &u)

    s.Serve(l)

} 

到此我们就实现了利用gRPC实现了一个非常简单但是五脏俱全的RPC服务,但是却出现了一个问题,我们无法直接调用,所以我们还需要实现一个调用server的客户端,代码如下

package  main

  

import (

"fmt"

"log"

  

pb "go_mirco_service/proto"

  

"golang.org/x/net/context"

"google.golang.org/grpc"

)

  

func  main() {

conn, err  := grpc.Dial(":2333", grpc.WithInsecure())

if err !=  nil {

        log.Fatalf("dial error: %v\n", err)

    }

defer conn.Close()

  

// 实例化 UserInfoService 微服务的客户端

client  := pb.NewUserInfoServiceClient(conn)

  

// 调用服务

req  :=  new(pb.UserRequest)

req.Name  =  "leoython"

resp, err  := client.GetUserInfo(context.Background(), req)

if err !=  nil {

        log.Fatalf("resp error: %v\n", err)

    }

    fmt.Printf("Recevied: %v\n", resp)

} 

结语

至此,我们已经学会使用gRPC进行开发,采用protobuf进行参数的定义,下一篇笔者将会使用grpc-gateway将RPC接口转换为rest接口供客户端调用,而不需要客户端实现RPC,这也是现在主流微服务的一种服务提供方式,对外使用REST,对内使用RPC

 

可参考https://blog.csdn.net/Wendy_LWZ/article/details/81330799

thrift跨语言通信实例    https://blog.csdn.net/koli6678/article/details/80740749

标签:protobuf,err,grpc,pb,UserInfoService,RPC,开发
From: https://www.cnblogs.com/596014054-yangdongsheng/p/10803348.html

相关文章

  • grpc-gateway:grpc转换为http协议对外提供服务
    使用grpc的优点很多,二进制的数据可以加快传输速度,基于http2的多路复用可以减少服务之间的连接次数,和函数一样的调用方式也有效的提升了开发效率。不过使用grpc也会面临一个问题,我们的微服务对外一定是要提供Restful接口的,如果内部调用使用grpc,在某些情况下要同时提供一个功能的两......
  • 钉钉群机器人开发接口
      获取自定义机器人webhook步骤一,在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”,完成后会生成Hook地址,如下图:步骤二,点击“复制”按钮,即可获得这个机器人对应的Webhook地址,其格式如......
  • AI大模型开发——3.深度学习基础(2)
    8.损失函数        损失函数( Loss Functions), 也称为代价函数, 是用于评估模型预测值与真实值之间差异的函数。在神经网络训练过程中,损失函数用于指导模型参数的更新方向和幅度, 以使模型预测的结果尽可能接近真实值。        常见的损失函数有以下两个......
  • AI大模型开发——2.深度学习基础(1)
        学习大模型开发之前,我们需要有足够的储备知识,类似于基础的python语法相信大家也都是十分熟悉了。所以笔者也是考虑了几天决定先给大家补充一些深度学习知识。    首先问大家一个问题,学习大模型之前为什么要先学习深度学习知识呢?    首先,深度学习......
  • 开发者工具Postman接口测试工具使用介绍
    Postman接口测试工具详解Postman是一个功能强大的API测试工具,广泛应用于接口开发和测试过程中。它提供了一个直观的界面来创建、发送和管理API请求,并可以轻松地检查响应。以下是Postman的详细使用指南,包括基本概念、功能和操作步骤。安装和设置安装Postman下载:......
  • python asyncio grpc
    1.准备环境python3.11-mvenvvenvsourcevenv/*/activatepipinstallgrpcio-tools#包含了grpcio和protobufpipinstalltypes-protobufgrpc-stubs#可选安装,用于mypy静态检查2.编写msg.protosyntax="proto3";//这是注释,同时也是类文档serviceMsgService{......
  • “低代码”开发平台的兴起
    “低代码”开发平台的兴起是近年来技术领域的一个重要趋势,它标志着软件开发方式的重大变革,对于促进技术创新、加速应用开发周期、降低开发门槛以及推动数字化转型等方面都具有深远影响。以下是对“低代码”开发平台兴起的一些看法:加速应用开发周期:低代码平台通过提供可视化设......
  • FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
    ​不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用W......
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
    超链接是互联网中最有趣的创新之一,自互联网诞生起,它们就一直是互联网的一个核心特性,使网络成为一个互联的系统。超链接允许我们将文档连接到其他文档或资源,甚至是文档中的特定部分。通过一个简单的网址,可以提供应用程序。几乎所有网络内容都可以被转换为链接,点击或激活这些超链......
  • git clone 网络太差总是失败:error: RPC 失败。curl 92 HTTP/2 stream 5 was not close
    ❯gitclonehttps://github.com/Almamu/linux-wallpaperengine.git.正克隆到'.'...remote:Enumeratingobjects:6271,done.remote:Countingobjects:100%(1447/1447),done.remote:Compressingobjects:100%(628/628),done.error:RPC失败。curl92HTT......