Windows Azure 之服務總線中繼服務

Windows Azure的服務總線允許在Web服務內部與外部之間做成一個公共的連接點,在無需更改企業防火牆或者其他安全配置的情況下連接內部和外部的服務

而使用Azure雲服務的時候由於縮放的原因通過IP來制定連接也是不科學的,而中繼服務則可以充當很好的公共連接點(當然一般建議使用更加科學的隊列)

 

在Azure的服務總線中有一個叫中繼服務的東西,是駐留在雲端的一個幫助進行輔助連接工作的服務,把客戶端的調用請求通過Azure的中繼服務然後轉發給服務端。

對於無論客戶端還是服務端,中繼服務其實更像就是一個地址,用來表示一個服務,然後大家都連接上同一個地址的話那麼就可以交流溝通。

 

image

一般企業應用都會有防火牆,而企業對外提供服務的時候通常會受到防火牆的限制而不得不對防火牆做額外配置。

 

有了服務總線,則可以無需額外配置防火牆就能正常發佈企業應用了。

任何模式下的中繼服務,在其他模式無法使用的時候最終都會嘗試使用80跟443端口進行連接,而一般的企業防火牆是不會封住這2個端口的(企業總要上網吧)

 

創建中繼服務很簡單,基本等效於創建服務總線,因爲中繼服務不能單獨創建只能以編程的方式創建

創建服務總線可以在Azure門戶那

image

點擊 添加 然後輸入命名空間,命名空間可用(沒被註冊那個名字)然後選擇地區和訂閱,在確定即創建了服務總線

創建之後

image

點擊下方的 連接信息

然後找到默認頒發者和默認密鑰

這個是日後連接到該服務總線的憑據,需記錄下保存好。。。

 

 

下面粗略的演示下如何使用服務總線

 

以下以基於WCF爲例演示如何使用服務總線進行編程

服務總線可以在Microsoft.ServiceBus.dll的程序集裏找到,絕大部分的類型存在於 Microsoft.ServiceBus命名空間下。

(可在VS的引用Nuget包那找到最新版)

image

之後瞭解下WCF在中繼服務那不是用正統的諸如wshttpbinding或者nettcpbinding一類的,而是使用了中繼服務特製版的綁定。

但是中繼服務很好的兼容了WCF原有的編程架構,其特製的綁定類型基本就是原本的類型後面加個relay

比如 NetTcpRelayBinding,WS2007HttpRelayBinding 等,同時也有幾個中繼服務特有的綁定比如 NetOnewayRelayBinding和NetEventRelayBinding等

 

使用中繼服務的編程基本跟普通的WCF編程模型大部分是一樣的

但也有幾點不同,連接服務總線的時候先要使用前文所說的頒發者和頒發者密鑰作爲連接服務總線的信息(總要知道你連接的是哪一條服務總線把?)

//定義了一個TransportClientEndpointBehavior類型的RelayCredentials屬性
string ownner = "ServiceBus.Issuer";
string token = "ServiceBus.IssuerToken";
//ServiceBus的令牌優先檢查Azure的配置文件,如果沒有讀取本地的App.config(用於本地調試)
try
{
    this.issuer = RoleEnvironment.GetConfigurationSettingValue(ownner);
    this.issuertoken = RoleEnvironment.GetConfigurationSettingValue(token);
}
catch
{
    this.issuer = ConfigurationManager.AppSettings[ownner];
    this.issuertoken = ConfigurationManager.AppSettings[token];
}
RelayCredentials = new TransportClientEndpointBehavior(); //配置服務總線共享密鑰
RelayCredentials.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(issuer, issuertoken);

 

由於很多使用中繼服務是放在雲服務上用的,所以個人一般用法是先在Role的配置文件裏(cscfg)讀取,如果不是雲服務環境則會引發異常然後在catch裏讀取本地配置文件(app.config或者web.config)

讀取成功了就把值通過TokenProvider.CreateSharedSecretTokenProvider(issuer, issuertoken)賦給RelayCredentials.TokenProvider

注意,這裏的RelayCredentials是一個EndpointBehavior

 

有了這個之後就可以大部分的跟正常WCF一樣進行編程了

 //生成ServiceHost
//ServiceInstanc是假定的服務實例
ServiceHost sh = new ServiceHost(typeof(ServiceInstance));
//服務總線的URI
//注意,除了http和https之外的所有其他協議都用sb類型
//比如net.tcp之類的都必須使用sb開頭的
//三個參數分別是 協議 命名空間 服務名
//命名空間需跟申請服務總線的那個命名空間一致
Uri address = ServiceBusEnvironment.CreateServiceUri("sb", servicenNamespace, serviceName); 
//終結點添加到ServiceHost
//使用NettcpRelayBinding
//ServiceContract是假定的服務契約
sh.AddServiceEndpoint(typeof(ServiceContract), new NettcpRelayBinding(), address);
//所有終結點添加服務總線令牌
foreach (var endpoint in sh.Description.Endpoints) 
{
    endpoint.EndpointBehaviors.Add(RelayCredentials); //上部分中獲得的服務令牌的那個Endpoint
} //在此用foreach有點兒畫蛇添足,但假如終結點多的話可以通過這種方式來添加
sh.Open();//啓動服務

 

 

一旦服務總線啓動成功並且連接上了中繼服務,那麼就可以在Azure的門戶裏查看到相關的信息

image

此處沒有任何連接信息,如果連接上了的話這裏就會有對應的信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章