当前位置: 首页 > news >正文

中土南方建设有限公司网站搜狐快站做淘宝客网站

中土南方建设有限公司网站,搜狐快站做淘宝客网站,wordpress用qq群发,泉州小程序开发一、前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息#xff0c;而随之而来的就是一波关于.NET Core下如何使用的教程#xff0c;但是在这众多的教程中基本都是泛泛而谈#xff0c;难以实际在实际环境中使用#xff0c;而该篇教程以gRpc为主#xff0c;但是使用… 一、前言         前一阵子关于.NET的各大公众号都发表了关于gRpc的消息而随之而来的就是一波关于.NET Core下如何使用的教程但是在这众多的教程中基本都是泛泛而谈难以实际在实际环境中使用而该篇教程以gRpc为主但是使用了其SSL/TLS这样更加符合实际的生产使用期间也会配套的讲解Docker、openssl等。   二、服务端   a.准备工作 笔者的项目分为三个部分分别如下所示 Sino.GrpcService.Host控制台宿主程序 Sino.GrpcService.Impl类库实现协议 Sino.GrpcService.Protocol类库生成协议  最终的项目如下图所示   每个项目的project.json如下所示 {   version: 1.0.0-*,   buildOptions: {     emitEntryPoint: true,     copyToOutput: [ server.crt, server.key, appSettings.json, appSettings.*.json ]   },   dependencies: {     Microsoft.NETCore.App: {       type: platform,       version: 1.0.0     },     Sino.GrpcService.Impl: 1.0.0-*,     Microsoft.Extensions.Configuration.Json: 1.0.0,     Microsoft.Extensions.Configuration.Binder: 1.0.0,     Microsoft.Extensions.Configuration.EnvironmentVariables: 1.0.0   },   frameworks: {     netcoreapp1.0: {       imports: [ dnxcore50, net452 ]     }   },   publishOptions: {     include: [ server.crt, server.key, appSettings.json, appSettings.*.json ]   } } 其中“buildOptions”和“publishOptions”中我们将后面我们需要的证书包含到输出和发布中其中我们还利用了“Configuration”相关组件去读取配置信息。  Sino.GrpcService.Impl 其中我们安装了“MongoDb.Driver”为了能够贴近真实的情况笔者这里采用MongoDb作为数据源来提供数据当然读者为了能够快速上手可以硬编码一些数据。 Sino.GrpcService.Protocol 至此项目的初始化结束。  b.编写协议       首先我们打开Sino.GrpcService.Protocol项目在其中新建一个msg.proto文件打开msg.proto文件我们将在其中编写基于proto3语言的协议以便后面自动生成到各语言如果读者需要更深入的学习可以打开该网站Proto3语言指南。 这里我们定义我们当前使用的是proto3语言并且包名生成为C#则为命名空间为 syntax proto3; package Sino.GrpcService; 笔者为该服务定义了1个服务且有4种方法 service MsgService{   rpc GetList(GetMsgListRequest) returns (GetMsgListReply){}   rpc GetOne(GetMsgOneRequest) returns (GetMsgOneReply){}   rpc Edit(EditMsgRequest) returns (EditMsgReply){}   rpc Remove(RemoveMsgRequest) returns (RemoveMsgReply){} } 对应到其中每个方法的接收参数和返回参数的定义如下 message GetMsgListRequest {   int64 UserId 1;   string Title 2;   int64 StartTime 3;   int64 EndTime 4; } message GetMsgListReply {   message MsgItem {     string Id 1;     string Title 2;     string Content 3;     int64 UserId 4;     int64 Time 5;   }   repeated MsgItem Items 1;   int64 Count 2;   bool IsSuccess 3;   string ErrorMsg 4; } message GetMsgOneRequest {   string Id 1; } message GetMsgOneReply {   string Id 1;   string Title 2;   string Content 3;   int64 UserId 4;   int64 Time 5;   bool IsSuccess 6;   string ErrorMsg 7; } message EditMsgRequest {   string Id 1;   string Title 2;   string Content 3; } message EditMsgReply {   bool IsSuccess 1;   string ErrorMsg 2; } message RemoveMsgRequest {   string Id 1; } message RemoveMsgReply {   bool IsSuccess 1;   string ErrorMsg 2; } 到这为止我们就完成了协议的编写。   c.将协议生成为C#代码       相对于网站的很多关于C#使用gRpc的教程都是基于.NET项目框架下的所以可以安装gRpc.Tools但是.NET Core安装后是找不到工具的所以读者可以新建一个.NET项目安装该类库然后将其中的工具复制到Sino.GrpcService.Protocol中这里读者需要根据你当前的系统去选择复制完成之后在该项目中新建一个名为“ProtocGenerate.cmd”的文件在其中输入以下指令 protoc -I . --csharp_out . --grpc_out . --pluginprotoc-gen-grpcgrpc_csharp_plugin.exe msg.proto   然后读者直接双击运行就会看到项目下生成了“Msg.cs”和“MsgGrpc.cs”两个文件这样就完成了所有协议部分的工作了最终的项目结构如下所示   d.编写实现代码       有了协议层之后我们就可以开始编写实现了因为笔者这里使用了MongoDb提供数据所以下文篇幅会较长。   首先打开Sino.GrpcService.Impl项目在其中新建Model文件然后在该文件夹下新建MsgDM.cs文件该文件主要是定义MongoDb存储的数据结构具体内容如下所示 /// summary     /// 消息体     /// /summary     public sealed class MsgDM     {         /// summary         /// 编号         /// /summary         public ObjectId Id { get; set; }         /// summary         /// 标题         /// /summary         public string Title { get; set; }         /// summary         /// 内容         /// /summary         public string Content { get; set; }         /// summary         /// 用户编号         /// /summary         public long UserId { get; set; }         /// summary         /// 时间         /// /summary         public long Time { get; set; }     } 紧接着我们新建Repositories文件夹在其中新建四个文件分别为“IDataContext.cs”、“DataContext.cs”、“IMsgRepository.cs”和“MsgRepository.cs”。打开IDataContext.cs文件在其中编写如下内容 /// summary     /// 数据库上下文     /// /summary     public interface IDataContext     {         IMongoDatabase Database { get; set; }     } 打开DataContext.cs文件进行数据库初始化相关工作 public class DataContext : IDataContext     {         public IMongoDatabase Database { get; set; }         public DataContext(IConfigurationRoot config)         {             var client new MongoClient(config.GetConnectionString(mongodb));             Database client.GetDatabase(aSQ0cWkEshl8NiVn);         }     } 打开IMsgRepository.cs我们需要在其中定义仓储提供的操作 /// summary     /// 消息仓储     /// /summary     public interface IMsgRepository     {         /// summary         /// 获取列表         /// /summary         TaskListMsgDM GetList(long userId, string title, long startTime, long endTime);         /// summary         /// 获取实体         /// /summary         TaskMsgDM Get(string id);         /// summary         /// 更新实体         /// /summary         Taskbool Update(MsgDM data);         /// summary         /// 添加实体         /// /summary         Taskstring Insert(MsgDM data);         /// summary         /// 删除实体         /// /summary         Taskbool Delete(string id);     } 对应的我们还需要打开MsgRepository.cs文件实现该接口 public class MsgRepository : IMsgRepository     {         private IDataContext _dataContext;         private IMongoCollectionMsgDM _collection;         public MsgRepository(IDataContext dataContext)         {             _dataContext dataContext;             _collection _dataContext.Database.GetCollectionMsgDM(msg);         }         public async Taskbool Delete(string id)         {             var filter BuildersMsgDM.Filter.Eq(x x.Id, new ObjectId(id));             var result await _collection.DeleteOneAsync(filter);             return result.DeletedCount 1;         }         public TaskMsgDM Get(string id)         {             var objectId new ObjectId(id);             var result (from item in _collection.AsQueryable()                           where item.Id objectId                           select item).FirstOrDefault();             return Task.FromResult(result);         }         public TaskListMsgDM GetList(long userId, string title, long startTime, long endTime)         {             IQueryableMsgDM filter _collection.AsQueryable();             if (userId ! 0)                 filter filter.Where(x x.UserId userId);             if (!string.IsNullOrEmpty(title))                 filter filter.Where(x x.Title.Contains(title));             if (startTime ! 0)                 filter filter.Where(x x.Time startTime);             if (endTime ! 0)                 filter filter.Where(x x.Time startTime);             return Task.FromResult(filter.ToList());         }         public async Taskstring Insert(MsgDM data)         {             await _collection.InsertOneAsync(data);             return data.Id.ToString();         }         public async Taskbool Update(MsgDM data)         {             var filter BuildersMsgDM.Filter.Eq(x x.Id, data.Id);             var update BuildersMsgDM.Update.Set(x x.Title, data.Title).Set(x x.Content, data.Content);             var result await _collection.UpdateOneAsync(BuildersMsgDM.Filter.Eq(x x.Id, data.Id), update);             return result.ModifiedCount 1;         }     } 完成了上面关于数据库的工作下面我们就进入正题开始实现gRpc服务了首先我们在项目根目录下新建MsgServiceImpl.cs文件在其中实现我们协议中的服务 public class MsgServiceImpl : MsgService.MsgServiceBase     {         private IMsgRepository _msgRepository;         public MsgServiceImpl(IMsgRepository msgRepository)         {             _msgRepository msgRepository;         }         public override async TaskGetMsgListReply GetList(GetMsgListRequest request, ServerCallContext context)         {             var result new GetMsgListReply();             var list await _msgRepository.GetList(request.UserId, request.Title, request.StartTime, request.EndTime);             result.IsSuccess true;             result.Items.AddRange(list.Select(x new GetMsgListReply.Types.MsgItem             {                 UserId x.UserId,                 Title x.Title,                 Time x.Time,                 Content x.Content             }).ToList());             return result;         }         public override async TaskEditMsgReply Edit(EditMsgRequest request, ServerCallContext context)         {             var result new EditMsgReply();             result.IsSuccess await _msgRepository.Update(new MsgDM             {                 Id new MongoDB.Bson.ObjectId(request.Id),                 Title request.Title,                 Content request.Content             });             return result;         }         public override async TaskGetMsgOneReply GetOne(GetMsgOneRequest request, ServerCallContext context)         {             var msg await _msgRepository.Get(request.Id);             return new GetMsgOneReply             {                 IsSuccess true,                 Id msg.Id.ToString(),                 UserId msg.UserId,                 Title msg.Title,                 Content msg.Content,                 Time msg.Time             };         }         public override async TaskRemoveMsgReply Remove(RemoveMsgRequest request, ServerCallContext context)         {             var result new RemoveMsgReply();             result.IsSuccess await _msgRepository.Delete(request.Id);             return result;         }     } 三、证书生成   a.安装openssl 首先读者需要从该网站下载openssl安装程序 Openssl下载 笔者的系统是Win10 64所以下载的是“Win64 OpenSSL v1.1.0b”。   b.制作证书 网上有很多的教程但是对于新手来说直接给绕晕了有的有ca、client和service有的没有这里笔者提供一个全面的cmd脚本默认CA是自己 echo off set OPENSSL_CONFc:\OpenSSL-Win64\bin\openssl.cfg echo Generate CA key: openssl genrsa -passout pass:1111 -des3 -out ca.key 4096 echo Generate CA certificate: openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj  /CCN/STJS/LZJ/Osino/OUtest/CNroot echo Generate server key: openssl genrsa -passout pass:1111 -des3 -out server.key 4096 echo Generate server signing request: openssl req -passin pass:1111 -new -key server.key -out server.csr -subj  /CCN/STJS/LZJ/Osino/OUtest/CNroot echo Self-sign server certificate: openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt echo Remove passphrase from server key: openssl rsa -passin pass:1111 -in server.key -out server.key echo Generate client key openssl genrsa -passout pass:1111 -des3 -out client.key 4096 echo Generate client signing request: openssl req -passin pass:1111 -new -key client.key -out client.csr -subj  /CCN/STJS/LZJ/Osino/OUtest/CNroot echo Self-sign client certificate: openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt echo Remove passphrase from client key: openssl rsa -passin pass:1111 -in client.key -out client.key 以上的脚本也会生成我们下面Demo中使用的证书。   四、完善服务端       用了上面的证书之后我们需要继续把服务端启动gRpc服务部分的代码书写完毕这里笔者是采用命令行形式运行的所以gRpc的启动是独立放在一个文件文件中如下RpcConfiguration所示 其中我们使用了server.crt和server.key这两个证书所以在Host项目中需要将这个两个证书文件copy到项目根目录下如果需要发布的时候包含则需要在project.json中配置如下节 publishOptions: {    include: [ server.crt, server.key, appSettings.json, appSettings.*.json ]} 最后我们需要在Program中启动对应的gRpc即可。   五、客户端编写       完成了服务端的编写剩下的就是客户端的编写当然客户端的编写相对容易很多笔者这里直接把Sino.GrpcService.Protocol项目包含到客户端解决方案中了在正式开发中建议采用nuget包进行管理为了简单起见所以只调用了其中一个服务接口 需要注意下其中“ChannelOptions.SslTargetNameOverride”这部分是必须的因为我们是自己生成的证书所以域名是root如果是生产环境可以不需要。   六、利用Docker运行   a.安装Docker For Windows       这里需要win10的系统这样可以直接在ps中直接利用docker指令了。   b.编写Dockerfile       因为1.1版本出来了但是经过本人的验证如果你的应用不升级是无法使用该镜像的默认使用1.1所以这里我们的Dockerfile需要指定下特定的版本否则是无法构建的我们首先在解决方案的根目录下新建Dockerfile文件然后在其中放入以下命令 FROM microsoft/dotnet:1.0-sdk-projectjson ADD ./ /usr/local/src WORKDIR /usr/local/src/Sino.GrpcService.Host/ RUN cd /usr/local/src/ RUN dotnet restore -v http://api.nuget.org/v3/index.json RUN dotnet build EXPOSE 9007 CMD [dotnet,run] c.生成镜像并运行 我们打开ps然后cd到解决方案的文件夹下利用 docker build -t gRpcService:1.0 .   开始构建基于国内的情况建议大家将docker默认拉取镜像的地址调整下。生成好之后利用以下指令去启动即可 docker run -d –name -p 9007:9007 gRpcService gRpcService:1.0   当然客户端连接的地址和端口也要根据-p指定的情况去调整。  七、其他 对应的源码可以访问以下地址  https://github.com/Vip56/Sino.GrpcService https://github.com/Vip56/Sino.GrpcClient 相关文章  gRPC .NET Core跨平台学习谷歌发布的首款基于HTTP/2和protobuf的RPC框架GRPCC#中使用gRPCGoogle高性能RPC框架gRPC 1.0.0发布 原文地址http://www.cnblogs.com/yaozhenfa/p/gRpc_with_ssl.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
http://www.pierceye.com/news/304857/

相关文章:

  • 学做面食最好的网站设计公司logo大全
  • wordpress建站入门手机网站跳转怎么办
  • 好网站开发培训wordpress是否免费
  • 建设国际互联网网站网站建设制作流程
  • 开发一个网站做爬虫手机网站建设视频
  • 网站搜索功能模块公众号开发菜单
  • 公司想做个自己的网站怎么做网络营销与管理专业
  • 网站设计中国内优秀企业网站欣赏深圳商城网站设计公司
  • 泌阳县住房和城乡建设局网站wordpress注册去掉电子邮件
  • 电商网站设计目的活动策划怎么写
  • 做网站有限公司智慧团建官方网站
  • 南京建设网站公司哪家好科技创新论文800字
  • 网站app的区别是什么深圳沙井做网站公司
  • 珠海网站建站js写wordpress
  • 公司做网站怎么做账网站建设都需要买什么东西
  • seo网站模板深圳建设局和住建局
  • 全国做网站的公司有哪些正规网站做菠菜广告
  • 成都有哪些做公司网站的公司动漫制作专业用什么笔记本电脑
  • 模型外包网站网站建设费用 多少钱
  • 课程资源网站开发 jsp免费做网站自助建站
  • 陕西网站备案代理网站代码隐蔽代码
  • 做网站应该注意免费网站开发合同
  • 网站运营推广怎做网站引导制作
  • 在川航网站购票后怎么做公司黄页网
  • html音乐网页完整代码长春做网站优化的公司
  • wordpress 网站标题为什么尽量不要备案域名
  • 营销型企业网站建设ppt百度一下你就知道123
  • 网络优化师自学网站建设银行网站的特点
  • 苏州网站建设规划网站域名年费
  • 建筑效果图素材网站网站设计证书