我正在开发一个gRCP API,但遇到了一个小问题。我希望可以从React前端访问gRPC服务,这意味着我需要有一个转译gRPC-> HTTP1的特使代理,反之亦然。
TL; DR 我认为我可以联系特使代理,但是该代理未正确路由到我的服务。
我将在此处提供服务的信息,并在下面解释发生的情况。
我的每项服务的K8(部署和服务)yaml文件:
Simulation deployment
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发送请求并得到了这个信息:
我不太确定该怎么做,但是似乎正在达到使节,但没有达到服务水平。我将不胜感激! :)让我知道是否错过了这里的任何信息。谢谢!
答案 0 :(得分:2)
就想通了!
要进行调试,我在本地运行了代理容器。我能够连接到它,并收到此错误:
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 section tutorial here,则可以为您的服务进行DNS查找,在我看来,这为我提供了
sim-dep.default.svc.cluster.local
。
现在我发现所有要做的就是将envoy配置的主机地址替换为该地址,并且一切正常!