1

我正在研究一个小 gRCP API,但遇到了一个小问题。我希望可以从 React 前端访问 gRPC 服务,这意味着我需要一个能够转换 gRPC -> HTTP1 的特使代理,反之亦然。

TL;DR我想我可以联系到特使代理,但代理没有正确路由到我的服务。

我将把服务信息放在这里并解释下面发生的事情。

我的每个服务的 K8s(部署和服务)yaml 文件:
模拟部署

Envoy 配置文件和 docker 镜像
Envoy Config
Envoy Dockerfile

这是一个快速的健全性检查,确保我的服务正常工作,忽略特使代理:

> kubectl get services
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          37d
sim-dep           NodePort    10.105.65.65     <none>        9090:30780/TCP   3s
sim-dep-http1     NodePort    10.111.190.170   <none>        8080:30948/TCP   3s
sim-envoy-proxy   NodePort    10.110.178.132   <none>        9091:32068/TCP   17h

> curl <minikube ip>:30948/v1/todo/all
{"api":"v1","toDos":[{}]}

> ./client-grpc -server=192.168.99.100:30780
<success from server, too much to put here but it works>

所以据我了解,这个特使代理应该接受端口 9091 上的连接,然后将它们重新路由到端口 9090 上的地址 sim-dep(K8s DNS 正在运行)。
这是我在 React 上运行时的代码和错误我的主机上的应用程序(不在 minikube 中)。

var todoService = new ToDoServiceClient(
   "http://192.168.99.100:32068/",
   null,
   null
);
var todo = new ToDo();
todo.setTitle("JS Created ToDo");
todo.setDescription("This todo was created with JS client");
var createRequest = new CreateRequest();
createRequest.setApi("v1");
createRequest.setTodo(todo);
var response = await todoService.create(createRequest, {}, <callback>);

日志:

upstream connect error or disconnect/reset before headers

我假设这意味着它无法在某个级别连接,但该错误不是很具有描述性。我也无法通过特使代理卷曲,但我确实尝试使用 PostMan 发送请求并得到了这个:

在此处输入图像描述

我不太确定该怎么做,但它似乎正在到达特使,但没有到达服务。我将不胜感激任何帮助!:) 如果我错过了这里的任何信息,请告诉我。谢谢!

4

1 回答 1

4

刚刚想通了!

为了调试它,我在本地运行了代理容器。我能够连接到它并收到此错误:

unknown service /v1.ToDoService

我为此讨厌自己,但那个错误本质上是用英语说的:

I can connect to your server, but I can't find a service called /v1.ToDoService

经过大量盯着我的代码并进行健全性检查后,我意识到它在错误的位置寻找服务......该错误确实应该提供更多信息,但我所要做的就是更改连接我的 JS 客户端中的 url 到这个:

http://localhost:32068

最后没有斜线!哎呀!

现在来处理部署这个代理......

因此,gRPC 服务的部署在其上具有为服务创建 DNS 地址(?不确定其名称)的元数据。所以就我而言,我打电话给我的服务sim-dep。如果您遵循此处的 DNS 部分教程,您可以为您的服务进行 DNS 查找,在我的情况下,这给了我

sim-dep.default.svc.cluster.local.

现在,在发现之后我所要做的就是将特使配置的主机地址替换为该地址,一切顺利!

于 2019-03-06T02:42:21.090 回答