淘宝做网站很便宜,南京市住房城乡建设门户网站,中国水土保持与生态环境建设网站,wordpress 重新生成本篇内容属于非实用性#xff08;拿来即用#xff09;介绍#xff0c;如对框架设计没兴趣的朋友#xff0c;请略过。 快一个月没有写博文了#xff0c;最近忙着两件事;一#xff1a;阅读刘墉先生的《说话的魅力》#xff0c;以一种微妙的#xff0c;你我大家都会经常遇… 本篇内容属于非实用性拿来即用介绍如对框架设计没兴趣的朋友请略过。 快一个月没有写博文了最近忙着两件事; 一阅读刘墉先生的《说话的魅力》以一种微妙的你我大家都会经常遇见的事物来建议说话的“艺术和魅力”对于我们从事软件开发、不太善于沟通和表达的朋友来说也算是一项软技能了推荐喜欢阅读的朋友有时间阅读给你不一样的阅读体验。二编写基于Net Core的Rpc框架。之前有朋友说如何将Rpc等整个体系集成到dotnet框架中我想这篇博文会给你一个答案。哦对了我不建议直接将代码直接复制下来然后去运行的朋友因为这样你达不到学习的目的也违背了笔者的初衷。谢谢理解。 一简单回顾一下之前的介绍继续贴上之前的一张图片 根据上面图服务化原理可以分为3步服务端启动并且向注册中心发送服务信息注册中心收到后会定时监控服务状态常见心跳检测客户端需要开始调用服务的时候首先去注册中心获取服务信息客户端创建远程调用连接连接后服务端返回处理信息 第3步又可以细分下面说说远程过程调用的原理目标客户端怎么调用远程机器上的公开方法服务发现向注册中心获取服务(这里需要做的有很多拿到多个服务时需要做负载均衡同机房过滤、版本过滤、服务路由过滤、统一网关等)客户端发起调用将需要调用的服务、方法、参数进行组装序列化编码组装的消息这里可以使用json也可以使用xml也可以使用protobuf也可以使用hessian几种方案的序列化速度还有序列化后占用字节大小都是选择的重要指标对内笔者建议使用高效的protobuf它基于TCP/IP二进制进行序列化体积小速度快。传输协议可以使用传统的IO阻塞传输也可以使用高效的nio传输(Netty)服务端收到后进行反序列化然后进行相应的处理服务端序列化response信息并且返回客户端收到response信息并且反序列化 至于C类和S类之间的通信方式是采用RPC还是采用RESTful读者可以参考之前的介绍根据实际业务进行决定https://www.cnblogs.com/SteveLee/p/service_discovery_and_service_governance.html 二DotEasy.Rpc框架介绍 单论Rpc框架市场且不论Java上的Spring Boot和Spring Cloud这样大名鼎鼎的开源框架目前Net上的Rpc整合性框架确实并不多我们Net程序员也要混口饭吃不能总被Java甩掉好几条街吧。 言归正传一个远程过程调用会涉及到如下几个方面的技术点功能路由转发当服务部署在多个节点上时调用方需要知道自己的目标服务在什么地方。通信协议当管道存在还需要在管道的两端建立处理程序宿主以处理管道中的数据包。DotEasy.Rpc基于DotNetty进行通信处理和协议实现。动态生成我们知道基于二进制的RPC传输每当新增接口或修改接口都需要生成相关协议的protobuf文件或 thrift 文件本框架基于protobuf-net的传输框架和Rosyln的预生成动态生成相关的CS文件。运行时代理本框架采用一次请求创建一个客户端的模式进行S端的服务请求本框架基于Rosyln运行时创建客户端代理。接口扫描需要实现多个接口的添加和注册本框架采用Attribute特性来扫描接口并添加到相关的注册中心比如consul或etcd。 2.1 解决方案介绍 整体解决方案不做过多介绍相信单词的词义已经表达了这个项目的作用。 小插曲笔者曾用Easy.Rpc做为项目的主库名称但上传到nuget后才发现原来也有名为easy.rpc的包不过笔者并没找到这个开源作者的网站无赖之下想到“点”这个词也是dotnet的dot开头部分索性干脆也叫DotEasy了吧。 笔者的目的是想通过这个框架或类库集来简化微服务的部署和开发让希望从事微服务NET开发的朋友不再找不到从何入手的窘境。在Nuget.org上能直接下载编译过的包地址https://www.nuget.org/packages/DotEasy.Rpc/推荐使用这种方式进行安装。 如果喜欢研究源码笔者同样也贴上地址https://github.com/steveleeCN87/doteasy.rpc不过源码不包含任何依赖如果编译中出现版本问题可联系笔者。目前Github和Nuget上就放上了DotEasy.Rpc核心库和DotEasy.Rpc.Consul扩展包etcd和entry还在测试阶段就不方便拿出来献丑了。o(∩_∩)o 哈哈 当然也欢迎广大爱好开源的朋友加入共同为NET开源项目做贡献。 2.2 主项目介绍Attributes用于标注该接口为某一特性的方法体当系统通过Microsoft.Extensions.DependencyInjection自动构建成功后框架将自动扫描接口上标注过[RpcTagBundle]的接口形成目标接口列表以供下面的方法调用。Core该核心分为Server和Client以及核心通用三个部分组成 Client主要用于通过Ip地址远程调用的方法Invoke实现以及远程服务端的检查检查实现。 Communally通用方法库包括唯一ID生成器用于标识每次请求所产生的唯一客户端、通用对象转换器将复杂对象转换为喜欢默认对象、异常处理器、序列化生成器。 Server提供服务宿主服务执行者、服务入口处理、服务管理、服务定位、服务管理工厂的接口及默认实现。Proxy运行时预生成及客户端动态代理模组的接口和方法实现。Routing提供地址定位、服务描述、服务路由的接口和方法实现。Transport基于protobuf-net和dotnettey构建的二进制序列化、和通信管道和宿主的接口和实现。所有主要类均已接口的形式提供接口名称和已默认实现的具体方法体虚方法方便在这个基础上进行扩展和重写。 2.3 主项目接口本节简单介绍一下DotEasy.Rpc主框架的接口的作用。RpcTagBundleAttribute.cs所有标记过[RpcTagBundle]特性的接口均会被扫描至doteasy.rpc框架中IAddressResolver.cs地址解析器提供IPv4地址解析作用用于IServiceRouteFactory和IRemoteInvokeService定位操作IRemoteInvokeService.cs远程调用服务接口提供远程服务调用的关键接口通过IServiceProxyFactory接口代理调用IServiceEntryFactory.cs服务入口工厂接口对全局服务入口的统一的工厂操作例如添加监听移除修改服务入口等IServiceEntryLocate.cs服务入口定位接口通过IAddressResolver过滤和解析实现服务入口的定位IServiceEntryManager.cs服务入口管理全局管理接口功能同IServiceEntryFactory相似但提供更多的服务管理操作比如负载均衡采用轮询实现IServiceEntryProvider.cs服务入口提供者接口一个简单的服务入口提供者程序IServiceExecutor.cs执行服务方法接口执行远程服务的IRemoteInvokeServiceIServiceHost.cs服务宿主接口DotNetty的服务宿主类似own框架的自宿主程序提供请求和响应操作IServiceProxyFactory.cs服务代理工厂接口客户端代理预编译的所有操作实现IServiceProxyGenerater.cs服务代理生成接口客户端代理预编译生成器IServiceRouteFactory.cs服务路由工厂接口IServiceRouteManager.cs服务路由全局管理接口ITransportMessageCodecFactory.cs管道消息传输工厂接口ITransportMessageDecoder.cs管道消息解码器接口ITransportMessageEncoder.cs管道消息编码器接口IMessageListener.cs管道消息监听接口可实现一个消息的接受者和处理程序IMessageSender.cs管道消息发送接口可实现一个消息的发送者 通过上面的框架和㢟就能实现客户端到服务端的RPC通信了吗当然不是还需要服务注册中心例如Consuletcdzookeeper来实现。上面只是提供了路由转发服务定位客户端预编译的实现等等功能而已而服务的注册并没提供因为它不属于基础框架的范畴笔者对zookeeper的笨重太反感当然不是说它不好而consul和etcd十分轻量级特此又专门新增了两个项目DotEasy.Rpc.Consul和DotEasy.Rpc.Etcd用于实现不同注册中心的注册获取方法和健康检测机制。 当然介绍Consul和Etcd如何实现不是本节的重点DotEasy.Rpc这个框架的完全剖析也将在日后新开篇章中专门介绍如何去实现一个框架想必大部分朋友关心的是这个框架能做什么有什么样的功能那么接下来开始吧。 三如何使用本系列一直重复的那张图片噼里啪啦噼里啪啦......此处省略三百字。绕来绕去难以入手正如上一篇有朋友推荐如何在Asp.net core中集成、等等。功能和特性如下Apache许可证2协议开放源代码统一组件装配和构造基于protobuf-net实现字节流序列化基于Rosyln的运行时客户端代理生成基于Rosyln的预生成的客户端代理基于DotNetty的传输信道支持客户端以轮询的方式实现负载平衡Net Core结构及跨平台就这么点不啰嗦让我们开始做DEMO。 3.1 建立服务接口和服务实现既然是服务那么肯定需要以接口interface的方式实现对外暴露并且接口的实现不能和接口封装在同一个DLL中不然还叫什么远程过程调用呢RPC呢如果不了解什么叫接口去翻一翻C#语言规范。先定义一个接口接口方法签名如下很简单不解释。其中接口上有个重要特性叫[RpcTagBundle]该特性只允许标记在interface接口上用于启动时方便框架扫描所有标有该特性的接口。 在看实现类再次重申注意两篇代码中的命名空间就是两个不同的程序集两个项目千万不能以为笔者仅仅是为了区分而已。 3.2 建立asp.net core mvc应用程序新建一个asp.net core mvc应用程序模版默认webapi添加一个控制器HeathController当然控制器名称你也可以自由发挥键入如下代码也十分简单对外暴露一个路由地址为api/Health的API接口提供GET方法返回OK信息。这个接口的作用是用于Consul对服务的健康状态检查回调地址Consul可以基于HTTP做健康检查也可以通过gRPC验证服务健康状态。至此一个WebApi就建立完成对外不在通过HTTP做任何接口暴露。接下来我们添加一个IApplicationBuilder的扩展用于启动Rpc服务端代码如下1实例化一个BaseServer的服务类型并使用IConfiguration作为参数。该BaseServer类是封装太DotEasy.Rpc.Entry中的一个实现主要是简化调用者的代码构建能力不然截图一个部分源码瞧瞧框架的目的是简化编码工作构建RPC实例也不例外100多行的构建代码只用3行实现偷懒者必备。2调用一次RegisterEvent委托事件用于将接口和实现注册到ServiceCollection容器中。3启动这个RPC服务其实方法内还有构建ServiceCollection容器等等一大堆方法你可以自己实现也可以问笔者要源码。 配置文件在哪儿难道这样就可以了当然不是我们还需要一个appsettings.json的默认配置文件代码如下这篇配置文件很容易理解这里不再重复啰嗦的解释。 至此一个寄宿于Asp.net core的rpc服务就这样搭建完成可以启动随Consul启动看看。友情提示建议将Asp.net core的默认日志功能关闭否则Consul会5秒发送一个健康检查请求过来日志会慢慢的变得十分臃肿ConfigureLogging((context, logging) { logging.ClearProviders(); })即可移除Logging日志功能。当然你也可以做其他修改毕竟日志在项目中非常重要。 3.3 测试启动Consul和Asp.net coreconsul如何启动这个笔者就不再复述了吧想必看过之前的文章应该都会启动和使用consul了截个图喜悦一下3.1中的六个接口全被注册到consul服务中不信我们访问一个具体接口看看meta信息。路由和服务均通过这个信息进行定位我们可以知道在127.0.0.1的9881端口上可以访问名为“doteasy.rpc.interfaces.IUserService.Exists_id”的接口。当然目前是没有任何验证机制的下一篇会介绍RPC中的统一验证机制。 3.4 建立一个客户端废话不多说直接上代码如你所见我们就像在调用接口一样的去调用了RPC远程服务中间的所有操作都是透明的不需要关心的唯一多了一句是ProxyIUserService();使用代理模式动态生成了RPC远程客户端该操作又被笔者封装在了BaseClient中一切都为了使用者简单。 3.5 跑跑客户端看看结果注意加粗的文字是否跟调用接口一样的结果呢其他的调试日志目前请忽略。 四总结这样通过asp.net core consul doteasy.rpc便实现了一个简单的远程服务调用你可以尝试部署到外网看看是否是远程调用当然目前并没有任何的统一网关验证所以任何人的机器都可以调用。原文地址https://www.cnblogs.com/SteveLee/p/rpc_framework_easy.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com