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

Go语言gRPC与gozero的api

什么是gRPC?

gRPC是由Google开发并开源的一个高性能、通用的RPC框架。它基于HTTP/2协议,默认使用Protocol Buffers(简称ProtoBuf)作为接口描述语言(IDL)。

gRPC的主要特点:

  1. 高性能:得益于HTTP/2和ProtoBuf,gRPC具有更高的传输效率。
  2. 跨语言支持:支持多种语言,包括Go、Java、Python等。
  3. 流式通信:支持双向流式通信,适合实时数据传输。
  4. 强类型接口:ProtoBuf提供了严格的接口定义。

在Go中使用gRPC的基础步骤

以下是使用gRPC的基本流程:

1. 安装必要的工具

首先,确保你已经安装了以下工具:

  • Go
  • Protocol Buffers Compiler
  • gRPC相关的Go插件

安装Go的ProtoBuf插件:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

将插件路径加入系统环境变量:

export PATH="$PATH:$(go env GOPATH)/bin"

2. 定义服务接口

创建一个.proto文件来定义gRPC服务。

例如,一个简单的HelloWorld服务:

syntax = "proto3";

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

3. 生成Go代码

使用protoc工具生成服务代码:

protoc --go_out=. --go-grpc_out=. helloworld.proto

4. 实现服务逻辑

在Go项目中实现服务:

package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"
	pb "path/to/helloworld"
)

type greeterServer struct {
	pb.UnimplementedGreeterServer
}

func (s *greeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
	return &pb.HelloReply{Message: "Hello, " + req.Name}, nil
}
}

func main() {
	listener, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	grpcServer := grpc.NewServer()
	pb.RegisterGreeterServer(grpcServer, &greeterServer{})

	log.Printf("server listening at %v", listener.Addr())
	if err := grpcServer.Serve(listener); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

5. 编写客户端

客户端代码示例:

package main

import (
	"context"
	"log"
	"time"

	"google.golang.org/grpc"
	pb "path/to/helloworld"
)

func main() {
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()

	c := pb.NewGreeterClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()

	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "World"})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.Message)
}

实战场景

场景1:微服务通信

在微服务架构中,gRPC可以用来高效地通信。例如,用户服务与订单服务之间通过gRPC调用共享数据。

场景2:实时流式数据

gRPC的双向流式通信适用于实时聊天、视频流等场景。

场景3:跨语言系统集成

如果系统由多种语言实现的模块组成,gRPC的跨语言能力可以简化开发。

GoZero API 的基本语法

GoZero 使用 .api 文件作为 HTTP 接口定义的描述文件。.api 文件使用简单直观的语法,定义了服务的路由、请求参数、响应结构等内容。

API 文件的基本结构

一个 .api 文件通常由以下几个部分组成:

  1. 信息块:定义 API 的元信息。
  2. 类型块:定义数据结构类型。
  3. 服务块:定义服务的路由及接口。

示例 API 文件

以下是一个简单的 API 文件示例:

syntax = "v1";

info(
    title: "User Service"
    desc: "This is a simple user service API."
    author: "Your Name"
    email: "your.email@example.com"
)

type (
    User {
        id: int64
        name: string
        age: int32
    }

    CreateUserRequest {
        name: string
        age: int32
    }

    CreateUserResponse {
        id: int64
    }
)

service user-api {
    @handler GetUser
    get /users/:id ();

    @handler CreateUser
    post /users (CreateUserRequest) returns (CreateUserResponse);
}

API 文件的语法详解

1. 信息块

info 块用于描述 API 的元信息,包括标题、描述、作者、联系邮箱等。

info(
    title: "Service Name"
    desc: "Service Description"
    author: "Author Name"
    email: "author@example.com"
)

2. 类型块

type 块定义了接口中使用的数据结构。这些结构可以作为请求参数或响应结果。

  • 支持的字段类型包括:int64int32floatstringbool 等。
  • 结构体中可以嵌套其他类型。

type (
    Address {
        city: string
        zipcode: string
    }

    User {
        id: int64
        name: string
        address: Address
    }
)

3. 服务块

service 块定义了 HTTP 服务的接口路由和请求处理器。

路由定义

  • 支持 HTTP 方法:getpostputdelete 等。
  • 路由参数用 :param 表示。

请求与响应

  • 可以为接口定义请求体和返回体。
  • 请求体和返回体对应 type 块中定义的结构。

service example-api {
    @handler GetExample
    get /example/:id ();

    @handler CreateExample
    post /example (CreateExampleRequest) returns (CreateExampleResponse);
}

4. 注解

@handler 是 GoZero 的特定注解,用于指定每个路由的处理函数名。生成代码后,开发者需要实现这些处理函数。

使用 GoZero 生成代码

1. 安装 goctl

goctl 是 GoZero 提供的代码生成工具。

go install github.com/zeromicro/go-zero/tools/goctl@latest

2. 生成服务代码

使用以下命令根据 .api 文件生成代码:

goctl api go -api example.api -dir ./output

生成的代码包括:

  • 路由配置
  • 数据结构
  • 处理函数的接口定义

3. 实现业务逻辑

根据生成的模板文件,填充具体的业务逻辑。例如:

package logic

import (
    "context"

    "example/internal/svc"
    "example/internal/types"
)

type GetUserLogic struct {
    ctx    context.Context
    svcCtx *svc.ServiceContext
}

func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLogic {
    return &GetUserLogic{
        ctx:    ctx,
        svcCtx: svcCtx,
    }
}

func (l *GetUserLogic) GetUser(req *types.GetUserRequest) (*types.GetUserResponse, error) {
    // 实现具体逻辑
    return &types.GetUserResponse{
        Id:   req.Id,
        Name: "Example Name",
    }, nil
}

gRPC 与 GoZero API 的差异总结

  1. 定义方式
    • gRPC:基于 .proto 文件定义服务,使用 Protocol Buffers(ProtoBuf)描述数据结构和服务接口。
    • GoZero API:基于 .api 文件定义服务,语法更简单直观,直接面向 HTTP 路由和请求响应。
  2. 通信协议
    • gRPC:默认使用 HTTP/2 和 ProtoBuf,适合高性能、跨语言的场景。
    • GoZero API:基于 HTTP 协议,主要面向 RESTful API 设计。
  3. 生成代码
    • gRPC:使用 protoc 工具生成服务代码,并需要实现定义的接口。
    • GoZero API:使用 goctl 工具生成完整的服务代码,包括路由、数据结构和处理模板。
  4. 适用场景
    • gRPC:适合实时流式通信、分布式微服务和跨语言系统。
    • GoZero API:适合快速开发基于 HTTP 的微服务和 RESTful 接口。
  5. 开发复杂度
    • gRPC:学习曲线稍高,需了解 ProtoBuf 和 gRPC 服务的机制。
    • GoZero API:语法简单,上手容易,更贴近 HTTP 开发者的使用习惯。

总结来说,gRPC 更注重性能和跨语言支持,而 GoZero API 则聚焦于 HTTP 微服务的快速开发。开发者可根据项目需求选择适合的框架。


http://www.kler.cn/a/452940.html

相关文章:

  • QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
  • 网络安全 - Cross-site scripting
  • 攻防世界web第三题file_include
  • 选择FPGA开发,学历是硬性要求吗?
  • log4j2漏洞复现(CVE-2021-44228)
  • WWW23-多行为级联|级联图卷积网络的多行为推荐
  • 如何选择最佳时间进行WordPress网站维护避免流量损失
  • 轻量级安全云存储方案Hoodik
  • 分布式协同 - 分布式事务_2PC 3PC解决方案
  • 【Java基础面试题044】使用new String(“哈哈“)语句会创建几个对象?
  • C++-------动态内存管理
  • LDR6020在iPad一体式键盘的创新应用
  • Spring提供了很好事务管理机制
  • Mac提示:安装anycast后台服务进程失败
  • STM32之GPIO输出与输出
  • Vivado常用IP例化2
  • 新能源汽车双向峰谷充放电研究
  • 查看mysql编译参数
  • IT运维中的自然语言处理(NLP)技术应用
  • php8.0版本更新了哪些内容
  • react useCallback
  • Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
  • goview——vue3+vite——数据大屏配置系统
  • 架构师之路--达梦数据库执行计划与索引优化
  • 【ETCD】【实操篇(十)】基于 ETCD 实现一个简单的服务注册及发现功能
  • VScode实时检查c++语法错误