[转载]文件服务分布式方案一点想法续(代码实现)

[转载]文件服务分布式方案一点想法续(代码实现) – 莫文的博客 – 博客园.

上一篇文件服务分布式方案的想法《文件服务分布式方案一点想法》,想法比较简单,图也比较简单,其实要是说没有什么实质的效果,还是有点的,呵呵。

实现此模式比较复杂的地方服务管理,主要是涉及到服务的负载均衡管理,以及服务死掉之后如何进行处理。
服务管理流程:
服务注册流程
服务请求处理过程:
服务调用流程
代码实现:
服务注册实现代码(服务站点启用时则自动运行)
1 ///   2 /// 功能:当前站点为服务站点,连接服务管理站点 3 /// 执行过程: 4 /// (1)、组装加密url 5 /// (2)、发送请求,并取得返回结果 6 /// (3)、返回 7 /// 8 /// 9 ///   10 public bool ConnectToManager() 11 { 12 try 13 { 14 //组装Url 15 string siteRootUrl = UrlHelper.GetSiteRoot(); 16 string flag = "abcd";//服务站点标识,可以是加密后的串,给服务管理判断当前服务是否是正确的服务来源 17 string url = Config.Get("ManagerUrl") + "/Connect.ashx?ServiceUrl=" + HttpUtility.UrlEncode(siteRootUrl) + 18 "&flag=" + flag; 19 string ret = HttpUtility.HtmlDecode(HttpHelper.DoGetResponse(url)); 20 //返回结果是否正确 21 if (string.IsNullOrEmpty(ret)) 22 { 23 //LogHelper.Write("连接服务管理者失败"); 24 return false; 25 } 26 //返回的消息是否正确 27 if (ret.Contains("Hello World")) 28 return true; 29 return false; 30 31 } 32 catch (Exception e) 33 { 34 //LogHelper.Write("连接服务管理站点失败,错误原因为:" + e.Message + e.StackTrace); 35 return false; 36 } 37 }
服务管理站点处理注册请求:
1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/plain"; 4 if (context.Request["flag"] != "" && context.Request["ServiceUrl"] != null) 5 { 6 string flag = context.Request["flag"].Trim(); 7 //证明来源合法 8 if (flag.Equals("abcd")) 9 { 10 //添加一个新的服务到服务列表 11 Service service = new Service {ServiceUrl = context.Request["ServiceUrl"]}; 12 ServiceManager.AddService(service); 13 //返回信息告诉服务站点,该服务已经注册成功 14 context.Response.Write("Hello World"); 15 } 16 } 17 } 18
服务消费站点Web条用服务,不直接调用服务,调用服务管理,然后返回数据:
1 public partial class _Default : System.Web.UI.Page 2 { 3 public string stringFromService = string.Empty; 4 protected void Page_Load(object sender, EventArgs e) 5 { 6 //调用服务管理站点 7 stringFromService = HttpHelper.DoGetResponse(Config.Get("ManagerUrl") + "?resId=mowen"); 8 } 9 } 10
服务管理站点,根据resid寻找服务,调用服务返回数据:

1 public void ProcessRequest(HttpContext context) 2 { 3 //资源id 4 string resId = context.Request["resid"] ?? string.Empty; 5 //找到服务 6 Service service = ServiceManager.GetService(resId); 7 8 if (service == null) 9 { 10 context.Response.Write("当前服务管理站点没有服务。"); 11 return; 12 } 13 //获取响应 14 context.Response.Write(service.GetServiceResponse(context)); 15 } 16
服务处理:

1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/plain"; 4 //资源id 5 string resId = context.Request["resid"] ?? string.Empty; 6 // 7 //此处可以进行一些文件操作 8 //例如打开文件,取数据,然后缓存起来 9 // 10 context.Response.Write(resId + "的服务"); 11 }

好,咱们来看最后运行情况(运行步骤,启用服务管理站点->启用服务站点(此时服务去服务管理注册服务)->启用Web调用服务):
(1)、启用服务管理

(2)启动服务站点(启动时自动注册服务)

(3)、服务站点处理服务站点注册事件

(4)、注册服务成功


(5)、利用Web调用服务

(6)、服务调用结果

出于展示Demo的目的,工程还有很多地方可以优化,大家可以尝试一下,~_~。

DEMO下载: http://www.cnfounder.com/mw/FileSolution.rar

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏