WCF Routing服务,负载均衡
WCF4.0支持路由机制,通过RoutingService实现请求分发、拦截处理。
一、应用场景
1、暴露一个endpoint在外网,其余服务部署于内网;
2、请求分发,能对服务做负载功能;
二、WCF4.0 路由服务

图1- WCF路由示意图
WCF RoutingService使用了消息过滤器的功能,内置定义了6个过滤器满足不同的需求:
1、ActionMessageFilter:满足指定的操作集之一,也就操作匹配;
2、EndpointAddressMessageFilter:满足指定的终结点地址;
3、XPathMessageFilter:使用 XPath指定匹配的条件,用于实现基于内容路由的核心消息过滤器;
4、MatchAllMessageFilter 与所有消息相匹配;
5、MatchNoneMessageFilter 与所有消息都不匹配;
对于以上默认提供的过滤器不能满足需求,还可以通过创建自己的 MessageFilter 实现消息过滤器。如下我们通过一个demo实现wcf服务分发负载处理。
三、WCF RoutingService负载处理请求
1、创建一个WCF服务,名称为:Aden.FK.WcfServiceA,基于console hosting实现,创建两个ServiceHost。
(1)接口定义和实现为:
|
1
2
3
4
5
6
7
8
9
|
[ServiceContract] public interface IWcfServiceA { [OperationContract] int GetNumber(); [OperationContract] string GetString(); } |
(2)服务的实现:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class WcfServiceA : IWcfServiceA { public int GetNumber() { string msg = "Service :" + OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri; Console.WriteLine(string.Format("print: {0}", msg)); return new Random().Next(); } public string GetString() { string msg = "Service :" + OperationContext.Current.EndpointDispatcher.EndpointAddress.Uri; Console.WriteLine(string.Format("print: {0}", msg)); return msg; } } |
(3)创建服务host:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int num = 2; int index = 0; List<ServiceHost> serviceHost = new List<ServiceHost>(); for (int i = 1; i <= num; i++) { serviceHost.Add(new ServiceHost(typeof(WcfServiceA))); } serviceHost.ToList().ForEach(u => { var netTcp = new NetTcpBinding(); netTcp.Security.Mode = SecurityMode.None; u.AddServiceEndpoint(typeof(IWcfServiceA), netTcp, string.Format("net.tcp://127.0.0.1:910{0}/services/WcfServiceA{1}", ++index, index)); u.Open(); Console.WriteLine("{0} Service Start,Address is {1}", u.Description.Name, u.Description.Endpoints[0].Address.Uri); } ); |
2、创建一个路由服务,自定义扩展实现MessageFilter进行请求分发,路由与服务之间以TCP协议传输。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
var serverEndpoints = new List<ServiceEndpoint>();var netTcp = new NetTcpBinding();netTcp.Security.Mode = SecurityMode.None;serverEndpoints.Add(new ServiceEndpoint(new ContractDescription("IWcfServiceA"), netTcp, new EndpointAddress("net.tcp://127.0.0.1:9101/services/WcfServiceA1")));serverEndpoints.Add(new ServiceEndpoint(new ContractDescription("IWcfServiceA"), netTcp, new EndpointAddress("net.tcp://127.0.0.1:9102/services/WcfServiceA2")));using (var router = new ServiceHost(typeof(RoutingService))){ int index = 10; string routerAddress = "net.tcp://127.0.0.1:8101/router/routerendpoint"; router.AddServiceEndpoint(typeof(IRequestReplyRouter), netTcp, routerAddress); var config = new RoutingConfiguration(); LoadBalancerFilter.EndpointsNumber = 2; serverEndpoints.ForEach(x => config.FilterTable.Add(new LoadBalancerFilter(), new[] { x }, index--)); router.Description.Behaviors.Add(new RoutingBehavior(config)); var debugBehavior = router.Description.Behaviors.Find<ServiceDebugBehavior>(); debugBehavior.IncludeExceptionDetailInFaults = true; if (router.State != CommunicationState.Opening) router.Open(); while (Console.ReadKey().Key == ConsoleKey.Enter) { break; } router.Close();} |
3、创建一个客户端,客户端与路由之间以TCP协议传输。
|
1
2
3
4
5
6
7
8
|
var endpoint = new EndpointAddress("net.tcp://127.0.0.1:8101/router/routerendpoint"); var netTcp = new NetTcpBinding(); netTcp.Security.Mode = SecurityMode.None; var client = ChannelFactory<IWcfServiceA>.CreateChannel(netTcp, endpoint); while (Console.ReadKey().Key == ConsoleKey.Enter) { Console.WriteLine("--" + client.GetNumber()); } |
四、运行结果
1、客户端调用

2、服务端显示,每次将请求分发到不同的服务处理。

五、总结
以上是一个简单的路由服务例子,可以根据实际情况扩展路由功能,实现上述描述是应用场景。考虑到路由的压力,可以在路由前架上Nginx负载。
引用:http://www.cnblogs.com/Andon_liu/p/5433538.html
WCF Routing服务,负载均衡的更多相关文章
- 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)
转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...
- Windows服务器nginx+tomcat服务负载均衡
一.安装两个tomcat服务自启动 1. 解压两个tomcat,名称为分别1,2 2. 配置环境变量 3. 修改文件server.xml中的三个端口号,使得两个tomcat不冲突 (1)<Ser ...
- HTTP服务负载均衡总结
从一开始就要思考扩展的架构,所谓可扩展性指的是通过扩展规模提高承载能力的本领,往往体现在增加物理服务器或者集群节点.负载均衡是常见的水平扩展的手段. 目标:(1)减少单点故障(2)提升整体吞吐量(3) ...
- 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon
对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...
- springcloud第四步:ribbon搭建服务负载均衡
使用ribbon实现负载均衡 启动两个会员服务工程,端口号分别为8762.8763,订单服务 使用负载均衡策略轮训到会员服务接口. 什么是ribbon ribbon是一个负载均衡客户端 类似nginx ...
- SpringCloud微服务负载均衡与网关
1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...
- 微服务负载均衡 —— ribbon
负载均衡是系统高可用.缓解网络流量和处理能力扩容的重要手段,广义的负载均衡指的是服务端负载均衡,如硬件负载均衡(F5)和软件负载均衡(Nginx).负载均衡设备会维护一份可用的服务器的信息,当客户端请 ...
- SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign
1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...
- WCF Routing 服务
WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发,能对服务做负载功能: 二.WC ...
随机推荐
- 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
20165230 <Java程序设计>实验五<网络编程与安全>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
- Spring4总结
1. 明确Spring的主要作用就是为代码“解耦”,降低代码间的耦合度.使用IoC使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring容器统一管理,自动 ...
- 如何新建Quartus工程—FPGA入门教程【钛白Logic】
这一章我们来实现第一个FPGA工程—LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- Shell-遍历删除指定目录
Code: find $LibPath/ -name .svn | xargs rm -rf
- 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
mysql主从复制架构,是mysql数据库主要特色之一,绝大多数公司都有用到. 而GTID模式是基于事务的复制模式的意思,发展到现在也是越来越多人用. 以前很多文章,介绍搭建mysql主从复制架构,是 ...
- 用一句SQL查询相对复杂的统计报表
--统计从2017年3月份开始每个月金融服务支付前分期申请数以及通过(核账完成)数 ,ApplyTime)) ,ApplyTime)) as varchar)+'月' as 日期,count(*) a ...
- 使用crontab命令添加计划任务
Ubuntu 16.04, 计划任务 就是 有(时间)计划地执行(做)任务,有计划 包括 定时执行(在哪些时间点执行任务).按照周期执行(每隔多少时间执行任务). 那么,什么是任务呢?就是 自己想要干 ...
- Java 语言多态性
https://www.ibm.com/developerworks/cn/java/java-language-polymorphism/index.html 定义多态性 多态性是面向对象编程中的一 ...
- Java编程的逻辑 (65) - 线程的基本概念
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- SpringMVC框架06——文件上传与下载
1.文件上传 Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现. ...