在 gcp 中设置 grpc-web -> 特使代理 -> 后端服务的最佳实践

如何解决在 gcp 中设置 grpc-web -> 特使代理 -> 后端服务的最佳实践

我已经阅读了一些教程/示例,试图找出一种简单的方法来启动带有特使代理的 grpc 后端来路由网络流量。 我成功地在本地运行此架构以进行 e2e 通信。

我找到了官方文档 https://cloud.google.com/architecture/exposing-grpc-services-on-gke-using-envoy-proxy。但我认为我现在不需要负载平衡器。

我的目标:

  • 运行 Grpc 后端服务器以支持 iOS/Android 应用
  • 运行 Envoy 代理以支持 Web

是否有任何现有的教程可以为 grpc 网络路由部署后端服务器和 Envoy 代理?

解决方法

1.gRPC 框架使移动应用程序可以像本地对象一样直接调用后端服务上的方法。您可以使用 gRPC 提高移动应用的带宽效率,并减少您的应用与在 Google Cloud Platform 上运行的后端服务之间的延迟。

使用 Envoy 代理设置 grpc 后端我们应该使用网络负载平衡,网络负载平衡接受来自互联网的传入请求(例如,来自移动客户端或公司外部的服务消费者)。网络负载平衡执行以下任务 负载平衡器传入连接到池中的工作节点。流量被转发到特使 Kubernetes 服务,该服务在集群中的所有工作节点上公开。 Kubernetes 网络代理将这些连接转发到运行 Envoy 的 pod。 对集群中的工作节点执行 HTTP 运行状况检查。 Envoy 执行以下任务: 终止 SSL/TLS 连接。 通过查询内部集群 DNS 服务来发现运行 gRPC 服务的 Pod。 将流量路由和负载平衡到 gRPC 服务 pod。 根据 gRPC Health Checking Protocol 对 gRPC 服务进行健康检查。 使用网络负载平衡公开端点以进行运行状况检查。

gRPC 服务(echo-grpc 和 reverse-grpc)作为 Kubernetes 无头服务公开。这意味着没有分配 clusterIP 地址,并且 Kubernetes 网络代理不会将流量负载平衡到 pod。相反,在集群 DNS 服务中创建了一个包含 pod IP 地址的 DNS A 记录。 Envoy 从这个 DNS 条目中发现 pod IP 地址,并根据 Envoy 中配置的策略在它们之间进行负载平衡。

部署特使:

创建一个 Kubernetes ConfigMap 来存储 Envoy 配置文件(envoy.yaml) kubectl apply -f k8s/envoy-configmap.yaml

为 Envoy 创建 Kubernetes 部署: kubectl apply -f k8s/envoy-deployment.yaml

验证两个特使 Pod 是否正在运行: kubectl 获取部署特使

如需进一步阅读,请点击以下链接: https://cloud.google.com/architecture/exposing-grpc-services-on-gke-using-envoy-proxy

有关为移动应用配置 Grpc 后端服务器的更多信息,请参阅以下链接: https://cloud.google.com/architecture/mobile-compute-engine-grpc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?