etcdv3
简介
使用gs的grpc和etcdv3通信
注意事项
- ./src/rpc.proto 为etcd的protobuf定义
- class_map作用仅是约束并提示map的内容
- Message类中oneof 以及repeated关键字在class_map中的构造
// 如rpc.proto中定义的RequestOp
message RequestOp {
// 其主要内容是下面类似union的结构
oneof request {
RangeRequest request_range = 1;
PutRequest request_put = 2;
DeleteRangeRequest request_delete_range = 3;
TxnRequest request_txn = 4;
}
}
//gs中并无union, 所以对应class_map的__new()函数为
public void __new(RequestOp self , map _class_data)
//其中_class_data参数的字符串应是{"requestRange": RangeRequest_type_value}, {"requestPut": PutRequest_type_value},{"requestDeleteRange": DeleteRangeRequest_type_value},{"requestTxn": TxnRequest_type_value}其中之一
函数调用样例
import pkg.etcdv3.client_stub;
import gs.lang.string;
import gs.util.base64;
//需要load_static以使用client_stub.gs中定义的class_map
load_static(client_stub);
object client_hand = new_object(client_stub, this_domain());
//客户端连接数据库
client_hand.client_init("127.0.0.1", 2379);
//非流式RPC调用,Put函数的输入如下
// message PutRequest {
// bytes key = 1;
// bytes value = 2;
// int64 lease = 3;
// bool prev_kv = 4;
// bool ignore_value = 5;
// bool ignore_lease = 6;
// }
//public PutResponse Put(PutRequest input)
//Put函数要求输入为PutRequest, 返回为PutResponse
//将 “a”-"b" 键值对放入数据库
client_hand.Put(PutRequest.new({"key":"a".to_buffer(), "value": "b".to_buffer()}));
//查询 结果中"kvs"下"key"为"a","value" 为"b"
write(client_hand.Range(RangeRequest.new({"key":"a".to_buffer()})));
//双向流式RPC调用,创建流
object watch_stream = client_hand.Watch();
//watch_stream请求对键值”a“建立一个时间查看器
watch_stream.send(WatchRequest.new({"createRequest": {"key":"a".to_buffer()}}));
//首次获取到键值”a“的空事件 event为[]
write(watch_stream.recv());
client_hand.Put(PutRequest.new({"key":"a".to_buffer(), "value":"c".to_buffer()}));
//获取到上方键值”a“的Put事件 event为 PUT, ”kv“中有put的相关信息
write(watch_stream.recv());
//关闭流
watch_stream.close_stream();