前言
.Net Core3.0 终于如约而至的来了. 在 3.0 中增加了许多东西, 也有了许多的变化. 今天我们看的就是在 3.0 中使用 gRPC 并遇到的问题. gRPC 现在可以非常方便简洁的在. Net Core 中使用了, 今天我也是尝试了一下, 但是不幸了是遇到了一些阻碍. 我们一起看看是啥问题吧.
gRPC 介绍
gRPC 是 google 开源的一个高性能, 跨语言的 RPC 框架, 基于 HTTP2 协议, 采用 ProtoBuf 定义的 IDL.
优点:
现代高性能轻量级的 RPC 框架
协定优先 API 开发, 默认使用协议缓冲区, 允许与语言无关的实现
可以实现多语言的工具
protobuf 二进制序列化, 性能好 / 效率高
基于 Http2.0
在 ASP.NET Core 3.0 中使用 gRPC 也有许多文章进行了介绍, 我也是看了这些文章进行的学习. 大家也是可以自行去查找的.
部署问题
按照在 ASP.NET Core 3.0 中使用 gRPC 的文章中的教程一步一步的创建项目, 编写代码. 一套流程走下来那是行云流水. 编写完之后在本地就开始进行测试. 先跑起来服务端. 在跑客户端. 看到客户端上的消息返回. 成功了. 第一次就成功, 果然是更加简单了. 其中有两点需要注意的是因为在 3.0 中使用的 gRPC 是基于 Http2.0 的. 而它又需要 HTTPS, 尽管说没有明确规定必须使用 HTTPS, 但是为了安全在浏览器实现上都要求了 HTTPS, 所以现在的 HTTP/2 和 HTTPS 基本都是一对.
所以我们在本地运行的时候会出现一个弹框, 询问我们是否信任证书. 下面我的问题也就和这个有关了. 本地运行一切正常. 我就想搬到服务器上去试试看行不行. 结果接过上去服务端是跑起来了, 结果客户端运行起来就报错了.
- Unhandled exception. System.NET.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
- ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
解决方案
1, 修改 https 为 http(不行, 大错特错)
这个报错我就有点纳闷了, 我首先检查环境, 发现都是对的. 就有点纳闷了. 然后看是连接失败. 我就尝试修改 https 为 http. 结果还是错误的. 这个方法就被抛弃了.(修改之后会导致客户端和服务端的 SSL/TLS 配置不匹配..Net Core 客户端必须在 https 服务器地址中使用才能正确的使用安全连接)
2, 信任证书 (可行)
仔细查看错误, 发现最后标明是证书无效. 这是想起我们在本地第一次运行的时候弹窗提示我们是否信任证书. 好像就是这个关系了. 照这个路子想下去. 找到在如何安装 ASP.NET Core HTTPS 开发证书. 然后我们再试试, 果然就可以了.
dotnet dev-certs https --trust
3, 忽略无效证书 (可行)
后面又发现了一种解决方案, 既然是证书无效导致的问题, 那么忽略无效证书是不是可以呢? 然后我们换一台服务器, 继续尝试一下. 在代码中加上忽略无效证书的代码. 然后再次进行尝试发现也是可以的. 不过这里需要注意的是这个忽略无效证书在开发过程中使用即可, 换到生产环境还是替换成有效证书
- var httpClientHandler = new HttpClientHandler();
- // Return `true` to allow certificates that are untrusted/invalid
- httpClientHandler.ServerCertificateCustomValidationCallback =
- HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
- var httpClient = new HttpClient(httpClientHandler);
- var channel = GrpcChannel.ForAddress("https://localhost:5001",new GrpcChannelOptions { HttpClient = httpClient });
- var client = new Greeter.GreeterClient(channel);
总结
在我们使用在. Net Core 3.0 中使用 gRPC 的时候, 需要注意的时候保持客户端和服务端的 SSL/TLS 配置的匹配, 基于 HTTP2.0, 使用 https 进行连接. 证书的问题也就是在开发环境时出现解决, 在正式生产环境中我们还是需要使用有效证书的.
平凡人生要用平凡的心去对待, 你的人生将会更精彩.
欢迎大家扫描下方二维码, 和学习了解更多的知识吧!
来源: https://www.cnblogs.com/hulizhong/p/11586053.html