使用 .Net Core 3.0 和 gRPC 微服务更新网站

.Net Core 3.0正式版已经发布,对我而言,这次最大更新便是gRPC的支持了,而且是全托管的方式实现,这个非常棒,之前引用google官方的gRPC组件会包含非托管的dll。程序员网址导航的设计在几个月前就已经想好,几次想在第8,9个预览版就想更新,不过还是忍住了,最近利用周末时间终于把它更新升级完成,于是今天将过程写下供大家参考。它包含的内容以及使用的技术简介(源码地址文章最后提供):
+ 基于.Net 3.0开发
+ gRPC微服务,MVC网站
+ Mysql 8.0 数据库
+ AutoMapper 9.0.0,Dapper 2.0.4
+ 前端 webpack + vue-router + axios
+ CentOS7.6,Docker-compose,Nginx 部署

1. 安装
安装 Visual Studio 2019 16.3 即可,它包含了.Net Core 3.0,也包括了gRPC模版

2. 解决方案


 目录 项目 介绍
BLL Dispatcher 微服务调度,也是微服务的客户端,它需要包含gRPC的hrefs.proto文件,这里都是共同引用微服务项目的Protos
BLL
 IService 前端业务调用接口层
BLL Service 前端业务调用实现层,它将通过Dispatcher访问gRPC微服务
DAL IRepository 微服务背后的数据层接口
DAL Repository 微服务背后的数据实现层
Model Models 实体模型
Service MicroServices 微服务
Util Common/MiscHelpers/UIHelpers Common是网站与微服务共用的辅助项目,MiscHelpers是微服务辅助项目,UIHelpers是网站辅助项目
/ hrefs.cn 网站

3. gRPC 微服务
a)整个项目的hrefs.proto位于这个项目,客户端引用这个文件来生成客户端调用类
b)微服务实体与业务实体的转换,Mapping类引用AutoMapper来完成
c)实现docker部署,必须要dockerfile文件
d)微服务将访问数据库,微服务也仅仅负责数据库的增删改查,这样可以获得更好的性能与实时性

4. gRPC 客户端调度
我这里使用一个静态方法创建一个gRPC通道,然后调用gRPC方法,返回的是gRPC实体,需要再次实体转换。当然采用单例会比静态方法好,因为在高并发的情况下,静态方法过量的创建gRPC通道会抛socket异常。

5. 网站
用户页面都是后台渲染的,也就是对搜索引擎友好,内容管理的页面使用vue-router实现。


6. docker-compose部署
a)微服务部署-Dockerfile
#基于 microsoft/dotnet 来构建我们的镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0

#拷贝项目publish文件夹中的所有文件到docker容器中的publish文件夹中
COPY . /publish

#设置工作目录为 /publish 文件夹,即容器启动默认的文件夹
WORKDIR /publish

#使用dotnet MicroServices来运行应用程序,MicroServices是你网站的启动dll
CMD ["dotnet""MicroServices.dll"]

b)网站部署-Dockerfile
#基于 microsoft/dotnet 来构建我们的镜像
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0

#拷贝项目publish文件夹中的所有文件到docker容器中的publish文件夹中
COPY . /publish

#设置工作目录为 /publish 文件夹,即容器启动默认的文件夹
WORKDIR /publish

#使用dotnet hrefs.cn.dll来运行应用程序,hrefs.cn.dll是你网站的启动dll
CMD ["dotnet""hrefs.cn.dll"]

docker-compose 截图


注意:
在没有证书的情况下,.net core gRPC微服务发布到生产环境的默认端口是80,而不是5000,50001,其实在内部网络环境,也无需配置证书。那问题来了,在没有配置证书的情况下,客户端如何访问呢?我开始也折腾了好一会,然后查官方文档找到答案,就是在创建通道之前执行这句,申明不支持http2,所以你访问也必须用http://打头,这段源码可以在:https://github.com/iissy/hrefs.cn/blob/master/BLL/Dispatcher/HrefsDispatcher.cs 找到。
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

本网站的全部代码已经提交到github:https://github.com/iissy/hrefs.cn
Posted by 何敏 on 2019/10/01 17:53:01