Nginx集群之WCF分散式區域網應用

来源:http://www.cnblogs.com/yongfeng/archive/2017/11/17/7851039.html
-Advertisement-
Play Games

關於WCF即可以寄宿於IIS,也可以自我寄宿,本文采用的是自我寄宿方式。之所以採用自我寄宿方式,很大程度上,在一些特殊的場景,例如下載大文件(如幾百MB、1G等)、圖片、文檔等,如果以IIS為宿主,可能會產生記憶體不夠用。所以這裡採用自我寄宿的方式為例子。WCF是由微軟開發的一系列支持數據通信的應用程... ...


目錄

1       大概思路... 1

2       Nginx集群WCF分散式區域網結構圖... 1

3       關於WCF的BasicHttpBinding. 1

4       編寫WCF服務、客戶端程式... 2

5       URL保留項... 6

6       部署WCF服務程式到區域網內3台PC機... 7

7       Nginx集群配置搭建... 8

8       啟動WCF客戶端程式... 10

9       總結... 11

1       大概思路

l  Nginx集群WCF分散式區域網結構圖

l  關於WCF的BasicHttpBinding

l  編寫WCF服務、客戶端程式

l  URL保留項

l  部署WCF服務程式到區域網內3台PC機

l  Nginx集群配置搭建

l  啟動WCF客戶端程式

l  總結

2       Nginx集群WCF分散式區域網結構圖

關於WCF即可以寄宿於IIS,也可以自我寄宿,本文采用的是自我寄宿方式。之所以採用自我寄宿方式,很大程度上,在一些特殊的場景,例如下載大文件(如幾百MB、1G等)、圖片、文檔等,如果以IIS為宿主,可能會產生記憶體不夠用。所以這裡採用自我寄宿的方式為例子。

Nginx集群除了在反向代理可以應用到,在WCF的處理上,也有很好的表現。以下是Nginx集群在WCF分散式的設計結構圖:

3       關於WCF的BasicHttpBinding

首先瞭解系統預定義綁定對不同安全模式的支持,具體參照以下該文:

[WCF安全系列]綁定、安全模式與客戶端憑證類型:總結篇

https://www.cnblogs.com/artech/archive/2011/05/28/Authentication_034.html

  •   所有的綁定都可以不採用任何的安全傳輸機制,即支持None安全模式;
  •   BasicHttpBinding的預設模式為None,WS相關的綁定預設模式為Message,而區域網相關綁定的模式模式為Transport;
  •   除了NetNamedPipeBinding,所有的綁定都支持Message安全模式;
  •   對於所有支持Message模式的綁定,除了NetMsmqBinding都支持Mixed模式;
  •   除了WSDualHttpBinding,所有的綁定都支持Transport模式;
  •   只有BasicHttpBinding支持TransportCredentialOnly模式;
  •   只有NetMsmqBinding支持Both安全模式。

 這裡WCF的Ningx集群,主要用的是BasicHttpBinding。表示一個綁定,Windows Communication Foundation (WCF) 服務可以使用此綁定配置和公開這樣的終結點:這些終結點能夠與基於 ASMX 的 Web 服務和客戶端以及符合 WS-I Basic Profile 1.1 標準的其他服務進行通信。

4       編寫WCF服務、客戶端程式

l  解決方案的主要目錄如下:

l  WCF服務程式

IOutputSomething.cs

using System.ServiceModel;

namespace Service.Interface
{
    [ServiceContract]
    public interface IOutputSomething
    {
        [OperationContract]
        string GetContentData(int i);

        [OperationContract]
        string GetIpAddress();
    }
}

OutputSomething.cs

using Service.Interface;
using System.Net;
using System.ServiceModel;

namespace Service
{
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class OutputSomething : IOutputSomething
    {
        /// <summary>
        /// 名稱
        /// </summary>
        string threadNumber;

        readonly object thisLocak = new object();
        public string GetContentData(int i)
        {
            lock (thisLocak)
            {
                
                threadNumber = i.ToString() + " - " + "我是主機:" + GetIpAddress();
            }
            return string.Format("序列號{0},線程號{1}", i, threadNumber);
        }

        public string GetIpAddress()
        {
            string AddressIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP = _IPAddress.ToString();
                }
            }
            return AddressIP;
        }
    }
}

Program.cs

using Service;
using System;
using System.ServiceModel;

namespace HighlyConcurrentHosting
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(OutputSomething)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine(host.Description.Endpoints[0].Address.Uri + "已經啟動,按任意鍵終止服務!");
                };

                host.Open();
                Console.Read();
            }
        }
    }
}

l  客戶端程式

Program.cs

using HighlyConcurrentClient.HighlyConcurrentService;
using System;
using System.Net;

namespace HighlyConcurrentClient
{
    class Program
    {
        static void Main(string[] args)
        {

            string AddressIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP = _IPAddress.ToString();
                }
            }
            Console.WriteLine("本機IP是:" + AddressIP);
            using (OutputSomethingClient proxy = new OutputSomethingClient())
            {
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine(proxy.GetContentData(i));
                }
            }
            Console.Read();
        }
    }
}

 

客戶端添加服務引用後,Address可能是某一臺PC機的IP地址(例如:address="http:// 10.92.202.56:5600/OutputSomething")這是需要修改為以下Nginx的地址

address="http://zhyongfeng.com/OutputSomething",配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IOutputSomething" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://zhyongfeng.com/OutputSomething"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IOutputSomething"
                contract="HighlyConcurrentService.IOutputSomething" name="BasicHttpBinding_IOutputSomething" />
        </client>
    </system.serviceModel>
</configuration>

即如圖所示:

5       URL保留項

在預設的操作系統配置中,Windows Communication Foundation (WCF) 為埠 80 創建可全局訪問的保留項,使所有用戶都能夠運行應用程式,在該應用程式中使用雙向 HTTP 綁定來進行雙工通信。

返回了:

“System.ServiceModel.AddressAccessDeniedException”類型的未經處理的異常在 System.ServiceModel.dll 中發生 

其他信息: HTTP 無法註冊 URL http://+:5600/OutputSomething/。進程不具有此命名空間的訪問許可權(有關詳細信息,請參見 http://go.microsoft.com/fwlink/?LinkId=70353)。

以管理員方式運行C:\windows\System32\cmd.exe:

netsh http add urlacl url=http://+:5600/ user="\Everyone"
netsh http add iplisten ipaddress=0.0.0.0:5600
防火牆的入站規則:
netsh advfirewall firewall add rule name="5600埠" dir=in action=allow protocol=TCP localport=5600
url保留項刪除
netsh http delete urlacl url=http://+:5600/
url保留項顯示
netsh http show urlacl

這裡主要使用如下添加URL保留項即可:

netsh http add urlacl url=http://+:5600/ user="\Everyone"

 

6       部署WCF服務程式到區域網內3台PC機

遠程進行部署WCF服務程式時,需要將它的config配置文件,重新定位address,將預設的IP地址127.0.0.1:5600修改為遠程電腦的IP地址:

10.92.202.56:5600、10.92.202.57:5700、10.92.202.58:5800

然後啟動遠程電腦的WCF服務程式,運行效果如下:

本機IE上訪問WCF服務端的運行效果:

7       Nginx集群配置搭建

通過自主義功能變數名稱zhyongfeng.com:80埠進行負載均衡集群訪問,則訪問C:\Windows\System32\drivers\etc\hosts,添加下列“本機IP 自定義的功能變數名稱”:

10.93.85.66     zhyongfeng.com

針對WCF部署的多台PC機配置(設置了proxy_connect_timeout為10s,如果其中一臺機down掉了,可以轉發到另一臺機器)如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream zhyongfeng.com {
        server    10.92.202.56:5600;
        server    10.92.202.57:5700; 
        server    10.92.202.58:5800;
    }
    server {
        listen       80;
        server_name  zhyongfeng.com;
        location / {
            proxy_pass   http://zhyongfeng.com;
            proxy_connect_timeout       10s;
        } 
    }
}

運行CMD:

D:\DTLDownLoads\nginx-1.10.2>start nginx

D:\DTLDownLoads\nginx-1.10.2>nginx -s reload

訪問WCF服務端:http://zhyongfeng.com/OutputSomething/metadata,運行結果:

8       啟動WCF客戶端程式

啟動WCF客戶端程式,運行效果圖如下:

遠程桌面關掉其中一臺10.92.202.56:5600的PC機:

重新啟動WCF客戶端程式,因為Nginx配置文件設置了proxy_connect_timeout為10s,則關閉的PC機10.92.202.56:5600在10s後會將它的消息轉發給10.92.202.57:5700,繼續由其它2台PC機執行:

9       總結

WCF是由微軟開發的一系列支持數據通信的應用程式框架,通過開源框架Nginx的結合,能夠有更多的擴展性。Nginx結合WCF對區域網內的佈局有很大關係,通過WCF整合報表伺服器、郵件伺服器、文檔伺服器等,WCF原來就整合了原有的windows通訊的 .net Remoting,WebService,Socket的機制,Nginx讓具備分散式功能的WCF更加強大了。

源代碼下載:

http://download.csdn.net/download/ruby_matlab/10122670

PDF下載:

Nginx集群之WCF分散式區域網應用.pdf


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 總項目流程圖,詳見http://www.cnblogs.com/along21/p/7435612.html 實驗一:實現反向代理負載均衡且動靜分離 1、環境準備: 機器名稱 IP配置 服務角色 備註 nginx VIP:172.17.11.11 反向代理伺服器 開啟代理功能 設置監控,調度 rs0 ...
  • 一.序言 本資料是Trevor Martin編寫的《The Designers Guide to the Cortex-M Processor Family》的摘要,並得到Elsevier的再版許可。查詢更多細節,請到本資料尾部進階章節。 本資料著力於介紹RTX,RTX可運行在基於Cortex-M構 ...
  • 背景: 一段明顯的字元串,可能潛伏著看不見 的 幽靈字元。 某些字元 比較常見、常用,比如: \r \n \t 但是,有些 幽靈字元(保守估計 >200~1000個),不僅不常見,而且基本沒價值。 這些幽靈字元,潛伏在 正常字元串中,有的偽裝成空格符,有的直接隱形。 當你要 處理字元串時,這些幽靈字 ...
  • 在使用由Angular,React,Vue等應用程式框架構建的客戶端應用程式時,您總是會處理HTML5客戶端路由,它將完全在瀏覽器中處理到頁面和組件的客戶端路由。幾乎完全在瀏覽器中... HTML5客戶端路由在客戶端上工作的很好,但是當深入鏈接到一個站點或在瀏覽器中按刷新時,客戶端路由有一個惡習,變 ...
  • DEV控制項GridControl和TreeList的數據導出操作 ...
  • 學習:C#綜合揭秘——Entity Framework 併發處理詳解 帖子筆記 ,該帖子使用的是objectContext , 一、併發相關概念 併發的類型: 第一種模式稱為悲觀式併發,即當一個用戶已經在修改某條記錄時,系統將拒絕其他用戶同時修改此記錄。第二種模式稱為樂觀式併發,即系統允許多個用戶同... ...
  • Visual Studio 2017是微軟為了配合.NET戰略推出的IDE開發環境,同時也是目前開發C#程式最新的工具,本節以Visual Studio 2017社區版的安裝為例講解具體的安裝步驟。 說明:Visual Studio 2017 社區版是完全免費的,其下載地址為:https://www ...
  • 一、簡介 Topshelf可用於創建和管理Windows服務。其優勢在於不需要創建windows服務,創建控制台程式就可以。便於調試。 二、官方地址: 1、官網:http://topshelf-project.com/ 2、官方文檔:https://topshelf.readthedocs.io/e ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...