有关于 RPC 功能的疑问
#1498
-
|
这个 RPC 功能可以控制 EasyTier 吗? 如果可以的话,RPC 使用什么格式(JSON RPC 或者其他的?),具体有哪些命令可以用? 翻了一下文档,貌似没有地方提到 RPC 功能相关的介绍,只有参数(也翻了一下 Issue,没看到相关的讨论) |
Beta Was this translation helpful? Give feedback.
Answered by
KKRainbow
Oct 21, 2025
Replies: 2 comments 8 replies
-
|
RPC 用的是 ET 的私有协议,暂不支持外部调用。你准备用到什么场景呢 |
Beta Was this translation helpful? Give feedback.
7 replies
-
|
没有文档,只能自己翻源码,我用python调通了,大概过程是构造ZCPacket,发送后解析response,具体怎么构造ZCPacket以及resp的格式,需要看对应的proto文件,其实没必要折腾的,直接用cli方便。 # 数据包类型枚举
class PacketType(enum.Enum):
Invalid = 0
Data = 1
HandShake = 2
RoutePacket = 3
Ping = 4
Pong = 5
TaRpc = 6
Route = 7
RpcReq = 8
RpcResp = 9
ForeignNetworkPacket = 10
KcpSrc = 11
KcpDst = 12
@dataclass
class TCPTunnelHeader:
len: int # U32
def encode(self) -> bytes:
return struct.pack('<I', self.len)
@staticmethod
def decode(data: bytes) -> 'TCPTunnelHeader':
len_value = struct.unpack('<I', data[:4])[0]
return TCPTunnelHeader(len=len_value)
@dataclass
class PeerManagerHeader:
from_peer_id: int # U32
to_peer_id: int # U32
packet_type: int # u8
flags: int # u8
forward_counter: int # u8
reserved: int # u8
len: int # U32
def encode(self) -> bytes:
return struct.pack('<IIBBBBI',
self.from_peer_id,
self.to_peer_id,
self.packet_type,
self.flags,
self.forward_counter,
self.reserved,
self.len
)
@staticmethod
def decode(data: bytes) -> 'PeerManagerHeader':
from_peer_id, to_peer_id, packet_type, flags, forward_counter, reserved, len_value = struct.unpack('<IIBBBBI', data[:16])
return PeerManagerHeader(
from_peer_id=from_peer_id,
to_peer_id=to_peer_id,
packet_type=packet_type,
flags=flags,
forward_counter=forward_counter,
reserved=reserved,
len=len_value
)
@dataclass
class ZCPacket:
tunnel_header: TCPTunnelHeader
peer_manager_header: PeerManagerHeader
rpc_packet: common_pb2.RpcPacket
def encode(self) -> bytes:
rpc_packet_data = self.rpc_packet.SerializeToString()
self.peer_manager_header.len = len(rpc_packet_data)
self.tunnel_header.len = 16 + len(rpc_packet_data) # PeerManagerHeader长度为16字节
return (
self.tunnel_header.encode() +
self.peer_manager_header.encode() +
rpc_packet_data
)
@staticmethod
def decode(data: bytes) -> 'ZCPacket':
tunnel_header = TCPTunnelHeader.decode(data[:4])
peer_manager_header = PeerManagerHeader.decode(data[4:20])
rpc_packet_data = data[20:20+peer_manager_header.len]
# 使用protobuf的ParseFromString解析rpc_packet_data
rpc_packet = common_pb2.RpcPacket()
rpc_packet.ParseFromString(rpc_packet_data)
return ZCPacket(
tunnel_header=tunnel_header,
peer_manager_header=peer_manager_header,
rpc_packet=rpc_packet
)
|
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
是的