Windows Azure Cloud Service (20) 使用Internal Endpoint实现Role的内部通信

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

Windows Azure Platform 系列文章目录

 

  相对于Input Endpoint而言,Windows Azure还提供了Internal Endpoint的概念。如果说Input Endpoint就是Windows Azure负载均衡服务器的一个映射配置,使得Role Instance的内部地址可以被映射到Hosted Service URL上的话,Internal Endpoint就可以理解为在Hosted Service中部署的所有Role之间开放的内部端口。这些端口虽然不能通过Hosted Service URL访问,但是可以被其他的Role访问。并且由于Windows Azure数据中心内部的网络传输速度极快,所以可以通过Internal Endpoint和NET.TCP实现Role之间的高速通信。下面就基于刚才的例子来介绍如何通过Internal Endpoint调用另外一个Role中的WCF服务。

  为了演示方便,我们将此前EchoService中服务器端添加日期的功能分离到另外一个WCF Service中,让现在的EchoService调用这个新的服务来获取当前的系统日期。在Windows Azure项目中加入一个新的Worker Role,并且添加一个新的Class Library项目来包含WCF契约。将这个新服务命名为TimeService。

  客户端通过Hosted Service URL访问Echo Service的Input Endpoint,然后Echo Service通过Time Service的Internal Endpoint调用日期服务来获取日期,最后Echo Service将日期等信息附加返回给客户端。为了演示内部调用的结果,在Time Service的返回值中还可以附加执行此请求的Time Service所侦听的地址和Role Instance ID,WCF契约部分的代码如下所示。

复制代码
[ServiceContract]
public interface ITimeService
{
[OperationContract]
Time GetTime();
}


[DataContract]
public class Time
{
[DataMember]
public DateTime Value {get;set;}
[DataMember]
public string IPendpoint {get;set;}
[DataMember]
public string RoleInstanceID {get;set;}
}
复制代码

接下来改造服务端代码,使Echo Service通过内部端口调用Time Service,如下图。首先在Endpoint页面为Time Service添加一个Internal Endpoint,选择TCP类型。当用户选择了Internal Endpoint的时候便无法指定其对外端口号。而对于内部端口(Private Port)用户可以在这个界面指定某个或某几个端口,如果不指定那么Windows Azure平台会在Role启动的时候随即分配一个。而对于动态端口,开发人员在代码中可以通过RoleEnvironment类的相关方法得到具体的端口号。

  接下来实现Time Service的具体逻辑。为了测试需要,在返回当前系统日期的同时,还将刚才设定的Internal Endpoint的地址以及Role Instance ID一并返回。

复制代码
public class TimeService : ITimerService
{
public Time GetTime()
{
var date = DateTime.Now;
var endpoint=RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TimeEndpoint"].IPEdpoint;
var instanceId=RoleEnvironment.CurrentRoleInstance.Id;
return new Time()
{
Value=date,
IPEndpoint=endpoint.ToString(),
RoleInstanceID=instanceId
};
}
}
复制代码

 

  然后再Worker Role中寄宿服务。由于现在是通过端口号不固定的Internal Endpoint发布,因此只能通过代码方式进行配置。

  最后修改Echo Service的实现,调用Time Service来获取系统时间。同样由于Time Service的Internal Endpoint是动态的,并且Time Service也可能有多个Instance,所以在调用的时候需要通过RoleEnvironment类的InstanceEndpoints属性指定Internal Endpoint的名字来获取具体的地址,同时还需要随机分配链接的Tier Service Role Instance来实现一个小的负载均衡操作。代码如下

复制代码
public string Echo(string content)
{
//retrive all endpoints belongs to the time service role
var endpoints= RoleEnvironment.Roles["TimeService.Service"].Instances
.Select(instance => instance.InstanceEndpoints["TimeEndpoint"])
.ToList();
//random select a time service instance to connect to simulate the load balance
var endpoint = endpoints[_rnd.Next(0,endpoints.Count)];
}
复制代码

  在代码中可以看到,程序通过RoleEnvironment的Roles属性获取其Time Service Role的信息,然后针对这个Role的所有Instance获取Internal Endpoint地址并保存在一个列表中。随后,随机得选择一个Instance的Endpoint作为这次调用的地址。

  下面基于这个随机地址通过ChannelFactory得到代理类,进而调用Time Service,代码如下:

复制代码
public string Echo(string content)
{
//retrive all endpoints belongs to the time service role
var endpoints = RoleEnvironment.Roles["TimeService.Service"].Instance
.Select(instance => instance.InstanceEndpoints["TimeEndpoint"]
.ToList();
//random select a time service instance to connect to simulate the load balance
var endpoint = endpoints[_rnd.Next(0,endpoints.Count)];
//create the channel factory and proxy to comunicate
var factory = new ChannelFactory<ITimeService>(new NetTcpBinding (SecurityMode.None));
var proxy = factory.CreateChannel(new EndpointAddress(string.Format(""net.tcp://{0}
/TimeService",endpoint.IPEndpoint)));
Time result = null;
using (proxy as IDisposable)
{
result = proxy.GetTime();
}
}
复制代码

  最后,将获得的时间连同附加信息返回给客户端。这样客户端得到的结果就可以显示这个Echo Service在执行的时候是通过哪个内部Endpoints访问哪个Instance的Time Service。

  我们将Time Service的Role Instance数目指定为3,然后将其发布到Windows Azure平台。可以看到Echo Service指定的Input Endpoint,而所有的Internal Point都不会对外暴露。

  总结:

  Windows Azure Hosted Service为开发人员提供了Endpoint的配置机制。按照作用于可以分为Input Endpoint和Internal Endpoint,按照协议可以分为HTTP和TCP。我们可以通过指定Endpoint让Role Instance开发特定的端口,对外或对内发布服务。

  Role之间的协同合作不仅仅可以通过之前介绍的Queue Storage来完成,也可以通过Internal Endpoint和TCP协议来完成。但相比Queue Storage来讲,使用Internal Endpoint的方式虽然不能实现对于瞬间大负载的吸收,但是却可以保证调用的高效性和及时性,所以也是一种非常有用的Role间调用方式。

  

本文摘自:徐子岩著的《实战Windows Azure 微软云计算平台技术详解》 电子工业出版社

  
 


本文转自Lei Zhang的博客博客园博客,原文链接http://www.cnblogs.com/threestone/archive/2012/03/05/2379395.html :http,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
89 32
|
2月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
53 11
|
5月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
20天前
|
安全 关系型数据库 MySQL
Windows Server 安装 MySQL 8.0 详细指南
安装 MySQL 需要谨慎,特别注意安全配置和权限管理。根据实际业务需求调整配置,确保数据库的性能和安全。
109 9
|
2月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
147 4
|
2月前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
|
2月前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
120 3
|
2月前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
3月前
|
边缘计算 安全 网络安全
|
3月前
|
数据安全/隐私保护 Windows
安装 Windows Server 2019
安装 Windows Server 2019