在protobuf中我们可以使用repeated字段来限定一个字段,其意为可重复,类似std中的vector。当使用cpp版本的protobuf时,若定义repeated字段,则在生成的接口中包含一个名为add_xxx()的api,意味着可以向其中添加数据。但是,add_xxx()并没有生效,即server中设置后,client端读不到,造成的原因是add_xxx()并没有真正地创建一个数组.

例如:

message High {
  uint32 high = 1;
}

message HelloReply {
  repeated uint32 weigh = 1;
  repeated High high = 2;
}

在server.cc中添加下面的函数reply->add_weigh(90);,然后在client.cc中读取该值,printf("the weigh is %d\n", reply.weigh());则读取失败

有一个可行的办法就是使用message关键字进行包装一下,例如high字段。两者的主要区别就是一个在message里面,一个在message外面。

service代码示例:

# server.cc
Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
  // 直接使用add_xxx()向repeated字段中添加值,不成功
  reply->add_weigh(90);

  // 通过message封装一层,先添加后设置即可,成功
  ::helloworld::High *high = reply->add_high();
  high->set_high(175);
  return Status::OK;
}

client代码示例:

# client.cc
if (status.ok()) {
  const ::helloworld::High& high = reply.high(0);
  printf("the high is %d\n", high.high());
  printf("the weigh is %d\n", reply.weigh());
} else {
  std::cout << status.error_code() << ": " << status.error_message() << std::endl;
  return "RPC failed";
}

结论:在一个message中如果对一个基本数据类型使用repeated关键字,其生成的api无法添加值;对复杂数据类型使用repeated关键字,其生成的api可以添加值。


P4编程实战

2018-05-07 by subond

P4编程实战:利用p4编程强大的数据包处理能力,实现两个子网数据报的通信。

read more

P4:转发平面的编程语言

2018-05-05 by subond

P4是一种声明性语言,用来表示数据包如何通过网络转发单元的流水线(Pipeline)进行处理,基于抽象转发模型,该模型由解析器(Parser)和一系列匹配+动表(Match+Action Table)组成,分为入口(Ingress)和出口(Egress)两部分。Parser定义了每个传入数据包的包头格式,用于解析数据包。每个Match+Action表对包头字段进行查找和匹配,并在每个表内应用第一个匹配相对应的动作(Action)。

read more

Vagrant使用案例

2017-05-15 by subond

1.单机配置

1) 配置一个centos7系统,要求使用私有网络地址192.168.10.10,hostname为dbserver。

Vagrant.configure("2") do |dbserver|
  dbserver.vm.box = "centos/7"
  dbserver.vm.network "private_network", ip: "192.168.10.10"
  dbserver.vm.hostname = "dbserver"
end

需要说明的是:使用私有地址,vm的私有ip只能在各vm间互访,而不能访问Internet,即HOST_ONLY模式;使用公有地址,vm的公有地址将于主机某个网卡(启动vm时需指定)的地址同一网段,vm能够使用该地址访问Internet。

2) 配置一个ubuntu xenial64系统,并将工程目录下的data目录同步到vm中 …

read more

Vagrant的快速使用

2017-05-10 by subond

Vagrant是为了方便的实现虚拟化环境而设计的,使用Ruby语言开发,基于VirtualBox等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用Vagrant可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,形成分布式系统。

read more

Docker进阶:服务配置

2017-05-01 by subond

当使用Docker Swarm模式时,我们可以通过命令docker service create向Swarm集群部署应用服务。Swarm集群中的管理节点将服务描述视为应用服务所需的状态。其次,所有服务相关的命令,即docker service,一定要在管理节点上运行(管理节点负责Swarm集群中的服务管理和任务编排)。

read more

Docker进阶:以Swarm模式运行Docker引擎

2017-04-28 by subond

Docker Engine 1.12及后续版本支持Swarm模式,我们可以通过以下两种方式开始Swarm模式:创建一个Swarm集群和加入一个已有的Swarm集群。

read more

Docker集群:工作原理

2017-04-26 by subond

一个Swarm是一组Docker引擎或节点的集群,并在这个集群之上部署服务和应用。我们可以使用Docker命令行工具或者API管理集群中的节点,并且还可以通过Swarm部署和编排相应的服务。当我们没有使用Swarm模式的时候,我们只是简单地对容器进行操作;而在Swarm模式下,我们就可以对服务进行编排。值得注意的是,在同一个Docker实例上既可以运行Swarm的服务,也可以运行独立的容器。

read more

Docker集群:服务回滚

2017-04-24 by subond

一个Swarm是一组Docker引擎或节点的集群,并在这个集群之上部署服务和应用。我们可以使用Docker命令行工具或者API管理集群中的节点,并且还可以通过Swarm部署和编排相应的服务。当我们没有使用Swarm模式的时候,我们只是简单地对容器进行操作;而在Swarm模式下,我们就可以对服务进行编排。值得注意的是,在同一个Docker实例上既可以运行Swarm的服务,也可以运行独立的容器。

read more

Docker集群:服务部署

2017-04-22 by subond

一个Swarm是一组Docker引擎或节点的集群,并在这个集群之上部署服务和应用。我们可以使用Docker命令行工具或者API管理集群中的节点,并且还可以通过Swarm部署和编排相应的服务。当我们没有使用Swarm模式的时候,我们只是简单地对容器进行操作;而在Swarm模式下,我们就可以对服务进行编排。值得注意的是,在同一个Docker实例上既可以运行Swarm的服务,也可以运行独立的容器。

read more