问题描述
- 我正在Windows 10上使用Visual Studio 2019 16.7.2测试gRPC 64位,使用Net Core 3.1和模板3.1.8创建gRPC服务器 问候服务示例。
- 还使用Net Core 3.1,Google.Protobuf 3.13.0,Grpc.Net.Client 2.31.0和Grpc.Tools 2.31.0创建客户端
- 它可以使用Windows 10 64位Docker桌面在Linux容器上正常运行。
- 然后,在使用同一Linux映像创建Azure容器实例之后,我将容器imagen部署到Azure容器寄存器上,并添加端口:如图所示,端口为443、5001,但它仅侦听端口80上的调用。
container Properties contaniner Log
- Docker文件:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
workdir /app
EXPOSE 80
EXPOSE 443
EXPOSE 5001
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
workdir /src
copY ["GrpcService/GrpcService.csproj","GrpcService/"]
RUN dotnet restore "GrpcService/GrpcService.csproj"
copY . .
workdir "/src/GrpcService"
RUN dotnet build "GrpcService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "GrpcService.csproj" -c Release -o /app/publish
FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","GrpcService.dll"]
解决方法
首先,所有映像都应在本地计算机上进行测试,并可以按预期工作。然后,您可以将它们部署在Azure中。
第二,日志仅显示端口80,因为默认情况下,端口80用于从浏览器访问,并且日志由您自己设置。这并不意味着应用程序无法监听其他端口。您需要检查容器实例内部的侦听端口。
第三,容器实例不支持端口映射。因此,您需要公开Dockerfile中公开的端口,并且应用程序应在设置时监听这些端口。
,正如我所阅读的,VS使用开发人员证书在本地主机上启用SSL,这就是在Docker桌面上打开端口的原因。但是在构建用于部署的Docker映像时,ASP基本映像与gRPC服务器合并,因为没有证书,仅打开了端口80
解决方案是使用反向代理:https://docs.microsoft.com/en-us/azure/container-instances/container-instances-container-group-ssl
基于Nginx gRPC支持:https://www.nginx.com/blog/nginx-1-13-10-grpc/ 需要对nginx.conf文件进行一些调整
server {
listen [::]:5001 ssl http2;
listen 5001 ssl http2;
server_name localhost;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
keepalive_timeout 300;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';
ssl_certificate /etc/nginx/ssl.crt;
ssl_certificate_key /etc/nginx/ssl.key;
location / {
grpc_pass grpc://localhost:80;
}
}
在Deploy YAML上添加DNS标签也很有用,因为IP地址可能会在容器映像更新时更改
ipAddress:
dnsNameLabel: mydnslabel
ports:
- port: 5001
protocol: TCP
type: Public