zoukankan      html  css  js  c++  java
  • 关于使用wcf架构分布式系统的一点想法

    使用iis host wcf,可以很方便的做负载均衡。

    利用这个特点,可以在架构的时候把逻辑层,数据层等部分以wcf的形式发布。

    并且,对一个大型系统来说,总是有若干不同的模块,这些模块有些使用量大,有些使用量小,对每个模块都以wcf的形式发布,那么我们可以给使用量大的模块多负载几个,而使用量小的则少负载。

    但是使用wcf,会带来额外的性能开销。比如非常少用到模块,他本来可以和网站放在一起,那他们是在一个应用程序域里的,但是以wcf形式发布,就分到2个应用程序域里;使用wcf必然要面对序列化,网络通讯等这些方面的新能损失;为了让服务可以同时服务更多的人,这些性能上的损失是必要的,但服务本来服务的人就不多,这个性能上的损失就不必要。

    在开发阶段,我们无法确定上线后哪个模块访问度,哪个模块访问少。

    即便是可以确定,如果把认为多的以wcf的形式开发,少的以系统内开发。这个时候在一个项目里会有2套不同的开发方式,不统一,意为着开发人员的难度变大。而且随着业务的增长,以前认为是小的部分现在压力也顶不住了,要改成wcf的形式,改动起来也比较大。

    但是真正执行的代码其实就是那个类,就是那些代码。

    很自然就想到使用一个ioc容器来解决这个问题,在开发时,统一使用wcf的形式。在部署时,先以wcf的形式部署(配置文件都写好),这个时候web是不引用wcf的dll的,只是引用了web服务。如果要把wcf放到和web一个进程中,只要把wcf的dll考到web的bin目录下就可以了。

    以下使用autofac作为ioc容器做实验。

    建立web项目及wcf项目

    把wcf的服务契约提炼到一个新的项目里,这个项目里只有接口,并且这个项目要被web引用。web不引用wcf项目。

    在web项目的web.config里写好wcf的调用配置,可以先用vs引用生成。

    最后在global里配置autofac

    try
    {
        var path = AppDomain.CurrentDomain.BaseDirectory;
        var ass = Assembly.LoadFrom(path + "bin\\WCFHelper.dll");
        builder.RegisterAssemblyTypes(ass).AsImplementedInterfaces();
    }
    catch
    {
        builder.Register<IMyHelper>(x=>new ChannelFactory<IMyHelper>("IMyEnd").CreateChannel()).OnRelease(x=>((IClientChannel)x).Close());
    }

    如果本地有dll,则直接注册

    如果没有,则需要手动添加所有的服务,并给定配置。

    切换是否使用wcf,只需要在web的bin文件夹里存在/不存在 对应的dll

  • 相关阅读:
    Angular--ui-router的使用
    一个简单的俄罗斯方块游戏脚本
    c中使用gets() 提示warning: this program uses gets(), which is unsafe.
    最短路径之Floyd算法
    动态规划求最大子序列
    Mac上编译C++报错
    nginx location匹配规则
    nginx配置入门
    拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔
    ASP.NET 上的 Async/Await 简介
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2856545.html
Copyright © 2011-2022 走看看