动态调用服务

利用动态调用服务,实现.net下类似Dubbo的玩法。

 

     分布式微服务现在成为了很多公司架构首先项,据我了解,很多java公司架构都是 Maven+Dubbo+Zookeeper基础上扩展的。

     Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

     关于更多Dubbo更多资料,可以查看Dubbo官方文档。值得一提的是,Dubbo官方文档也是一份非常好的分布式学习资料。

     那么.net下能不能类似dubbo那样玩呢?目前好像没有找到.net下类似的实现。感觉很多公司应该有自己类似实现,但是没有开源出来吧。

     我这里先做一个类似的基于接口的远程调用的实现,项目的服务实现使用WCF,IOC注入使用Autofac。

     一,解决方案整体设计

     

      (一)Cn.Code.Demo 

       如上图,Cn.Code.Demo 解决方案包含了所有的项目。

       

    如上图:1 Cn.Code.Common 是项目一些公共方法的实现。

               2 Cn.Code.Core 是项目所有的对外接口,此项目只包含接口。

               3 Cn.Code.Demo 是一个MVC项目,用于测试我们的接口调用。

               4 Cn.Code.FirstService 第一个服务实现,实现了Cn.Code.Core 部分接口。

               5 Cn.Code.SecondService 第二个服务实现,实现了Cn.Code.Core 部分接口。

        (二)Cn.Code.FirstService

          

          此解决方案只包含 Cn.Code.Core 和Cn.Code.FirstService 。

         (三)Cn.Code.SecondService

          

         此解决方案只包含 Cn.Code.Core 和Cn.Code.SecondService 。

        二,接口层 --Cn.Code.Core 

        

        接口层只包含如下2个接口,这里我使用WCF进行测试,所以需要添加System.ServiceModel 模块引用。

        IFirstService 接口如下:

复制代码
1     [ServiceContract]
2     public interface IFirstService
3     {
4         [OperationContract]
5         string GetData();
6     }
复制代码

         ISecondService接口如下:

复制代码
1     [ServiceContract]
2     public interface ISecondService
3     {
4         [OperationContract]
5         string GetData();
6     }
复制代码

        三,服务实现 --Cn.Code.FirstService 和Cn.Code.SecondService

        为了方便测试,这里的服务实现都非常简单。

复制代码
1     public class FirstService :IFirstService
2     {
3         public string GetData()
4         {
5             return string.Format("您调用了 FirstService !");
6         }
7 
8     }
复制代码
复制代码
1     public class SecondService :ISecondService
2     {
3         public string GetData()
4         {
5             return string.Format("您调用了 SecondService !");
6         }
7     }
复制代码

         四,公共方法实现 --Cn.Code.Common

         首先是WCF动态调用的构建工厂。

 WcfInvokeFactory

         其次是扩展Autofac一个注册接口的方法。

 RegistExtensions

         五,MVC项目测试 --Cn.Code.Demo

         首先运行2个解决方案Cn.Code.FirstService与Cn.Code.SecondService,得到2个服务地址,将地址配置到项目的web.config中。

    <add key="FirstService" value="http://localhost:9970/FirstService.svc"/>
    <add key="SecondService" value="http://localhost:10014/SecondService.svc"/>

         其次在全局文件Global.asax中,利用自定义Autofac注册扩展,分别注入不同的服务地址。

 Global.asax

         接下来就是调用我们的接口了。

 HomeController

         视图页面输出结果。

复制代码
@{
    ViewBag.Title = "Home Page";
}
<div class="row">
    @ViewBag.FirstText
    <br />
    @ViewBag.SecondText
</div>

 
复制代码

       调用成功。

       五,总结

       这样的话,我们的远程调用服务接口就和平时正常调用使用项目内接口方法一样了。同时这样拆分,可以将不同的服务注册到不同的节点。这个节点也可以是一个集群。

       当然,这里只是个测试小demo,后续应该结合Zookeeper或者其他的分布式服务框架,实现均衡负载的管理。

       

       注:代码比较low,望见谅。代码下载地址Cn.Code.Demo.zip

原文地址:https://www.cnblogs.com/Leo_wl/p/5791651.html