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

.net 如何从外部网络(docker容器外部)通过Traefik发出gRPC请求?,.net,docker,devops,grpc,traefik,.net,Docker,Devops,Grpc,Traefik,我在docker compose文件中实现了如下配置(所有容器都位于公共存储库中,因此您可以自己尝试此配置): 在这个配置中,我们有一个whoami服务,它服务于http请求,路径前缀规则为:/foo 我自己的gRPC服务写在C#(.NETCore)上,路由前缀规则为:/ping。 gRPC服务器实现以下列出的协议: syntax = "proto3"; package com.example.grpc; option java_multiple_files = true; enum Se

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

在这个配置中,我们有一个whoami服务,它服务于http请求,路径前缀规则为:
/foo
我自己的gRPC服务写在C#(.NETCore)上,路由前缀规则为:
/ping
。 gRPC服务器实现以下列出的协议:

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);
}
syntax=“proto3”;
包com.example.grpc;
选项java\u multiple\u files=true;
列举情感{
快乐=0;
SLEEPY=1;
愤怒=2;
}
信息HelloRequest{
字符串名称=1;
int32年龄=2岁;
重复字符串=3;
map bagOfTricks=4;
情绪=5;
}
消息Hello响应{
字符串问候=1;
}
消息问候空{}
// 4. 服务,一元请求/响应
服务接待服务{
rpc问候语(HelloRequest)返回(HelloreResponse);
rpc greetingNew(GreetingEmpty)返回(HelloResponse);
}
当我使用以下链接(例如在web浏览器中)发出“获取”请求时:
http:///foo
一切顺利,我收到了whoami的回复

但当我通过C#客户端访问gRPC时:

static void Main(字符串[]args)
{
AppContext.SetSwitch(“System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport”,true);
使用var channel=GrpcChannel.ForAddress(“http:///ping");
var svc=new Com.Example.Grpc.GreetingService.GreetingServiceClient(通道);
var reply=svc.greetingNew(new Com.Example.Grpc.GreetingEmpty());
}
我有一个错误(404,找不到页面)。使用
http:///ping
url

但当我使用url:
http://:81
向公开的端口81发出gRPC请求时,一切正常

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

另外,感谢您将我的问题一直读到最后。

因此,在对gRPC库进行了几天的“调试”之后,我们发现gRPC客户端请求与原始合同中的名称空间关联的url,因此我的示例是:

http://<my.server.ip.here>/com.example.grpc/greetingNew
http:///com.example.grpc/greetingNew
因此,我们应该将此类请求的PathPrefix设置为PathPrefix(
/com.example.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());
}
http://<my.server.ip.here>/com.example.grpc/greetingNew