旧WCF项目迁移到aspnetcore

一个月前,公司的运行WCF的windows服务器down掉了,由于AWS没有通知,没有能第一时间发现问题。所以,客户提出将WCF服务由C#改为JAVA,在Linux上面运行;一方面,AWS对Linux有较多的监控措施,另一方面,假如出现问题,可以设置自动重启等服务。

老旧的WCF服务

目前WCF服务,主要提供windows桌面软件的数据接口,应该有五六年的历史了。我进入公司后,WCF服务的代码,一直由我一个人来维护。存在很多历史遗留问题,也有不同版本的共存。

如果java重写的话,其中的业务逻辑代码,难免会出现各种各样的bug,增加开发和测试的工作量。听说,要移植到linux服务上后,第一时间想到的就是跨平台的.netcore。.netcore经过了四年的发展,到目前的3.1LST版本,已经是非常成熟的跨平台解决方案了。

之后,我就在网上查找,有没有WCF的.netcore版本,查询到的信息总结如下:

CoreWCF不打算做WCF到.NETCore的%兼容的移植;对于新应用程序,WCF这种SOAP技术不建议使用;对于老的应用程序,建议将这些保留在.NETFramework上;如果您真的想将一个旧的应用程序迁移到.NETCore并且想继续使用WCF和WF,社区的开源项目也是可以的,但是上生产的时间表就要到了年.NET5;开源社区,也强烈建议目前不要用于生产环境。很遗憾,想不改动代码就迁移到Linux上面,基本是不可能的了。我的最理想情况,尽量少的手写代码,最好可以像WCF一样,自动生成代理类,像访问本地代码一样,来调用接口。之后,就发现了asp.netcore+gRPC这种形式。

了解gRPC

gRPC的好处非常多:高性能,传输数据小,支持多语言的生成工具,使用HTTP2协议,这些好处网上都有大量详细的介绍,本文不做赘述。其实我最看重的部分还是:客户端和服务端代码,都可以通过一个proto协议文件来自动生成。

而微软官方,也建议用ASP.NETCoregRPC。《适用于WCF开发人员的ASP.NETCoregRPC》

gRPC的proto文件

为了了解proto文件的写法,硬着头皮看谷歌英文文档,proto3勉强了解大概。《LanguageGuide(proto3)》,下面列出一些,我在使用过程中的经验总结:

一个RPC服务必须有且仅有一个入参和一个出参;假如不需要的话,可以设置为空的对象google.protobuf.Empty;基本类型(string,int32等)不能作为PRC服务的参数,可使用谷歌提供的封装对象,如:google.protobuf.StringValue,google.protobuf.Int32Value详见google/protobuf/wrappers.proto文件;proto3不允许null值,这是由于Protobuf二进制序列化,空和null不能区分,利用google.protobuf.StringValue则可以实现null值;同第2点;stringname=1;这个数字必须写,用作Protobuf二进制序列化,并且常用的属性最好放在前12;PS:太不习惯了,总以为是在赋值操作;枚举类型必须从0开始,即:enumWeekday{Sunday=0;Monday=2;};时间类型google.protobuf.Timestamp,必须是UTC时间;消息体message不能继承,可多层嵌套,可以导入import;//我的例子syntax=proto3;optioncsharp_namespace=GrpcServiceTest.Protos;importProtos/ClientInfoModel.proto;importgoogle/protobuf/timestamp.proto;importgoogle/protobuf/wrappers.proto;packageUserManagement;serviceUserManagement{rpcUserReset(google.protobuf.Empty)returns(google.protobuf.Empty);rpcUserLogin(LoginRequestV2)returns(LoginResponseV2);}messageLoginRequestV2{stringUserName=1;stringPassword=2;}messageLoginResponseV2{int32TAG=1;stringMessage=2;UserModelV2UserInfo=3;messageUserModelV2{int64UserID=1;stringUserName=2;google.protobuf.StringValueAddress=3;google.protobuf.TimestampLastLoginTime=4;repeatedPrivGroupPluginModelV2PrivGroupPlugins=5;boolIsDeleted=6;messagePrivGroupPluginModelV2{int64Id=1;google.protobuf.TimestampCreateDateTime=2;google.protobuf.TimestampModifyDateTime=3;int64PluginId=4;int64PrivGroupPluginID=5;}}}根据proto生成代码

用vs,选择gRPCService项目模板,创建项目。它会自动加上nuget包Grpc.AspNetCore。如果没有的话,则需要自己安装nuget包:Grpc.core、Google.Protobuf、Grpc.Tools。由proto文件生成代码有两种方式:

通过vs右键proto文件,选择属性Property,选择BuildAction中的Protobuf


转载请注明:http://www.aierlanlan.com/rzdk/1840.html