5588葡京线路Nginx集群之WCF大文件上传及下载(支持6G传)

假定说2017年的重庆

目录

因为同一篇《火锅底料》启动开挂模式

1       大概思路… 1

那么2018年开挂的重庆通达

2       Nginx集群之WCF大文件上传及下载… 1

用改变在重庆口之生活

3       BasicHttpBinding相关配置解析… 2

路桥通行费

4       编写WCF服务、客户端程序… 3

2018年1月1日零时由

5       URL保留项… 8

取消征重庆主城区路桥通行费

6       部署WCF服务程序到局域网内1华PC机… 8

轨道交通5号线(1期北段)

7       Nginx集群配置搭建… 9

2017年12月28日轨道5号线

8       WCF客户端程序的周转结果… 11

(1期北段共17公里)开通试运营

9       总结… 13

于为园博中心站止于大龙山站

 

沿途设9座车站:园博中心立—丹鹤站

1       大概思路

l  Nginx集群之WCF大文件及传及下载

l  BasicHttpBinding相关配置分析

transferMode、messageEncoding、maxReceivedMessageSize、receiveTimeout、sendTimeout

l  编写WCF服务、客户端程序

l  URL保留项

l  部署WCF服务程序到局域网外1雅PC机

l  Nginx集群配置搭建

l  WCF客户端程序的运行结果

l  总结

—湖霞街站—重光站—和睦路站

2       Nginx集群之WCF大文件及传及下载

Nginx的配合规则,很容易帮助我们分WCF服务的网段,从而实现公司数量信息体系多区域分,如有些数目的微服务、传输数据文件的劳动、即经常通信服务、或者邮件服务,相当给构建了扳平修企业中信息化的数目总线(DataBus)。

以下是本文讲述的机要组织图:

客户端以BasicHttpBinding访问Nginx的域名zhyongfeng.com/fileupload,然后Nginx进行负荷均衡,将消息分发至后端任意一贵WCF上传下载服务器的PC机,然后进行上传文件及“冷数据”处,又从“冷数据”处下充斥文件。

本着“冷数据”可以划分目录,建立独立的FTP服务器和WCF服务器,进行操作处理。如下图所示:

以下是WCF上传下载服务器的架:

 

—人同站—幸福广场站

3       BasicHttpBinding相关配置分析

basicHttpBinding相关配置,具体参考:

https://msdn.microsoft.com/zh-cn/library/system.servicemodel.basichttpbinding.aspx

以下是根本采用到之布局

transferMode

获取或设置一个值,该值指示是通过缓冲处理还是流处理来发送消息。(继承自 HttpBindingBase。)

messageEncoding

获取或设置是使用 MTOM 还是文本对 SOAP 消息进行编码。

maxReceivedMessageSize

获取或设置最大大小,以字节为单位,可以使用此绑定配置的通道上接收的消息。(继承自 HttpBindingBase。)

receiveTimeout

获取或设置连接在撤消之前保持非活动状态的最大时间间隔,在此时间间隔内未接收任何应用程序消息。(继承自 Binding。)

sendTimeout

获取或设置在传输引发异常之前可用于完成写入操作的时间间隔。(继承自 Binding。)

 

本着MTOM编码和异步调用的特性改善,可以参见论文:

《应用MTOM编码和异步调用改进流传输的性能.pdf》

 

冉家坝站—大龙山站

4       编写WCF服务、客户端程序

l  WCF服务程序

Program.cs

using System.ServiceModel;
using Service;
using System;

namespace FileTransferHosting
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(FileTransferOperation)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine(host.Description.Endpoints[0].Address.Uri + "已经启动,按任意键终止服务!");
                };

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

FileTransferOperation.cs

using Service.Interface;
using System;
using System.IO;
using System.ServiceModel;

namespace Service
{
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class FileTransferOperation : IFileTransferOperation
    {
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="remoteFile"></param>
        public void UploadLoad(RemoteFileInfo remoteFile)
        {
            StreamToFile(remoteFile);
        }

        /// <summary>
        /// 写文件
        /// </summary>
        /// <param name="remoteFile"></param>
        public void StreamToFile(RemoteFileInfo remoteFile)
        {
            string fileFullPath = Path.Combine(System.Environment.CurrentDirectory, remoteFile.FileName);
            Stream sourceStream = remoteFile.FileByteStream;
            if (sourceStream == null) { return; }
            if (!sourceStream.CanRead) { return; }
            //创建文件流,读取流中的数据生成文件
            using (FileStream fs = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                const int bufferLength = 4096;
                byte[] myBuffer = new byte[bufferLength];//数据缓冲区
                int count;
                while ((count = sourceStream.Read(myBuffer, 0, bufferLength)) > 0)
                {
                    fs.Write(myBuffer, 0, count);
                }
                fs.Close();
                sourceStream.Close();
            }
        }

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public Stream DownLoad(string fileName)
        {
            string fileFullPath = Path.Combine(System.Environment.CurrentDirectory, fileName);
            if (!File.Exists(fileFullPath))//判断文件是否存在
            {
                return null;
            }
            try
            {
                Stream myStream = File.OpenRead(fileFullPath);
                return myStream;
            }
            catch { return null; }
        }
    }
}

服务端配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="FileTransferBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="FileTransferdBinding" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="6442450944" transferMode="Streamed"
            messageEncoding="Mtom" />
      </basicHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="FileTransferBehavior" name="Service.FileTransferOperation">
        <endpoint binding="basicHttpBinding" bindingConfiguration="FileTransferdBinding"
            contract="Service.Interface.IFileTransferOperation" />
        <host>
          <baseAddresses>
            <add baseAddress="http://127.0.0.1:5600/fileupload" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

l  客户端程序

Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using FileTransferClient.FileTransferService;

namespace FileTransferClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入文件完整路径:");
            string fullFilePath = Console.ReadLine().Trim();


            using (FileTransferOperationClient proxy=new FileTransferOperationClient())
            {
                DateTime datetime1 = DateTime.Now;
                byte[] buffer = System.IO.File.ReadAllBytes(fullFilePath);
                Stream streamBuffer= new MemoryStream(buffer);
                //上传文件
                proxy.UploadLoad(buffer.Length, System.IO.Path.GetFileName(fullFilePath), streamBuffer);
                OutPutDiffTime(DateTime.Now, datetime1, "上传成功");


                Console.WriteLine("开始下载文件:");
                DateTime datetime2 = DateTime.Now;
                string filename = System.IO.Path.GetFileName(fullFilePath);
                //下载文件
                Stream sourceStream = proxy.DownLoad(filename);
                if (sourceStream == null) { return; }
                if (!sourceStream.CanRead) { return; }
                //创建文件流,读取流中的数据生成文件
                using (FileStream fs = new FileStream(Path.Combine(System.Environment.CurrentDirectory, filename), FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    const int bufferLength = 4096;
                    //数据缓冲区
                    byte[] myBuffer = new byte[bufferLength];
                    int count;
                    while ((count = sourceStream.Read(myBuffer, 0, bufferLength)) > 0)
                    {
                        fs.Write(myBuffer, 0, count);
                    }
                    fs.Close();
                    sourceStream.Close();
                }
                OutPutDiffTime(DateTime.Now, datetime2, "下载成功");
                Console.Read();
            }
        }
        public static void OutPutDiffTime(DateTime datetime2,DateTime datetime1,string mesg)
        {
            TimeSpan ts = (datetime2 - datetime1);
            string dateDiff = ts.Hours.ToString() + "小时"
                    + ts.Minutes.ToString() + "分钟"
                    + ts.Seconds.ToString() + "秒";
            Console.WriteLine(String.Format("花费了{0},{1}", dateDiff, mesg));
        }
    }
}

客户端配置文件(注意这里客户端transferMode=”Streamed”要运用流式数据进行拍卖,并且将endpoint
address改吧” http://zhyongfeng.com/fileupload”):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IFileTransferOperation" receiveTimeout="00:30:00"
          sendTimeout="00:30:00" maxReceivedMessageSize="6442450944" transferMode="Streamed"
          messageEncoding="Mtom" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://zhyongfeng.com/fileupload" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IFileTransferOperation"
        contract="FileTransferService.IFileTransferOperation" name="BasicHttpBinding_IFileTransferOperation" />
    </client>
  </system.serviceModel>
</configuration>

一般来说图所示:

(冉家坝、大龙山全只是易就6如泣如诉线)

5       URL保留项

详见:http://www.cnblogs.com/yongfeng/p/7851039.html

5哀号线平盼全线示意图

6       部署WCF服务程序到局域网外1大PC机

远程部署WCF服务端程序及PC机

首班车07:30、末班车20:30

7       Nginx集群配置搭建

经过自主义域名zhyongfeng.com:80端口进行负荷均衡集群访问,则访问C:\Windows\System32\drivers\etc\hosts,添加下列“本机IP
自定义的域名”:

10.93.85.66    zhyongfeng.com

以Nginx匹配原则对WCF部署的1华PC机配置如下:

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;
        } 
    location /fileupload {
            proxy_pass   http://10.92.202.56:5600/fileupload;
            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/fileupload,运行结果:

车型以了重庆独有的新车型

8        WCF客户端程序的周转结果

起步WCF客户端程序,直接上传Linux的ubuntu系统iso镜像,总大小为1.5G左右,上传时间局域网(服务器线路是10Gpbs)花费7分钟左右,下载时间大约是3分钟。

客户端服务器的网络状况,运行效果使下图:

 

 

车宽度为3米之AS山地A型车

9       总结

Nginx的匹配原则会有效之分红URL,将流式数据分发给相应的劳务处理,并且于局域网内能够支持比较生之上传下载功能。通过BasicHttpBinding的系安排,能够支配流式数据上传大小,同时支持流式数据的下载功能,达到WCF大文件上传及下载的力量。

自,具体的施用场景,还是要整合数据大小要谈话的,这里只是供一个解决方案的参照。

例如有处理视频文件每天还是1TB,处理PB级的特别数据文件,还是建议采取hadoop的HDFS实现比较好。

单,数据大小达若干MB或几乎KB的发票、报表文件,这些文件重大在差不多如非在好,hadoop的MapReduce显然有些大材小用了,可以运用“业务领域-年-月-日”的点子,建立和谐平模仿数据结构存储方。

 

源代码下载:

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

 

PDF下载:

Nginx集群之WCF大文件上传及下载(支持6G传).pdf

正如1、6声泪俱下线运用的B型(2.8米)

增幅、载客量更不行

5号线车厢两侧扶手改吧弧形

车厢中部增加吊环

站还加装空气净化器

轨道交通10如泣如诉线(1期)

2017年12月28日10声泪俱下线始发通试运营

1期全场34公里.共设有19座车站

(试运营期间开通18所)

双鱼池站—红土地站—龙头寺公园站

—重庆北站落败广场站—民心佳园站

—三亚湾站—上湾路站—环山公园立

—长河站—江北飞机场T3航站楼站

—江北飞机场T2航站楼站—渝北广场站

—鹿山站—中央公园东立—中央公园站

—中央公园西站—悦来站—王家庄站

悦来站与6号线国博线换乘

江北机场T2航站楼站及3号线换乘

红土地站与6号线换乘

10声泪俱下线运用车型以及5号线一样

由连续机场及火车站

10号线增设行李“专属座位”

车厢中立柱也改为了3合1

甭操心有人背倚立柱

所在扶手的两难局面了

除了

10哀号线还有给您平赖因为个够

发生站全程用4分钟

扣押在视频还充分绝望的

最深站点——鲤鱼池

心急如焚上班打卡的同伙

真正会好根本

PS:

1、轨道10如泣如诉线江北机场T3航站楼站位于机场航站楼下方。乘坐飞机的司乘人员打2、3哀号出入口出站后乘坐扶梯就不过直达T3航行站楼出发厅。下机换乘地铁之乘客,可自从机场到达厅经4号出入口直接进站:

2、到重庆北站满盘皆输广场乘坐10如泣如诉线,下车之后通过扶梯就得抵达铁路站房

重庆西站

2018年1月16日正规投入使用

身处沙坪坝区

是渝黔、渝昆、兰渝、襄渝

川黔等干线铁路之始发终到站

重庆西站投入使用后

重庆-贵阳运转时刻缩短至2时

重庆-昆明抽水到4.5时

重庆-长沙缩水到5时

重庆-广州缩水至6钟头

沙坪坝高铁站

乐天在2018年春运前开展投用

沙坪坝站紧邻沙坪坝三峡广场

车站站场上以盖4.9万平方米建筑

用于地方综合交通利用和买卖开发

属于全国首规章在赛铁动车站场

上边加盖的铁路车站

轨道交通9哀号线计划在沙坪坝站

站东路、站西路下方

并且地铁环线位于天陈路凡

沙坪坝站主要办理成为渝高铁的客运工作

开通后重庆顶成都相差将缩编到1钟头

寸滩长江大桥、高家花园复线桥开通

2017年12月31日

寸滩长江大桥、寸滩大桥南引道

内环凤中立交、高家花园复线桥开通

寸滩长江大桥及寸滩桥梁南引道

凡是重庆飞机场专用快速路的

重大部分

建成通车后

自从内环高速盘龙立交

透过寸滩长江大桥

暨江北国际机场T3航站楼

自南岸到机场仅需要15分钟

内环凤中立交是重庆西站

连内环快速路的要紧通道

高家花园复线桥

由为河北区石马河交南侧

唯有于杨公桥交叉北侧

开展以后有效提升了内环

高家花园段交通通行能力

PS:

寸滩桥南引道工程为主线通车,剩余的腾龙立交各匝道和腾龙大道二期工程将给2018年8月建成

高家花园复线桥工程为主桥、引桥以及高家花园立交连接磁器口与内环互通通车,剩余的既是来高家花园大桥加宽以及既出高家花园大桥和沙坪坝区沙正街动向的匝道工程将为2018年7月普完工

巫山飞机场

座落巫山、奉节交界处的巫山机场

展望2018年底建成

建成后拿开通至首都、上海、广州

成都、重庆、西安、武汉、昆明

相当于全国重要都之航程

外边游客想去畅游长江三峡

渝东北的伴侣回家

犹得选择直飞巫山哦~

重庆东站,定址南岸区茶园

前瞻2018年开工建设

建成后拿根本承接

渝武高铁、渝西高铁、渝湘高铁

与枢纽东环线等路线的引入

曾家岩嘉陵江大桥

展望2018年岁末主桥建成

属于“公路+轨道”两用桥

上层通汽车,双向6车道

下层为重庆轨道交通10号线

2017年11月20日起

则6声泪俱下线调整行区间

则6哀号线支线2期呢在建设中

建成后吧会经北碚区

2018年渝昆高速铁路、渝西高速铁路

(万州至城口段、重庆东站暨万州段)

渝湘高速铁路黔江至秀山段

重庆东方立铁路综合交通枢纽

重庆北站铁路综合交通枢纽

南场改造工程动工建设


2018,生活于重庆

为来不少期待