构建混合应用方式之 - Azure混合连接
前面介绍了通过WCF中继构建混合应用的方式,由于对WCF的依赖,使得其使用有一定的局限性,基本上只适用于本地服务是WCF的.NET应用。而混合连接则弥补了这一块的缺陷,除了支持原有WCF中继的功能之外,还提供了多平台多语言的支持,这只要是因为混合连接是基于开放标准协议web sockets实现的。
以下是与WCF中继的一个对比表:
WCF中继 | 混合连接 | |
建立本地和云之间的安全连接 | √ | √ |
无需修改防火墙添加入站端口 | √ | √ |
无需对网络配置做重大修改 | √ | √ |
基于开放标准协议 | Χ(只支持WCF) | √ |
跨平台支持 | Χ(只支持Windows) | √ |
多语言支持 | Χ(只支持.NET) | √ |
下面主要分三种情况来介绍混合连接的使用:
一. 基于混合连接SDK
创建混合连接
可以登陆Azure中国门户网站,按照界面提示一步步创建。也可以通过PowerShell命令,如下。
# login to Azure China with your account
Login-AzureRmAccount -Environment AzureChinaCloud $rgName = "relaydemorg"
$namespaceName = "relaydemons"
$location = "China East"
$hcName = "hcdemo" New-AzureRmResourceGroup -Name $rgName -Location $location
New-AzureRmRelayNamespace -ResourceGroupName $rgName -Name $namespaceName -Location $location
New-AzureRmRelayHybridConnection -Namespace $namespaceName -ResourceGroupName $rgName -Name $hcName -RequiresClientAuthorization $true
创建出来混合连接字符串就是sb://relaydemons.servicebus.chinacloudapi.cn/hcdemo
基于混合连接SDK
目前微软官方提供了两个SDK,一个是.NET语言版本,另一个是Node.JS版本。两个SDK也都开源在Github上:azure-relay-net,azure-relay-node。
本地服务(监听者)
首先本地服务端作为监听者,需要要使用具有监听权限的连接字符串,创建一个出站的WebSocket连接,也就是注册到Azure中继服务上。如果本地有多个监听者,那么进入的访问请求会随机地发送。一个混合连接最多支持25个监听者。
private const string ConnectionString = "connection string with listen permission";
// Listen
var listener = new HybridConnectionListener(ConnectionString);
await listener.OpenAsync();
// Accept
HybridConnectionStream relayConnection = await listener.AcceptConnectionAsync();
// Read
var reader = new StreamReader(relayConnection);
var line = await reader.ReadLineAsync();
// Output
Console.WriteLine(line);
// Close
await relayConnection.CloseAsync(CancellationToken.None);
外部服务(发送者)
发送者提供具有发送权限的连接字符串(不是必须如果建立混合连接时没有要求客户端认证,不过从安全角度考虑,推荐要求认证),与混合连接服务建立WebSocket连接,最终会与一个监听者建立起连接,从而进行沟通。
private const string ConnectionString = "connection string with send permission";
// Connect
var client = new HybridConnectionClient(ConnectionString);
HybridConnectionStream relayConnection = await client.CreateConnectionAsync();
// Write
var writer = new StreamWriter(relayConnection) { AutoFlush = true };
await writer.WriteLineAsync("hello from outside");
// Close
await relayConnection.CloseAsync(CancellationToken.None);
当然,因为搭建的WebSocket是双向通道,所以本地服务端也可以发送消息到外部服务端的。
连接字符串
前面提到需要用到不同权限的连接字符串,总共有三种权限管理,监听和发送,可以根据需要创建不同权限搭配的安全访问策略,然后在它的具体界面里会自动生成相应的连接字符串,直接复制使用即可,如下图。
如果本地服务不能或者不希望被修改成调用SDK,比如云端Web App调用本地的Web Api或者SQL数据库,那该如何使用混合连接呢?Azure Web App已经整合里混合连接,可以很方便的配置,而不需要对本地服务做任何修改。
完整代码示例可查看我的Github。
基于Azure Web App混合连接工具
目前Azure中国还没有支持混合连接的整合,不过已经在路上了,应该会很快就可上线。以下用Azure全球来演示,最终Azure中国也会是同样的体验。
配置混合连接端节点
登陆azure门户网站,找到你的web app,在设置下面点击网络,在展开的页面中点击“配置你的混合连接端节点”,打开页面如下:
点击“下载连接管理工具”下载,后面会用到。
点击“添加混合连接”,在打开的页面里面点击添加,如下图。填入相应信息,其中名称可以自定义,而端节点主机必须是运行你本地服务的机器名称,端节点端口也是本地服务所在端口。命名空间选择前面已经创建好的,也可以这里创建新的。
创建完成后,把前面下载的连接管理工具安装在运行本地服务的机器上。然后打开混合连接管理工具,点击“Configure another Hybrid Connection”,这个时候会弹出登陆框,输入你的azure订阅账户登陆后,会显示当前订阅中已有的混合连接,如下图。
选择配置了正确端节点的混合连接,然后点击“Save”保存。这个混合连接就会将本地与云端web app建立起连接,状态显示为”Connected”。
这样,在web app里面就可以通过”端节点名称:端口“的方式来访问本地的服务了。比如我这里演示的,我在本地运行了一个web api服务(api/values)在16782端口,返回字符串”value from on-premises <本地机器名称>”,然后通过混合连接,云端web app就可以很简单的访问本地服务了,代码如下:
using (var httpClient = new HttpClient())
{
var onPremSvcUri = "http://mc-allenl-01:16782/api/values";
using (var response2 = httpClient.GetAsync(onPremSvcUri).Result)
{
if (response2.IsSuccessStatusCode)
{
ViewBag.Message = $"{response2.Content.ReadAsStringAsync().Result}";
}
}
}
结果:
对于其他本地服务,比如SQL服务,也可以用同样的方式连接。
基于PortBridge示例程序
如果外部服务不是用Azure Web App,又该如何使用混合连接呢?可以通过混合连接来实现端口转发,从而建立连接通道。微软官方示例PortBridge正是演示了这种功能。接下来,我们用它来演示在云端虚拟机中的web应用调用本地web api。
创建以本地服务所运行的机器为名称的混合连接(演示名称mc-allenl-01),如何创建请参照文章最开始的PowerShell命令。并分别创建发送和监听权限的共享访问策略。
将PortBridge下载并编译,修改PortBridgeServerAgent.exe.config文件中portBridge相关配置,其中targetHost配置成本地服务所运行的机器名称,端口则为本地服务所在端口,本示例配置如下。然后将整个文件夹复制到本地服务所运行的机器上,并双击PortBridgeServerAgent.exe运行。
<portBridge serviceBusNamespace="allenlrelaydemo.servicebus.chinacloudapi.cn" serviceBusAccessRuleName="listen" serviceBusAccessRuleKey="******">
<hostMappings>
<add targetHost="mc-allenl-01" allowedPorts="16785"/>
</hostMappings>
</portBridge>
修改PortBridgeClientAgent.exe.config文件中portBridgeAgent的相关配置,其中targetHost设置成本地服务所运行的机器名称,localTcpPort设为你期望使用访问的端口,remoteTcpPort则为本地服务所运行的端口,本示例配置如下。将整个文件夹复制到Azure虚拟机中,并双击PortBridgeClientAgent.exe运行。
<portBridgeAgent serviceBusNamespace="allenlrelaydemo.servicebus.chinacloudapi.cn" serviceBusAccessRuleName="send" serviceBusAccessRuleKey="******">
<portMappings>
<port localTcpPort="81" targetHost="mc-allenl-01" remoteTcpPort="16782">
<firewallRules>
<rule source="127.0.0.1"/>
<rule sourceRangeBegin="10.0.0.0" sourceRangeEnd="10.255.255.255"/>
</firewallRules>
</port>
</portMappings>
</portBridgeAgent>
在Azure虚拟机中访问http://localhost:81/api/values,没有运行PortBridge之前是会失败的,但开启PortBridge,也就是通过混合连接建立通道之后,就会访问成功,如下所示:
构建混合应用方式之 - Azure混合连接的更多相关文章
- 构建混合云:配置Azure site to site VPN连接(2)
那么接下来的部分,我们开始正式配置S2S VPN: 首先配置本地网络,什么是本地网络呢?如果你在Azure上配置,本地网络意思是你自己的数据中心需要和Azure进行连接的网络段,而不是Azure上的网 ...
- Windows Azure HandBook (5) Azure混合云解决方案
<Windows Azure Platform 系列文章目录> 在很多情况下,我们都会遇到本地私有云和公有云做互通互联的混合云场景.对于这种混合云的场景,微软的Windows Azure会 ...
- 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(下)
相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 作为微软Azure上最新 ...
- ssh方式与服务器建立连接
package com.ustcinfo.cinas.pmng.util; import java.io.BufferedReader; import java.io.InputStream; imp ...
- ORACLE 分页 java 用jdbc方式以 sys账号连接oracle数据的问题
2,3,4,6,8 betwenen 为闭区间,前后都包括 select * from(select a.*,rownum rn from (select * from student) a ) ...
- 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(中)
引言 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 因此数据湖相关服务 ...
- itms-services 方式安装ipa 无法连接到网址(eg. 我用的ip:172.26.167.82)
itms-services 方式安装ipa 无法连接到网址(eg. 我用的ip:172.26.167.82) 可能原因:1. ios没有信任自签名ssl证书2. plist文件返回错误,或者说是没有成 ...
- 构建混合云:配置Azure site to site VPN连接(1)
用户在构建自己云计算解决方案的时候,往往会选择私有云或者公有云来做部署,但在一些场景下,用户更加希望通过混合云的方案来满足自己的业务需求.Azure为混合云的部署提供多种不同的连接方案,最常见的是 ...
- 构建混合云:配置Azure site to site VPN连接(3)
9. 那么我们来创建网关,创建网关的时候需要注意,看看你的设备是否支持动态网关,在本示例中的Cisco ASA 5550不支持动态网关,所以我们只能创建静态网关: 该创建会花费一定的时间,稍等即可. ...
随机推荐
- php回调函数的使用
1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...
- 每天一道Java题[11]
题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...
- springcloud(九):配置中心和消息总线(配置中心终结版)
我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...
- 【小练习02】CSS--网易产品
要求用css和HTML实现下图效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- jsp+servlet实现模糊查询和分页效果
---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...
- 基于谱聚类的三维网格分割算法(Spectral Clustering)
谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...
- C# 中文在URL中的编码
UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节. 不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节. //按照UTF-8进行编码 string tempSearc ...
- 基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法。
因未测试其他作者的算法时间和效率,本文不敢自称是最快的,但是速度也可以肯定说是相当快的,在一台I5机器上占用单核的资源处理 3000 * 2000的灰度数据用时约 20ms,并且算法和核心的大小是无关 ...
- C#的命名管道(named pipe)
命名管道是一种从一个进程到另一个进程用内核对象来进行信息传输.和一般的管道不同,命名管道可以被不同进程以不同的方式方法调用(可以跨权限.跨语言.跨平台).只要程序知道命名管道的名字,发送到命名管道里的 ...
- java中的注解总结
1. 什么是注解 注解是java5引入的特性,在代码中插入一种注释化的信息,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.注解也叫元数据(meta data).这些注解信 ...