欢迎光临
我们一直在努力
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告

探讨开发过程中的服务器数量配置。 (探讨开发过程的书籍)

探讨开发过程中的服务器数量配置

一、引言

在软件开发过程中,服务器数量配置是一个至关重要的环节。

合理的服务器数量配置不仅可以提高系统的性能、稳定性和可扩展性,还能有效降低成本。

本文将小哥探讨开发过程中的服务器数量配置问题,为开发者提供有益的参考。

二、服务器数量配置的影响因素

在探讨服务器数量配置时,我们需要考虑以下几个关键因素:

1. 业务需求:业务需求和规模直接影响服务器数量配置。例如,大型电商平台、社交媒体等需要处理大量用户请求和数据交互的业务,通常需要更多的服务器来支持。

2. 系统架构:不同的系统架构对服务器数量配置有不同的要求。分布式架构需要多个服务器协同工作,而微服务架构则可能需要更多的服务器来处理不同的业务功能。

3. 资源需求:服务器的资源需求包括CPU、内存、存储和带宽等。根据业务需求预测资源需求,进而确定所需的服务器数量。

4. 可用性和容错性:为了保证系统的可用性和容错性,通常需要配置一定数量的冗余服务器。这些服务器可以在主服务器出现故障时接管任务,确保系统正常运行。

三、服务器数量配置的原则

在配置服务器数量时,我们应遵循以下原则:

1. 适度原则:根据业务需求、资源需求等因素,合理配置服务器数量,避免资源浪费和成本过高。

2. 灵活性原则:服务器数量配置应具有灵活性,以便根据业务发展和需求变化进行扩展或缩减。

3. 安全性原则:确保服务器的安全性和稳定性,避免因服务器故障导致系统崩溃或数据丢失。

四、开发过程中的服务器数量配置策略

在开发过程中,我们可以采取以下策略进行服务器数量配置:

1. 初期配置:在项目开发初期,根据业务需求预测和资源需求评估,合理配置一定数量的服务器。随着项目的进展,根据实际情况进行调整。

2. 垂直扩展与水平扩展:垂直扩展通过增强单个服务器的性能来提高整体性能,而水平扩展通过增加服务器数量来分担负载。在实际开发中,我们可以根据业务需求选择合适的扩展方式。

3. 云计算资源:利用云计算资源实现服务器资源的弹性伸缩。根据业务需求的变化,动态调整服务器数量,提高资源利用率。

4. 监控与调优:建立服务器监控体系,实时监控服务器性能、负载等情况,发现问题及时进行调优,确保系统的稳定性和性能。

五、案例分析

以某大型电商平台为例,该平台在发展过程中经历了从单机架构到分布式架构的演变。

随着业务的发展,用户数量和交易量不断增长,单机架构无法满足需求。

因此,该平台逐步采用分布式架构,增加服务器数量,实现负载均衡和容错处理。

通过合理的服务器数量配置,该平台实现了高性能、高并发、高可用的系统,有效支撑了业务发展。

六、总结

本文探讨了开发过程中的服务器数量配置问题,分析了影响因素、原则、配置策略以及通过案例分析加以说明。

合理的服务器数量配置对于提高系统性能、稳定性和可扩展性具有重要意义。

在实际开发中,我们应综合考虑业务需求、系统架构、资源需求等因素,遵循适度、灵活和安全原则,采取合适的服务器数量配置策略,以实现系统的优化运行。


iis中convert to application和add application有什么区别

与IIS一样,引擎在请求的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。

例如,当引擎首次响应请求时,BeginRequest事件将被触发。

接下来触发的是AuthenticateRequest事件,该事件在已建立用户标识时出现。

(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache和EndRequest,等等。

这些事件属于类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplicationClassOverview。

)正如上一部分所讨论的,可以创建ISAPI筛选器以响应IIS引发的事件。

同样,提供了HTTP模块,该模块可以响应由引擎引发的事件。

可以将应用程序配置为具有多个HTTP模块。

对于由引擎处理的每个请求,将初始化每个已配置的HTTP模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。

请注意,对每个请求均使用了许多内置HTTP模块。

其中的一个内置HTTP模块是FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。

如果没有使用,会自动将用户重定向到指定的登录页面。

如上所述,通过使用IIS,传入请求将最终发送给ISAPI扩展,而ISAPI扩展的任务是返回特定请求的数据。

例如,在请求传统的ASP网页时,IIS将请求传递给扩展,该扩展的任务是返回被请求的ASP页面的HTML标记。

引擎使用相似的方法。

初始化HTTP模块后,引擎的下一项任务是确定应由哪个HTTP处理程序来处理请求。

所有通过引擎传递的请求最终都将到达HTTP处理程序或HTTP处理程序工厂(HTTP处理程序工厂仅返回HTTP处理程序的实例,然后使用该实例来处理请求)。

最终的HTTP处理程序将返回响应,即呈现被请求的资源。

此响应将被发送回IIS,然后IIS将响应返回给提出请求的用户。

包括许多内置的HTTP处理程序。

例如,PageHandlerFactory用于呈现网页。

WebServiceHandlerFactory用于呈现服务的响应SOAP信封。

TraceHandler将向呈现请求的HTML标记。

图2描述了如何处理对资源的请求。

首先,IIS接收到请求,并将请求调度给aspnet_。

接下来,引擎对已配置的HTTP模块进行初始化。

最后将调用正确的HTTP处理程序,并呈现被请求的资源,将所生成的标记返回给IIS和请求客户端。

图和正在处理请求创建和注册自定义HTTP模块和HTTP处理程序创建自定义HTTP模块和HTTP处理程序是相对简单的任务,包括创建实现正确接口的托管类。

HTTP模块必须实现接口,而HTTP处理程序和HTTP处理程序工厂必须分别实现接口和接口。

创建HTTP处理程序和HTTP模块的细节超出了本文的范围。

要获得详细的背景知识,请阅读MansoorAhmedSiddiqui的文章。

创建了自定义HTTP模块或HTTP处理程序之后,必须将其注册到Web应用程序。

为整个Web服务器注册HTTP模块和HTTP处理程序仅需在文件中进行简单的添加即可;而为特定Web应用程序注册HTTP模块或HTTP处理程序包括向应用程序的文件中添加几行XML。

特别要说明的是,要将HTTP模块添加到Web应用程序,应在的configuration/部分添加以下几行:type值提供了HTTP模块的程序集和类名称,而name值提供了友好名称,可以在文件中使用此友好名称来引用HTTP模块。

的configuration/部分中的标记对HTTP处理程序和HTTP处理程序工厂进行了配置,如下所示:如上所述,对于每个传入请求,引擎将确定应使用哪个HTTP处理程序来呈现请求。

此决定是基于传入请求的动词和路径做出的。

动词将指定所作出的HTTP请求的类型(GET或POST),而路径将指定被请求文件的位置和文件名。

因此,如果我们希望HTTP处理程序处理对扩展名为的文件的所有请求(GET或POST),可以在文件中添加下面几行:其中,type是HTTP处理程序的类型。

注意:注册HTTP处理程序时,应确保HTTP处理程序使用的扩展名已从IIS映射到引擎,这一点非常重要。

也就是说,在本示例中,如果扩展名没有从IIS映射到aspnet_扩展,则对文件的请求将导致IIS试图返回文件的内容。

为了使HTTP处理程序可以处理此请求,必须将扩展名映射到引擎。

然后,引擎将把请求正确地路由到相应的HTTP处理程序。

有关注册HTTP模块和HTTP处理程序的详细信息,请务必参考elementdocumentation和elementdocumentation。

返回页首实现URL重写可以使用ISAPI筛选器在IISWeb服务器级别实现URL重写,也可以使用HTTP模块或HTTP处理程序在级别实现URL重写。

本文重点介绍如何使用实现URL重写,因此我们将不对使用ISAPI筛选器实现URL重写的细节进行小哥探讨。

但是,有大量的第三方ISAPI筛选器可用于URL重写,例如:•ISAPIRewrite•IISRewrite•PageXChanger•还有许多其他的筛选器!通过类的RewritePath()方法,可以在级别实现URL重写。

HttpContext类包含有关特定HTTP请求的HTTP特定信息。

对于引擎收到的每个请求,均为该请求创建一个HttpContext实例。

此类具有如下属性:Request和Response,提供对传入请求和传出响应的访问;Application和Session,提供对应用程序和会话变量的访问;User,提供有关通过了身份验证的用户的信息;其他相关属性。

使用Microsoft®1.0,RewritePath()方法可以接受单个字符串作为要使用的新路径。

HttpContext类的RewritePath(string)方法在内部对Request对象的Path属性和QueryString属性进行更新。

除了RewritePath(string),1.1还包括另一种形式的RewritePath()方法,此方法可以接受三个字符串输入参数。

此备用重载形式不仅要设置Request对象的Path属性和QueryString属性,还要设置内部成员变量,这些变量用于计算Request对象的PhysicalPath、PathInfo和FilePath属性值。

要在中实现URL重写,需要创建HTTP模块或HTTP处理程序,以便完成以下操作:1.检查被请求的路径,以确定URL是否需要重写。

2.如果需要重写,通过调用RewritePath()方法来重写路径。

例如,假设我们的网站中包含每个员工通过/info/?empID=employeeID均可访问的信息。

为了使URL可以地被“删节”,我们可以决定通过以下地址来访问员工页面:/people/。

这就是我们要使用URL重写的一个例子。

也就是说,在请求/people/页面时,我们要重写该URL,以便使用/info/?empID=1001页面。

使用HTTP模块执行URL重写在级别执行URL重写时,可以使用HTTP模块或HTTP处理程序来执行重写。

使用HTTP模块时,必须决定在请求有效期内的哪个时间点上来检查URL是否需要重写。

乍一看,这似乎可以任意选择,但决定会以一种明显而微妙的方式对应用程序产生影响。

由于内置模块使用Request对象的属性执行任务,因此选择在何处执行重写非常重要。

(如上所述,重写路径将改变Request对象的属性值。

)下面列出了这些密切相关的内置HTTP模块及其捆绑到的事件:HTTP模块事件说明FormsAuthenticationModuleAuthenticateRequest确定用户是否通过了窗体身份验证。

如果没有,用户将被自动重定向到指定的登录页面。

FileAuthorizationMoudleAuthorizeRequest使用Windows身份验证时,此HTTP模块将检查以确保Microsoft®Windows®帐户对被请求的资源具有足够的权限。

UrlAuthorizationModuleAuthorizeRequest检查以确保请求者可以访问指定的URL。

通过文件中的和元素来指定URL授权。

如上所述,BeginRequest事件在AuthenticateRequest之前触发,后者在AuthenticateRequest之前触发。

可以执行URL重写的一个安全位置是在BeginRequest事件中。

也就是说,如果URL需要重写,该操作将在任何一个内置HTTP模块运行后执行。

使用窗体身份验证时,这种方法存在一定的缺陷。

如果您以前使用过窗体身份验证,您会了解当用户访问受限资源时,他们将被自动重定向到指定的登录页面。

成功登录后,用户将被返回到他们第一次尝试访问的页面。

如果在BeginRequest或AuthenticateRequest事件中执行URL重写,登录页面(提交后)将把用户重定向到重写后的页面上。

也就是说,假设用户在其浏览窗口中键入了/people/,此地址将被重写为/info/?empID=1001。

如果将Web应用程序配置为使用窗体身份验证,当用户第一次访问/people/时,首先,URL将被重写为/info/?empID=1001;接下来,FormsAuthenticationModule将运行,并将用户重定向到登录页面(如果需要)。

但是,用户在成功登录后将被发送到/info/?empID=1001,因为当FormsAuthenticationModule运行后,此URL即是请求的URL。

同样,在BeginRequest或AuthenticateRequest事件中执行重写时,UrlAuthorizationModule看到的将是重写后的URL。

也就是说,如果您在文件中使用元素来为特定的URL指定授权,则必须引用重写后的URL。

要解决这些细微问题,您可以决定在AuthorizeRequest事件中执行URL重写。

此方法解决了URL授权和窗体身份验证的一些问题,但同时也产生了新的问题:文件授权无法工作。

使用Windows身份验证时,FileAuthorizationModule将检查以确保通过身份验证的用户具有访问特定页面的相应权限。

假设一组用户对C:\Inetput\wwwroot\info\没有Windows级别的文件访问权限,并要尝试访问/info/?empID=1001,他们将会收到授权错误消息。

但是,如果我们将URL重写移到AuthenticateRequest事件中,当FileAuthorizationModule检查安全设置时,仍然认为被请求的文件是people/,因为该URL必须被重写。

因此,文件授权检查将通过,允许此用户查看重写后的URL/info/?empID=1001的内容。

那么,应该何时在HTTP模块中执行URL重写?这取决于要使用的身份验证类型。

如果不想使用任何身份验证,则无论URL重写发生在BeginRequest、AuthenticateRequest还是AuthorizeRequest中都没有什么关系。

如果要使用窗体身份验证而不使用Windows身份验证,请将URL重写放在AuthorizeRequest事件处理程序中执行。

最后,如果要使用Windows身份验证,请在BeginRequest或AuthenticateRequest事件进行过程中安排URL重写。

在HTTP处理程序中执行URL重写也可以由HTTP处理程序或HTTP处理程序工厂执行URL重写。

如上所述,HTTP处理程序是负责生成特定类型请求的内容的类;HTTP处理程序工厂是负责返回HTTP处理程序实例的类,该实例可以生成特定类型请求的内容。

在本文中,我们将对如何为网页创建URL重写HTTP处理程序工厂进行讨论。

HTTP处理程序工厂必须实现IHttpHandlerFactory接口,此接口包括GetHandler()方法。

初始化相应的HTTP模块后,引擎将确定为给定的请求调用哪个HTTP处理程序或HTTP处理程序工厂。

如果要调用HTTP处理程序工厂,引擎将为Web请求调用传入HttpContext的HTTP处理程序工厂的GetHandler()方法,以及一些其他信息。

然后,HTTP处理程序工厂必须返回一个对象,该对象将实现可以处理请求的IHttpHandler。

要通过HTTP程序程序执行URL重写,我们可以创建一个HTTP处理程序工厂,该处理程序工厂的GetHandler()方法将检查被请求的路径,以确定是否需要重写URL。

如果需要,它可以调用传入的HttpContext对象的RewritePath()方法,如前面所讨论的。

最后,HTTP处理程序工厂可以返回由类的GetCompiledPageInstance()方法返回的HTTP处理程序。

(此技术与内置网页HTTP处理程序工厂PageHandlerFactory工作时所应用的技术相同。

)由于所有HTTP模块都将在实例化自定义HTTP处理程序工厂之前进行初始化,因此,在将URL重写放在事件的后半段时,使用HTTP处理程序工厂就会带来相同的风险,即文件授权无法工作。

因此,如果您依赖于Windows身份验证和文件授权,您可能希望为URL重写使用HTTP模块方法。

在下一部分中,我们将对构建可重用的URL重写引擎进行讨论。

在介绍了URL重写引擎(可通过下载本文的代码获得)之后,我们将在剩下的两个部分中对URL重写的实际使用情况进行介绍。

首先,我们将讨论如何使用URL重写引擎,并介绍一个简单的URL重写示例。

接下来,我们将利用重写引擎的正则表达式功能来提供真正“可删节”的URL。

返回页首构建URL重写引擎为了有助于描述如何在应用程序中实现URL重写,我创建了URL重写引擎。

此重写引擎将提供以下功能:•使用URL重写引擎的页面开发人员可以在文件中指定重写规则。

•重写规则可以使用正则表达式来实现功能强大的重写规则。

•可以轻松地将URL重写配置为使用HTTP模块或HTTP处理程序。

在本文中,我们将介绍仅使用HTTP模块的URL重写。

要查看如何使用HTTP处理程序来执行URL重写,请参考可随本文下载的代码。

为URL重写引擎指定配置信息让我们先介绍一下文件中重写规则的结构。

首先,您需要在文件中指明要使用HTTP模块还是HTTP处理程序来执行URL重写。

在下载代码中,文件包含两个已注释掉的条目:–>–>注释掉条目,以使用HTTP模块执行重写;注释掉条目,以使用HTTP处理程序执行重写。

除了指定使用HTTP模块还是HTTP处理程序执行重写外,文件还包含重写规则:重写规则由两个字符串组成:要在被请求的URL中查找的模式;要替换此模式的字符串(如果找到)。

在文件中,此信息是使用以下语法表达的:要查找的模式要用来替换模式的字符串要查找的模式要用来替换模式的字符串每个重写规则均由元素表达。

要搜索的模式由元素指定,而要替换所找到的模式的字符串将在元素中输入。

这些重写规则将从头到尾进行计算。

如果发现与某个规则匹配,URL将被重写,并且对重写规则的搜索将会终止。

在元素中指定模式时,请注意,要使用正则表达式来执行匹配和字符串替换。

(稍后,我们将介绍一个真实的示例,说明如何使用正则表达式来搜索模式。

)由于模式是正则表达式,应确保转义正则表达式中的任何保留字符。

(一些正则表达式保留字符包括:.、?、^、$及其他。

可以通过在前面加反斜杠(如\.)对这些字符进行转义,以匹配文字句点。

)使用HTTP模块执行URL重写创建HTTP模块与创建可以实现IHttpModule接口的类一样简单。

IHttpModule接口定义了两种方法:•Init(HttpApplication)。

此方法在初始化HTTP模块后触发。

在此方法中,您将把事件处理程序绑定到相应的HttpApplication事件。

•Dispose()。

当请求已完成并已发送回IIS时调用此方法。

您应当在此处执行所有最终的清除操作。

为了便于为URL重写创建HTTP模块,我将从创建抽象基类BaseModuleRewriter开始介绍。

此类将实现IHttpModule。

在Init()事件中,它将HttpApplication的AuthorizeRequest事件绑定到BaseModuleRewriter_AuthorizeRequest方法。

BaseModuleRewriter_AuthorizeRequest方法将调用该类传入被请求的Path的Rewrite()方法,以及传入Init()方法的HttpApplication对象。

Rewrite()方法是抽象的,也就是说,在BaseModuleRewriter类中,Rewrite()方法没有方法主体;从BaseModuleRewriter派生而来的类必须覆盖此方法并提供方法主体。

具有此基类后,只需创建由BaseModuleRewriter派生的类即可,该类可以覆盖Rewrite()并在那里执行URL重写逻辑。

下面显示了BaseModuleRewriter的代码。

publicabstractclassBaseModuleRewriter:IHttpModule{publicvirtualvoidInit(HttpApplicationapp){//警告!此代码不适用于Windows身份验证!//如果使用Windows身份验证,//请改为+=newEventHandler(_AuthorizeRequest);}publicvirtualvoidDispose(){}protectedvirtualvoidBaseModuleRewriter_AuthorizeRequest(objectsender,EventArgse){HttpApplicationapp=(HttpApplication)sender;Rewrite(,app);}protectedabstractvoidRewrite(stringrequestedPath,HttpApplicationapp);}请注意,BaseModuleRewriter类将在AuthorizeRequest事件中执行URL重写。

如上所述,如果将Windows身份验证与文件授权结合使用,您需要对此做出更改,以便可以在BeginRequest或AuthenticateRequest事件中执行URL重写。

ModuleRewriter类扩展了BaseModuleRewriter类,并负责执行实际的URL重写。

ModuleRewriter包含单一覆盖方法(Rewrite()),如下所示:protectedoverridevoidRewrite(stringrequestedPath,){//获得配置规则RewriterRuleCollectionrules=();//遍历每个规则for(inti=0;i

web前端好还是JAVA好?

WEB前端与JAVA哪个好,需要先判断这两种语言的区别,另外就是学习这些技术,需要了解这两种语言的特点。

C语言的难度系数高么?

其实很多东西都是看似很难,但是只要你认真的去学,用心去学它,其实是不难的,久而久之就简单了。

学习一件东西也要讲究方法,就像C语言的编写还是有很多的规律可以去遵循的。

多看些C语言的书还是必要的。

看多了你就会找到其中的规律的。

1.把C++当成一门新的语言学习(和C没啥关系!真的。

);2.看《Thinking In C++》,不要看《C++变成死相》;3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;6.会用Visual C++,并不说明你会C++;7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;9.看Visual C++的书,是学不了C++语言的;10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?11.浮躁的人容易问:我到底该学什么;——别问,学就对了;12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;17.C++不仅仅是支持面向对象的程序设计语言;18.学习编程最好的方法之一就是阅读源代码;19.在任何时刻都不要认为自己手中的书已经足够了;20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;26.请看《程序设计实践》,并严格的按照其要求去做;27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;31.学习编程的秘诀是:编程,编程,再编程;32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;33.记住:面向对象技术不只是C++专有的;34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;35.把在书中看到的有意义的例子扩充;36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;39.C++语言和C++的集成开发环境要同时学习和掌握;40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;46.记录下在和别人交流时发现的自己忽视或不理解的知识点;47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version ;48.保存好你写过的所有的程序——那是你最好的积累之一;49.请不要做浮躁的人;50.请热爱C++!

赞(0)
未经允许不得转载:优乐评测网 » 探讨开发过程中的服务器数量配置。 (探讨开发过程的书籍)

优乐评测网 找服务器 更专业 更方便 更快捷!

专注IDC行业资源共享发布,给大家带来方便快捷的资源查找平台!

联系我们