服务网格GRPC协议多种编程语言实践-1 GRPC协议示例的设计

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本系列示例的设计思考

1 通信模型

设计宗旨

  • 覆盖gRPC的4种通信模型。
  • 方法名和参数名不引入任何业务因素,避免额外思考,专注技术本身。

方法定义

  • Unary RPC: talk
  • Server streaming RPC: talkOneAnswerMore
  • Client streaming RPC: talkMoreAnswerOne
  • Bidirectional streaming RPC: talkBidirectional

protobuf定义

service LandingService {
  //Unary RPC
  rpc talk (TalkRequest) returns (TalkResponse) {
  }
  //Server streaming RPC
  rpc talkOneAnswerMore (TalkRequest) returns (stream TalkResponse) {
  }
  //Client streaming RPC with random & sleep
  rpc talkMoreAnswerOne (stream TalkRequest) returns (TalkResponse) {
  }
  //Bidirectional streaming RPC
  rpc talkBidirectional (stream TalkRequest) returns (stream TalkResponse) {
  }
}

方法设计

  • 简单的主线逻辑:服务端将请求参数中的data字段的值作为hello数组的下标,并将相应的值返回给客户端。
  • 简化请求和响应形式,避免使用多个类型来区分单复数:

    • 请求统一使用字符串,复数形式使用逗号分开。
    • 响应统一使用数组,单数时数组只包含一条结果。
  • 客户端和服务端都传递编程语言信息,以{lang}值显式展示流量管理的配置效果。

grpc_diagram.png

2 协议设计

设计宗旨

  • 请求参数足够简单,以方便调试,但要包含足够的信息。
  • 响应参数的数据类型要尽可能覆盖全面,以实现演示的目的。

请求协议

只使用字符串类型,包含请求hello数组的下标值和编程语言信息。

message TalkRequest {
  //language index
  string data = 1;
  //clientside language
  string meta = 2;
}

响应协议

  • 响应只包含两个字段,整数类型的状态码和TalkResult类型的数组。
  • TalkResult类型内部,分别定义了长整型、枚举类型、键值类型(k/v的泛型为字符串)。
message TalkResponse {
  int32 status = 1;
  repeated TalkResult results = 2;
}

message TalkResult {
  //timestamp
  int64 id = 1;
  //enum
  ResultType type = 2;
  // result uuid
  // language index
  // data hello
  // meta serverside language (It's not good here, 
  //      but ok since I feel like to keep the response)
  map<string, string> kv = 3;
}

enum ResultType {
  OK = 0;
  FAIL = 1;
}

3 实现要点

环境变量

我们需要为GRPC的client提供一个变量GRC_SERVER,在本地开发调试时其值为localhost,在POD启动时动态定义为GRPC Service的值,以便client调用。

随机数

在Client streaming和Bidirectional streaming两种通信方式下,客户端需要随机产生一个整型数值,取值要求在hello数组下标的范围内。

时间戳

TalkResult.idint64类型的唯一标识,通过时间戳来实现。

UUID

TalkResult.kv[id]是字符串类型的唯一标识,我们通过UUID来实现。

sleep

在streaming方式下,为了更好地观察,通过sleep方式设置两次请求的间隔。

目录
相关文章
|
8月前
|
运维 Kubernetes Cloud Native
服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践
通过本文介绍丽迅物流关于基于阿里云服务网格 ASM 如何加速企业业务云原生化进程的实践经验。
|
人工智能 自然语言处理 运维
站酷基于服务网格 ASM 的生产实践
随着站酷业务服务的持续改造,将持续基于阿里云服务网格 ASM 产品,获得更加丰富便捷的企业级特性,助力降本增效。
157 0
站酷基于服务网格 ASM 的生产实践
|
人工智能 自然语言处理 运维
站酷基于服务网格ASM的生产实践
随着站酷业务服务的持续改造,将持续基于阿里云服务网格 ASM 产品,获得更加丰富便捷的企业级特性,助力降本增效。
站酷基于服务网格ASM的生产实践
|
Kubernetes 安全 机器人
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
527 0
Lyft 微服务研发效能提升实践 | 3. 利用覆盖机制在预发环境中扩展服务网格
|
安全 测试技术 微服务
站酷基于服务网格 ASM 的生产实践
随着站酷业务服务的持续改造,将持续基于阿里云服务网格ASM产品,获得更加丰富便捷的企业级特性,助力降本增效,包括但不限于:1、提供便捷的网格内服务安全与鉴权方案:ASM现已提供ASM安全策略中心,可帮助快速配置网关与网格内服务安全鉴权方案。2、更加精细化的流量治理能力:随着站酷微服务化改造的不断加深,将会持续挖掘ASM提供的多项企业级流量治理特性,如全链路灰度发布、本地限流、接口级熔断。
155 0
站酷基于服务网格 ASM 的生产实践
|
Kubernetes 数据安全/隐私保护 容器
服务网格ASM使用FAQ之(3):如何在ASM网关中通过配置TLS协议版本来增强安全性
一个增强网站安全性的最佳做法是禁用早期版本的 TLS (TLS v1.0 和 1.1)并仅启用 TLS v1.2 和更高版本。这背后的原因是包括 TLS v1.0 在内的早期 TLS 版本存在已知的安全问题,并且使用功能强大的工具和系统进行了解密,导致传输中的数据泄露。禁用TLS v1.2 中的弱密码也很重要。您可以在 ASM 网关中通过配置TLS协议版本来增强安全性, 从而简单地解决上述问题。前
163 0
|
Kubernetes 网络安全 数据安全/隐私保护
服务网格ASM使用FAQ之(3):如何在ASM网关中通过配置TLS协议版本来增强安全性
包括TLS v1.0在内的早期TLS版本存在已知的安全问题,并且使用功能强大的工具和系统进行了解密,导致传输中的数据泄露。因此,一个增强网站安全性的最佳做法是禁用早期版本的TLS(v1.0和v1.1)并仅启用TLS v1.2及更高版本。同时,禁用TLS v1.2中的弱密码也非常重要。 本文介绍如何在ASM网关配置TLS协议版本,增强网站安全性。
240 0
|
人工智能 自然语言处理 运维
站酷基于服务网格ASM的生产实践
在站酷的生产实践中,多集群、多语言的业务架构对统一管理带来了不小的挑战。对于服务网格来说,由于Sidecar模式的无侵入式特性,可以以统一的方式管理以不同技术栈开发的多语言应用,实现显著的运维成本降低。但对于社区服务网格Istio而言,多集群下的服务治理、以及对不同的Kuberenets集群形态的兼容仍然是一个极大的挑战。通过使用服务网格ASM,对多集群、多形态、多语言服务的统一纳管成为了非常简单的工作。托管式服务网格 ASM 在成为多种异构类型计算服务统一管理的基础设施中, 提供了统一的流量管理能力、服务安全能力、服务可观测性能力、以及实现统一的代理可扩展能力, 以此构筑企业级服务网格平台。
757 1
站酷基于服务网格ASM的生产实践
|
弹性计算 Kubernetes Cloud Native
非容器应用与 K8s 工作负载服务网格化实践|学习笔记(二)
快速学习非容器应用与 K8s 工作负载服务网格化实践
202 0
非容器应用与 K8s 工作负载服务网格化实践|学习笔记(二)
|
2月前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
30 2