gpt4 book ai didi

.net - 如何通过 Traefik 从外部网络(在 docker 容器外部)发出 gRPC 请求?

转载 作者:行者123 更新时间:2023-12-02 18:34:59 29 4
gpt4 key购买 nike

我在 docker-compose 文件中实现了配置,如下所示(所有容器都在公共(public)存储库中,因此您可以自己尝试此配置):

version: '3'

services:
reverse-proxy:
# The official v2.0 Traefik docker image
image: traefik:v2.2
# Enables the web UI and tells Traefik to listen to docker
command: --api.insecure=true --providers.docker
depends_on:
- ping-service
- whoami
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
labels:
- "traefik.http.routers.whoami.rule=PathPrefix(`/foo`)"
ping-service:
image: deadok/vma:pingsvc1.1
environment:
- ms_GrpcServer__Port=80
- ms_GrpcServer__Hostname=0.0.0.0
- GRPC_TRACE=tcp,api,http
- GRPC_VERBOSITY=debug
ports:
- "81:80"
labels:
- "traefik.http.services.ping-service.loadbalancer.server.scheme=h2c"
- "traefik.http.routers.ping-service.rule=PathPrefix(`/ping`)"
rabbit-mq:
image: rabbitmq:3.8.3-management
environment:
- RABBITMQ_DEFAULT_USER=rabbitmq
- RABBITMQ_DEFAULT_PASS=rabbitmq
- RABBITMQ_DEFAULT_VHOST=/
ports:
- "15672:15672"
- "5672:5672"

在这个配置中,我们有 whoami 服务来服务 http 请求,路径前缀规则: /foo还有我自己用 C# (.NET Core) 编写的 gRPC 服务,路由前缀规则: /ping .
gRPC 服务器实现了下面列出的 proto 合约:
syntax = "proto3";

package com.example.grpc;

option java_multiple_files = true;

enum Sentiment {
HAPPY = 0;
SLEEPY = 1;
ANGRY = 2;
}

message HelloRequest {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
map<string, string> bagOfTricks = 4;
Sentiment sentiment = 5;
}

message HelloResponse {
string greeting = 1;
}

message GreetingEmpty {}

// 4. service, unary request/response
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
rpc greetingNew(GreetingEmpty) returns (HelloResponse);
}

当我使用以下链接(例如在 Web 浏览器中)发出“GET”请求时: http://<my.server.ip.here>/foo一切顺利,我收到了 whoami 回复;

但是当我通过 C# 客户端绑定(bind)访问 gRPC 时:
static void Main(string[] args)
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler. Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://<my.server.ip.here>/ping");
var svc = new Com.Example.Grpc.GreetingService.GreetingServiceClient(channel);
var reply = svc.greetingNew(new Com.Example.Grpc.GreetingEmpty());
}

我有一个错误(404,找不到页面)。对于使用 http://<my.server.ip.here>/ping 的 HTTP“GET”请求,我遇到了同样的错误网址。

但是当我向公开的端口 81 发出 gRPC 请求时,使用 url: http://<my.server.ip.here>:81 ,一切正常。

我做错了什么?我如何通过 docker 网络之外的 traefik 访问 gRPC 服务,没有 SSL 证书(用于调试目的)甚至使用 SSL?

附言感谢您将我的问题读到最后。

最佳答案

因此,在对 gRPC 库进行了几天的“调试”后,我们发现 gRPC 客户端向与 proto 合约中的 namespace 相关联的 url 发出请求,因此对于我的示例:

http://<my.server.ip.here>/com.example.grpc/greetingNew

所以我们应该为这种类型的请求设置 PathPrefix 为 PathPrefix( /com.example.grpc ) 并且一切都开始工作了。

关于.net - 如何通过 Traefik 从外部网络(在 docker 容器外部)发出 gRPC 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990862/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com