Windows Azure 之服务总线中继服务
Windows Azure的服務總線允許在Web服務內部與外部之間做成一個公共的連接點,在無需更改企業防火墻或者其他安全配置的情況下連接內部和外部的服務
而使用Azure云服務的時候由于縮放的原因通過IP來制定連接也是不科學的,而中繼服務則可以充當很好的公共連接點(當然一般建議使用更加科學的隊列)
?
在Azure的服務總線中有一個叫中繼服務的東西,是駐留在云端的一個幫助進行輔助連接工作的服務,把客戶端的調用請求通過Azure的中繼服務然后轉發給服務端。
對于無論客戶端還是服務端,中繼服務其實更像就是一個地址,用來表示一個服務,然后大家都連接上同一個地址的話那么就可以交流溝通。
?
一般企業應用都會有防火墻,而企業對外提供服務的時候通常會受到防火墻的限制而不得不對防火墻做額外配置。
?
有了服務總線,則可以無需額外配置防火墻就能正常發布企業應用了。
任何模式下的中繼服務,在其他模式無法使用的時候最終都會嘗試使用80跟443端口進行連接,而一般的企業防火墻是不會封住這2個端口的(企業總要上網吧)
?
創建中繼服務很簡單,基本等效于創建服務總線,因為中繼服務不能單獨創建只能以編程的方式創建
創建服務總線可以在Azure門戶那
點擊 添加 然后輸入命名空間,命名空間可用(沒被注冊那個名字)然后選擇地區和訂閱,在確定即創建了服務總線
創建之后
點擊下方的 連接信息
然后找到默認頒發者和默認密鑰
這個是日后連接到該服務總線的憑據,需記錄下保存好。。。
?
?
下面粗略的演示下如何使用服務總線
?
以下以基于WCF為例演示如何使用服務總線進行編程
服務總線可以在Microsoft.ServiceBus.dll的程序集里找到,絕大部分的類型存在于 Microsoft.ServiceBus命名空間下。
(可在VS的引用Nuget包那找到最新版)
之后了解下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的門戶里查看到相關的信息
此處沒有任何連接信息,如果連接上了的話這里就會有對應的信息
轉載于:https://blog.51cto.com/virtualcca/1290246
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Windows Azure 之服务总线中继服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连续几天梦到死去的人
- 下一篇: Windows窗口样式