RuleGo RuleGo
🏠首页
  • 快速入门
  • 规则链
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 可视化
  • RuleGo-Server
  • RuleGo-MCP-Server
  • AOP
  • 触发器
  • 高级主题
  • 性能
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 组件市场
  • 概述
  • 快速入门
  • 路由
  • DSL
  • API
  • Options
  • 组件
🔥编辑器 (opens new window)
  • 可视化编辑器 (opens new window)
  • RuleGo-Server (opens new window)
  • ❓问答

    • FAQ
💖支持
👥加入社区
  • Github (opens new window)
  • Gitee (opens new window)
  • GitCode (opens new window)
  • 更新日志 (opens new window)
  • English
  • 简体中文
🏠首页
  • 快速入门
  • 规则链
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 可视化
  • RuleGo-Server
  • RuleGo-MCP-Server
  • AOP
  • 触发器
  • 高级主题
  • 性能
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 组件市场
  • 概述
  • 快速入门
  • 路由
  • DSL
  • API
  • Options
  • 组件
🔥编辑器 (opens new window)
  • 可视化编辑器 (opens new window)
  • RuleGo-Server (opens new window)
  • ❓问答

    • FAQ
💖支持
👥加入社区
  • Github (opens new window)
  • Gitee (opens new window)
  • GitCode (opens new window)
  • 更新日志 (opens new window)
  • English
  • 简体中文

广告采用随机轮播方式显示 ❤️成为赞助商
  • 快速入门

  • 规则链

  • 标准组件

  • 扩展组件

    • 扩展组件概述
    • 过滤器

    • 转换器

    • 外部的

      • redis客户端
      • kafka客户端
      • nats客户端
      • rabbitmq客户端
      • opengemini写客户端
      • opengemini读客户端
      • MongoDB户端
      • redis发布
      • gRPC客户端
        • 配置
        • 工作原理
        • Relation Type
        • 执行结果
        • 示例
      • OpenTelemetry
      • BeanstalkdWorker
      • BeanstalkdTube
      • WukongimSender
    • AI

    • CI

    • IoT

  • 自定义组件

  • 组件市场

  • 可视化

  • AOP

  • 触发器

  • 高级主题

  • RuleGo-Server

  • 问题

目录

gRPC客户端

x/grpcClient组件:v0.25.0+ gRPC客户端。允许动态调用gRPC服务。

gRPC 服务端必须注册gRPC 反射服务。允许客户端在运行时查询服务器支持的服务和方法。

# 配置

该组件支持通过server字段复用共享的连接客户端,避免重复创建连接。详见组件连接复用。

字段 类型 必填 说明 默认值
server string 是 gRPC服务地址,格式为host:port 无
service string 是 gRPC服务名称,支持使用组件配置变量进行动态配置 无
method string 是 gRPC方法名称,支持使用组件配置变量进行动态配置 无
request string 否 请求参数,JSON格式。如果为空则使用当前消息负荷。必须与service/method要求的参数类型一致 无
headers map 否 请求头,支持使用组件配置变量进行动态配置 无

# 工作原理

  1. 组件初始化时会根据配置连接到gRPC服务器
  2. 接收到消息后,通过反射机制动态调用指定的service和method
  3. 调用成功后通过Success链路由,失败则通过Failure链路由
  4. 组件会自动管理连接的生命周期,包括重连等

# Relation Type

  • Success: 以下情况消息发送到Success链路:
    • gRPC调用成功完成
    • 服务响应成功返回
  • Failure: 以下情况消息发送到Failure链路:
    • 连接gRPC服务器失败
    • 服务或方法不存在
    • 请求参数格式错误
    • 调用执行失败
    • 配置参数错误

# 执行结果

gRPC调用的响应结果会被赋值到消息负荷并传递到下一个节点:

  • 响应数据会被赋值到msg.data
  • metadata会保留原有内容
  • msgType保持不变

# 示例

  1. 定义一个gRPC服务,如下:
syntax = "proto3";

package helloworld;

option go_package = ".;helloworld";

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  1. 生成protobuf代码
protoc --go_out=. --go-grpc_out=. helloworld.proto
1
  1. 运行服务端
package main

import (
	"context"
	pb "github.com/rulego/rulego-components/external/grpc/testdata/helloworld"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"log"
	"net"
)

// server 是 Greeter 服务的服务器实现
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello 实现 Greeter 服务的 SayHello 方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    // 从上下文中获取元数据
    md, ok := metadata.FromIncomingContext(ctx)
    if ok {
      // 打印所有头部信息
      for key, values := range md {
        log.Printf("Header %s: %v", key, values)
      }
    }
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	listen, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	// 注册 gRPC 反射服务
	reflection.Register(s)
	//启动服务
	if err := s.Serve(listen); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  1. 通过grpcClient组件调用服务端
{
    "id": "s1",
    "type": "x/grpcClient",
    "name": "call grpc service",
    "configuration": {
      "server":  "127.0.0.1:50051",
      "service": "helloworld.Greeter",
      "method":  "SayHello",
      "request": "{\"name\": \"lulu\"}"
    }
}
1
2
3
4
5
6
7
8
9
10
11
在 GitHub 上编辑此页 (opens new window)
上次更新: 2025/04/02, 01:29:50
redis发布
OpenTelemetry

← redis发布 OpenTelemetry→

Theme by Vdoing | Copyright © 2023-2025 RuleGo Team | Apache 2.0 License

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式