用 WCF 实现多层服务架构平台

本文介绍了一种业务层与适配层间的交互设计方法。业务层通过注册自身信息给适配层,实现服务的发布与管理。适配层负责验证客户端身份并返回业务层地址。该设计支持服务的动态更新与负载均衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、业务层服务

业务层可以通过连接到“业务适配器”进行注册。将自身的“公共地址”注册给服务层,并且注册自己所对应的“应用程序名”。这有点像这样:

    /// <summary> 业务服务器的注册信息。
    /// </summary>
    [Serializable]
    public class RegisterInfo
    {
        protected string _BusinessID;
        public string BusinessID
        {
            get
            {
                return this._BusinessID;
            }
        }

        protected string _ApplicationName;
        public string ApplicationName
        {
            get
            {
                return this._ApplicationName;
            }
        }

        protected string _PrivateIP;
        public string PrivateIP
        {
            get
            {
                return this._PrivateIP;
            }
        }

        protected string _PublicIP;
        public string PublicIP
        {
            get
            {
                return this._PublicIP;
            }
        }

        protected string _AddressFormat;
        public string AddressFormat
        {
            get
            {
                return this._AddressFormat;
            }
        }

        public RegisterInfo(string bussineID, string applicationName, string privateIP, string publicIP)
        {
            this._BusinessID = bussineID;
            this._ApplicationName = applicationName;
            this._PrivateIP = privateIP;
            this._PublicIP = publicIP;
        }

        public void SetAddressFormat(string address)
        {
            this._AddressFormat = address.Replace("localhost", "{0}");
        }

    }

业务层在向往适配层注册服务时,需要提供自己的“客户层应用程序名”,自己的“内外网地址”。这样,适配层在接收到客户层的申请时,便可以将注册的“连接地址”告诉客户层。

这样做的目的在于:保护实际业务的操作接口(虽然也是公开接口,但是客户端并不知道如何连接他,只能通过账号密码验证后,业务层发送过来的地址,客户端才可以连接)。

当然更重要的是,还可以实现一个应用多个“服务接口”,这样在分布式应用中是最有效缓解服务器压力的方法之一。

业务层需要注册信息已经确认了,那么便是将服务契约(适配层实现)。

    /// <summary> 注册适配器的契约。
    /// </summary>
    [ServiceContract(CallbackContract = typeof(IRegisterCallback))]
    public interface IRegisterContract
    {
        /// <summary> 将业务服务器注册到适配服务器。
        /// </summary>
        [OperationContract]
        Result Register(RegisterInfo info);

        [OperationContract(IsOneWay = true)]
        void FromBusinessPing(object arg);

    }

Callback契约如下(业务层实现):

    /// <summary> 注册适配器的回调契约。
    /// </summary>
    public interface IRegisterCallback
    {
        /// <summary> 当适配器接收登录验证时的回调函数。
        /// </summary>
        [OperationContract]
        Result ClientLogin(string uid, string pwd);

        /// <summary> 激活业务服务器的状态。
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void FromAdapterPing(PingCommand command, object arg);
    }

这两个接口用于业务层与适配层之间的会话。每当有一个新的客户端连接到适配层时,适配层会向其索要登录凭证,然后转发给对应的应用名的业务层。当业 务层校验成功,适配层才会将这个“隐藏于公众”的地址抛给客户端。IRegisterContract.FromBusinessPing 是适配层接收到业务层的“激活测试”,业务层要告诉适配层:“我正在运行,可以将客户给我 ”。IRegisterCallback.FromAdapterPing 也是同样的道理。这样双方互 PING,可以确保业务层和适配层的在线情况。

当然,这么繁琐的“双方互PING”,还有一个更加重要的作用。

    /// <summary> 表示适配服务器发送至业务服务器的命令。
    /// </summary>
    public enum PingCommand
    {
        /// <summary>  表示这是一个普通的命令。
        /// </summary>
        None,
        /// <summary>  表示这是一个业务服务器关闭的命令。
        /// </summary>
        Close,
        /// <summary>  表示这是一个业务服务器更新的命令。使用Hubble.Net实现全文检索
        /// </summary>
        Update,
    }

通过上面的代码,园友便可以发现,在互动会话的过程中,可以做到“一方断线,多方支援 ”。而当业务层分布在10台不同的电脑上,更新业务层也是一个头疼的问题 。所以,这个问题可以交给适配层来完成。适配层只要检测到本地“业务层”或“客户层”应用程序有版本变化,便会主动(客户层是被动)通知对方更新要求。这样客户层和业务层的更新便可以完美解决。

至此,业务层与适配层之间的交互,已经简单的告诉大家了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值