WEB和数据库分别在两个服务器上的几个小问题

1、WEB服务器访问慢
修改数据库服务器的my.ini或者my.cnf,在[mysqld]下添加skip-name-resolve

2、WEB服务器连接数据库服务器时,提示Can’t connect to MYSQL server on ‘IP’ (13)
linux系统安装的时候自动启动了selinux功能,需要关掉
修改文件/etc/selinux/config
将SELINUX设为disabled
SELINUX=disabled

Web与App的五种关系及演变

Web与App的五种关系及演变

本文会阐述Web与App的五种关系类型,以及从流量分发视角和技术演进视角看待关系的演变。

五种关系类型

对于移动端应用来说,Web与App的关系可以分为五种基本类型。移动互联网发展的整体趋势决定了主流的关系类型。每个具体的产品也会随着发展阶段的不同而采用不同的形态,或者各种形态混合共存。

Web or App – 独立应用

Web与App各自独立完成服务。这种模式下Web与App实现的业务可以是差异化的,但各自保持独立且完整,相互之间的交互基本仅限于流量引导。

App从应用商店获取流量,占总流量的主要部分。Web应用独立运行在浏览器中,从搜索引擎获取长尾流量。Web应用可以灵活处理用户的随机需求,在服务过程中找机会将用户引导至App。

Web in App – 壳型混合应用

App作为Web应用的壳资源。App提供的容器能让Web能够突破浏览器的限制实现某些功能。更重要的是有了App的壳就能够利用App的应用商店作为分发渠道。早期的Facebook App就是典型的壳应用。

Web on App – 平台型混合应用

App作为平台承载各种Web应用。平台型App会提供容器让其它合作方以相对独立的Web应用的形式接入平台。平台上的Web应用可以获得部分扩展功能和用户信息。微信公众号和支付宝服务窗就是这种模式的代表。

Web and App – 综合型混合应用

Web与App高度混合,共同实现某项业务。这种模式下原生部分与Web部分会有大量的交互。为了达到用户体验的一致性,App会加强容器的能力,让Web部分能够调用更多的Native资源,以弥补Web部分在体验上的不足。在这类应用中,用户通常难以区分哪些部分是Web,哪些部分是原生。美团、携程等综合型服务商会大量采用这种模式。

Web of App – 融合型应用

使用Web技术来做App。不用Webview来做混合嵌入,而是直接借用部分Web技术来实现原生的功能。这种模式是既要Native的体验,又要Web动态更新与代码复用的好处。微信小程序就是这种模式的代表。

流量分发视角

移动时代到来之前,互联网产品主要以PC端的Web应用为主,入口主要是搜索引擎。早期用户逐渐向移动设备上迁移时,依然保持着使用浏览器和搜索引擎的习惯,这个时候有独立的移动端Web应用来获取流量并完成服务就很重要。

随着App的崛起,流量的来源从搜索引擎变成了应用市场,这个时候主战场就由浏览器转向了App,混合应用应运而生。

一部分App获得市场*对优势地位之后,就会形成头部效应,做流量的二次分发,这类App中接入的应用也就是平台型混合应用。

头部效应与二次分发:

头部App发展到后期,就会有资本挑战已经成熟的Webview嵌入模式,引导合作方做技术融合型应用。合作方会付出更多的开发成本来换取体验上的提升和更多的流量支持。这种做法能够提高技术壁垒,形成差异化与体验优势来巩固头部App自身的地位。

在移动互联网时代,App是主要的流量载体,但从内容生产和消费层面上并没有统一标准,自然就造成了开发成本的大幅上升。

为了降低成本,App从PC时代将Web的标准和内容迁移过来,混合应用应运而生。

混合应用发展到后期,由于头部App厂商的技术和流量优势的持续积累,同时原有的Web标准的演进速度又不及预期,导致头部App可以有实力去掉Web容器这一中间层,直接推行新的内容标准,这些内容标准大量借鉴并且继承了原有的Web标准,同时又更贴近了App的使用场景。

腾讯的微信小程序和Facebook的React Native虽然商业目的上各有不同,但从技术上来讲都是去掉了Web容器这一层,将Web标准延伸到Native领域。

总结

本文阐述了Web与App的五种基本关系类型以及他们各自的产生背景和特点。

从商业角度来看,互联网产品获取流量就像生物需要获取食物一样重要,所以产品形态一定会向流量入口所需要的方向倾斜。

从技术角度来看,Web标准是移动互联网从PC时代继承的技术遗产,未来会有各种基于传统Web标准的新标准产生,另一方面Web标准自身会持续演进以适应移动互联网的快速发展。

这也正说明了一个问题,互联网发展离不开前端开发,而前端开发在app的开发中占据了一定行主导的位置,斑码教育正是看到了这一发展趋势,联合行业大牛研发出一整套全栈前端的实用性课程,专注于现在行业方向,提供从就业角度出发的技术服务,保障学员毕业薪资,,持续关注我进行了解前端知识。

十个免费的 Web 压力测试工具

本文列举了是十个免费工具,可以用来进行Web的负载/压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性能。

0. Grinder –  Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。 支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的 主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本 化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。

The Grinder

1. Pylot -Pylot 是一款开源的测试web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视test suites。

Pylot Main Logo

 

2. Web Capacity Analysis Tool (WCAT) – 这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚本 HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户 端又可以产生多个虚拟客户端(*大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使用 SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确的 GET 或 POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存。

3. fwptt – fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net, jsp, php 或是其它的Web应用。

4. JCrawler – JCrawler是一个开源(CPL) 的WEB应用压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一 种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下, 将自动提交Sitemap给前5名的搜索引擎!

5. Apache JMeter – Apache JMeter是一个专门为运行和服务器装载测试而设计的、100%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以 支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情 况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据 显示,测试同步及测试的创建和执行。

6. Siege -Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每 个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 Siege 支持基本的认证,cookies, HTTP 和 HTTPS 协议。

7. http_load – http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。

8. Web Polygraph – Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具。

9. OpenSTA – OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行性能测试。例如虚拟多个不同的用户同时登陆被测试网 站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化 测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过 proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析。

web项目如何部署到服务器?

写好上位机程序后,如何部署到服务器?
(这里我用的是tomcat服务器)
首先说明一点:为了程序测试是否连接到下位机,我编写了一个命名为gprs的java文件,这个可以用下位机连接是否成功。程序见附录,下面说具体的部署的步骤:

把web项目导出为war文件。步骤:选中web文件的项目->右键->Export->Myeclipse->WAR file如下图:
%title插图%num

选择导出的位置,这里我为方便查找,选择为桌面。

%title插图%num

把gprs.java文件导出为 Runnable JAR 文件。

步骤:选中java项目中的gprs.jar文件->右键->Export->java->Runnable JAR file,然后选择next

%title插图%num

Launch configuation 选择的是你的主清单属性(就是你要运行的main方法所在的类,如果找不到就把main方法跑一边),Export destinaction 把导出的文件存放到哪里(不是像下载东西直接选个地址就完了,还要指定文件名和后缀  例如  c:\test.jar)Library handling 的三个选项(建议选第二个)

finish(去你指定的地方就可以找到文件了不用担心你依赖的jar会一起导出了)

Library handling 的三个选项:

Extract required libraries into generated jar:提取需要的库(以解压的形式)放到生成的 jar文件中,生成的jar文件较小 Package required libraries into generated jar:将所有需要的Jar包放到生成的 jar 文件中,生成的jar文件较大 Copy required libraries into a sub-folder next to the generated jar:将需要的jar包拷贝到一个子文件夹中
%title插图%num

发送到服务器

以上两个文件导成功后,登录自己的云服务器,并把上面的war文件通过远程桌面或者第三方软件(qq、微信、网盘等),从本地主机发送到服务器上,并把war文件放在tomcat中webapps目录下,并解压;把jar文件,放在c盘->Administeration目录下即可。

调试,运行。

首先,打开cmd,然后:输入:java -jar xxxx.jar (xxx代表的是导出的jar文件名称)。保证没有报错即可。

然后,通过网络调试助手,建立TCP的client。然后输入服务器的静态IP地址和端口号(在java文件中设置好的端口号)。检测是否是否能服务器连接成功。

*后,连接成功后,打开服务器的tomcat,在服务器的浏览器端输入:

http://47.93.7.53:8080/demo_bridge0807
http://服务器的静态IP:8080/war文件的名称

以上步骤就完成了环境搭建。

欢迎大家批评指教!

web项目如何部署到服务器?

写好上位机程序后,如何部署到服务器?
(这里我用的是tomcat服务器)
首先说明一点:为了程序测试是否连接到下位机,我编写了一个命名为gprs的java文件,这个可以用下位机连接是否成功。程序见附录,下面说具体的部署的步骤:

把web项目导出为war文件。步骤:选中web文件的项目->右键->Export->Myeclipse->WAR file如下图:
%title插图%num

选择导出的位置,这里我为方便查找,选择为桌面。

%title插图%num

把gprs.java文件导出为 Runnable JAR 文件。

步骤:选中java项目中的gprs.jar文件->右键->Export->java->Runnable JAR file,然后选择next

%title插图%num

Launch configuation 选择的是你的主清单属性(就是你要运行的main方法所在的类,如果找不到就把main方法跑一边),Export destinaction 把导出的文件存放到哪里(不是像下载东西直接选个地址就完了,还要指定文件名和后缀  例如  c:\test.jar)Library handling 的三个选项(建议选第二个)

finish(去你指定的地方就可以找到文件了不用担心你依赖的jar会一起导出了)

Library handling 的三个选项:

Extract required libraries into generated jar:提取需要的库(以解压的形式)放到生成的 jar文件中,生成的jar文件较小 Package required libraries into generated jar:将所有需要的Jar包放到生成的 jar 文件中,生成的jar文件较大 Copy required libraries into a sub-folder next to the generated jar:将需要的jar包拷贝到一个子文件夹中

%title插图%num

发送到服务器

以上两个文件导成功后,登录自己的云服务器,并把上面的war文件通过远程桌面或者第三方软件(qq、微信、网盘等),从本地主机发送到服务器上,并把war文件放在tomcat中webapps目录下,并解压;把jar文件,放在c盘->Administeration目录下即可。

调试,运行。

首先,打开cmd,然后:输入:java -jar xxxx.jar (xxx代表的是导出的jar文件名称)。保证没有报错即可。

然后,通过网络调试助手,建立TCP的client。然后输入服务器的静态IP地址和端口号(在java文件中设置好的端口号)。检测是否是否能服务器连接成功。

*后,连接成功后,打开服务器的tomcat,在服务器的浏览器端输入:

http://47.93.7.53:8080/demo_bridge0807
http://服务器的静态IP:8080/war文件的名称

以上步骤就完成了环境搭建。

欢迎大家批评指教!

web项目打包部署到服务器上的步骤

一、将项目打包成war包。(这里以eclipse如何打包为例)

项目(右键)——>Export——>War file(Web)——>选择war包保存路径——>Finished。

二、发布到Tomcat上。

2.1  解压tomcat

2.2  将打包好的war包拷贝到tomcat文件夹下的webapps里。

2.3  在tomcat的config文件中修改server.xml信息。(在<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs” pattern=”%h %l %u %t &quot;%r&quot; %s %b” prefix=”localhost_access_log.” suffix=”.txt”/>后面添加<Context docBase=”你的项目名” path=”/项目名” reloadable=”true”  “/>)

注意:如果没有配置好JAVA_HOME与JRE_HOME信息的,还要在bin文件中修改setclasspath.bat信息。(在rem Make sure prerequisite environment variables are set 这句上面添加set JAVA_HOME= ‘java安装路径’  set JRE_HOME=’JRE安装路径’)。

三、运行项目。

在tomcat的bin文件中找到startup.bat,双击运行,即可启动项目。

Web负载均衡的几种实现方式

摘要:

负载均衡(Load Balance)是集群技术(Cluster)的一种应用。负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力。目前*常见的负载均衡应用是Web负载均衡。根据实现的原理不同,常见的web负载均衡技术包括:DNS轮询、IP负载均衡和CDN。其中IP负载均衡可以使用硬件设备或软件方式来实现。

什么是web负载均衡

服务器集群(Cluster)使得多个服务器节点能够协同工作,根据目的的不同,服务器集群可以分为:

高性能集群:将单个重负载的请求分散到多个节点进行处理,*后再将处理结果进行汇总
高可用集群:提高冗余单元,避免单点故障
负载均衡集群:将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。
一般提到的负载均衡(Load Balance),是指实现负载均衡集群。负载均衡实现了横向扩展(Scale Out),避免纵向的升级(Scale Up)换代。

本文中的web负载均衡,特指能够分担web请求(http,https等)的负载均衡技术。

基本原理

任何的负载均衡技术都要想办法建立某种一对多的映射机制:一个请求的入口映射到多个处理请求的节点,从而实现分而治之(Divide and Conquer)。

这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构。

采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:

DNS轮询
CDN
IP负载均衡

DNS

DNS轮询是*简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS A记录使得请求可以分配到不同的服务器。

DNS轮询没有快速的健康检查机制,而且只支持WRR的调度策略导致负载很难“均衡”,通常用于要求不高的场景。并且DNS轮询方式直接将服务器的真实地址暴露给用户,不利于服务器安全。

CDN
CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户*近的缓存节点作为服务提供节点。

因为很难自建大量的缓存节点,所以通常使用CDN运营商的服务。目前国内的服务商很少,而且按流量计费,价格也比较昂贵。

IP负载均衡

IP负载均衡是基于特定的TCP/IP技术实现的负载均衡。比如NAT、DR、Turning等。是*经常使用的方式。关于其原理,可以参考下面另一篇文章:lvs中的负载均衡方式。

IP负载均衡可以使用硬件设备,也可以使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、NginX。其中LVS、HAProxy可以工作在4-7层,NginX工作在7层。关于三者的简单对比,可以参考这里。

硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性、文档和服务都比较好。唯一的问题就是价格。

软件负载均衡通常是开源软件。自由度较高,但学习成本和管理成本会比较大。

F5

F5的全称是F5-BIG-IP-GTM,是*流行的硬件负载均衡设备,其并发能力达到百万级。F5的主要特性包括:

多链路的负载均衡和冗余

可以接入多条ISP链路,在链路之间实现负载均衡和高可用。

防火墙负载均衡

F5具有异构防火墙的负载均衡与故障自动排除能力。

服务器负载均衡

这是F5*主要的功能,F5可以配置针对所有的对外提供服务的服务器配置Virtual Server实现负载均衡、健康检查、回话保持等。

高可用

F5设备自身的冗余设计能够保证99.999%的正常运行时间,双机F5的故障切换时间为毫秒级。

使用F5可以配置整个集群的链路冗余和服务器冗余,提高可靠的健康检查机制,以保证高可用。

安全性

与防火墙类似,F5采用缺省拒*策略,可以为任何站点增加额外的安全保护,防御普通网络攻击,包括DDoS、IP欺骗、SYN攻击、teartop和land攻击、ICMP攻击等。

易于管理

F5提供HTTPS、SSH、Telnet、SNMP等多种管理方式,包含详尽的实时报告和历史纪录报告。同时还提供二次开发包(i-Control)。

其他

F5还提供了SSL加速、软件升级、IP地址过滤、带宽控制等辅助功能。

LVS

LVS(Linux Virtual Server, Linux虚拟服务器),是章文嵩博士开发的开放软件,目前已经集成到Linux内核中。

基于不同的网络技术,LVS支持多种负载均衡机制。包括:VS/NAT(基于网络地址转换技术)、VS/TUN(基于IP隧道技术)和VS/DR(基于直接路由技术)。

此外,为了适应不同的需要,淘宝开发了VS/FULLNAT,从本质上来说也是基于网络地址转换技术。*近还有一个基于VS/FULLNAT的DNAT模块。

不管使用哪种机制,LVS都不直接处理请求,而是将请求转发到后面真正的服务器(Real Server)。不同的机制,决定了响应包如何返回到客户端。

VS/NAT

NAT(Network Address Translation,网络地址转换)也叫做网络掩蔽或者IP掩蔽,是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。

NAT能够将私有(保留)地址转化为合法IP地址,通常用于一个公共IP地址和多个内部私有IP地址直接的映射,广泛应用于各种类型Internet接入方式和各种类型的网络中。

通过使用NAT将目的地址转换到多个服务器的方式,可以实现负载均衡,同时能够隐藏并保护内部服务器,避免来自网络外部的攻击。商用负载均衡设备如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector都是基于NAT方法。

VS/NAT(Virtual Server via Network Address Translation)是基于NAT技术实现负载均衡的方法。其架构如下图所示:

%title插图%num

客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器
调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,*后将修改后的报文发送给选出的服务器。

真实的服务器处理请求,并将响应报文发到调度器。

调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口
调度器将修改过的报文发给用户
在VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将*大地提高整个集群系统的吞吐量。比如IP隧道技术。

VS/TUN

IP Tunneling(IP隧道)技术,又称为IP封装技术(IP encapsulation),是一种在网络之间传递数据的方式。可以将一个IP报文封装到另一个IP报文(可能是不同的协议)中,并转发到另一个IP地址。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。

VS/TUN(Virtual Server via IP Tunneling)是基于隧道技术实现负载均衡的方法。其架构如下图所示:

%title插图%num

VS/TUN与VS/NAT的工作机制大体上相同,区别在于:

  1. 调度器转发报文的时候进行了协议的二次封装,真实的服务器接收到请求后先进行解包。过程如下图所示:

%title插图%num

响应报文从后端服务器直接返回给客户,不需要经过调度器。

VS/DR

DR(Direct Routing, 直接路由), 路由器学习路由的方法之一。路由器对于自己的网络接口所直连的网络之间的通信,可以自动维护路由表,而且不需要进行路由计算。

直接路由通常用在一个三层交换机连接几个VLAN的情况,只要设置直接路由VLAN之间就可以通信,不需要设置其他的路由方式。

VS/DR(Virtual Server via Direct Routing)是基于直接路由实现负载均衡的方法。其架构如下图所示:

%title插图%num

跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以*大地提高整个集群系统的吞吐量。

VS/DR要求调度器和服务器组都必须在物理上有一个网卡通过不分段的局域网相连,即通过交换机或者高速的HUB相连,中间没有隔有路由器。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。

VS/DR的整个过程与VS/TUN非常类似,不同之处在于调度器不对请求包进行二次封装,只是将目标MAC地址更改为经过调度算法选出的目标服务器的MAC地址。如下图:

%title插图%num

三种方法的优缺点比较

VS/NAT
优点

对后端服务器的操作系统无要求
只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。
支持端口映射
缺点

请求和响应报文都需要通过调度器,伸缩能力有限(10+)
要求服务器和调度器在同一个VLAN
需要将服务器的默认网关指向调度器
对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号
VS/TUN
优点

不需要调度应答报文,性能高
服务器和调度器可以不在同一个VLAN
支持广域负载均衡
缺点

所有的服务器必须支持“IP Tunneling”协议,要安装内核模块(比如IPIP等),配置复杂
有建立IP隧道的开销
服务器上直接绑定虚拟IP(Virtaul IP),风险很大
服务器需要联通外网
不支持端口映射
VS/DR
优点

与VS/TUN相比,没有IP隧道的开销,性能*好
缺点

要求调度器与服务器都有一块网卡连在同一物理网段(同一个VLAN)上
要求服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上
服务器上直接绑定虚拟IP(Virtaul IP),风险很大
不支持端口映射

VS/FULLNAT

如上节所述,前面三种传统的负载均衡机制各自存在一些不足。

VS/FULLNAT是为了解决这些不足而新开发的一种转发模式。VS/FULLNAT的特点是:

调度器和服务器可以跨VLAN通信,不需要配置在同一个网段
请求和应答报文都经过调度器,服务器不需要绑定虚拟IP
VS/FULLNAT这两个特点可以简化网络拓扑,降低运维成本和风险。

如何选择

如果人少钱多,不在乎性能的损耗愿意多买服务器,同时希望*大程度较少运维的工作量,可以选择FULLNAT
很大众的方式是用DR,没有太多的优点但也没有太多的缺点
如果要搞广域网负载均衡,那就用TUN吧
个人感觉NAT不是为了互联网用的。小并发的实验性应用或者用在非web场合,比如mysql集群等。当然,如果需要端口映射,必须使用NAT方式

给Web中的网页添加Loading进度条形式

前段时间客户提了一个需求,要求给网站中某些功能添加进度条形式,因为某些功能查询的数据量太大,经常会出现点击Search按钮,但是没有任何反应的情况,会让用户以为网站挂掉了,导致投诉的事情发生,所以客户要求必须要添加。

其实不论在网站中,或者是在APP中,添加动画Loading进度条,这都是必须要去做的。我们在浏览网页、玩游戏、或者在玩手机的时候,不可避免会遇到因为网络差或者硬件差等等的原因,而要等待,而对这样的等待,大多数人都是没有耐心去等的,这时如何可以出现一个动画Loading进度条,就可以大大缓解等待时的烦躁情绪,让用户可以明确、直观的看到Loading的进度。

常见的Loading样式有很多,比如:直线进度条、圆形进度条、旋转进度条、Logo描边形式的进度条、奔跑的形式等等。

我此次添加的Loading样式,是比较常见的旋转Loading样式,效果如下:

%title插图%num%title插图%num

 

(图1:是我自己做的,网上的图片颜色不太符合我的需求

图2:在网站上实际显示的效果,除了Loading样式,还有一个遮盖的效果)

 

具体实现的方式:

前台代码:

 1 //遮盖层
 2 <div id="divbase" class="ui-widget-overlay" style="z-index: 997; display: none;">
 3     <iframe class="ui-widget-overlay" runat="server" id="iFameBase" style="z-index: 998;
 4         display: none;">
 5     </iframe>
 6 </div>
 7 //Loading部分
 8 <div runat="server" id="divSK" style="position:absolute; left:36%; top:30%; width:30%; height:30%; z-index:999;display:none;">
 9     <img runat="server" id="imgLoading" src="../Images/gif/CirclePoint.gif" />
10 </div>

 

CSS样式:

 1 /*
 2 弹出小视窗下层的div,作遮盖showdialog的效果,设定背景色,给透明度,可以看到主画面的内容.
 3 */
 4 .ui-widget-overlay
 5 {
 6     position: absolute;
 7     top: 0;
 8     left: 0;
 9     width: 100%;
10     height: 100%;
11     background-color: Gray;
12     opacity: .30;
13     filter: Alpha(Opacity=30);
14 }

 

后台处理(包含JS部分):

 1 //当点击按钮的时候(JS实现)
 2 $(function() {  
 3      $("#btnQuery").click(function() { 
 4         $("#base").show();
 5         document.getElementById("divSK").style.display = "";
 6     });
 7 });
 8 
 9 //当按钮事件处理完毕后(后台处理)
10 this.Page.ClientScript.RegisterStartupScript(this.GetType(), "DisplayDiv", "funDisplayDiv();", true);
11 
12 //funDisplayDiv()(JS实现)
13 function funDisplayDiv(){
14     $("#base").hide();
15     document.getElementById("divSK").style.display = "none"; 
16 }

 

以上是我本次添加实现的Loading样式,当然还会有其它更多的实现样式,后续有时间再继续整理。

Spring简介-入门级学习

Spring简介:

       Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
       Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
       轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
       控制反转:Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
       面向切面:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
       容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
       框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
       所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
Spring模块:
       Spring框架由七个定义明确的模块组成,如下图:
       %title插图%num 

如果作为一个整体,这些模块为你提供了开发企业应用所需的一切。但你不必将应用完全基于Spring框架。你可以自由地挑选适合你的应用的模块而忽略其余的模块。

 

Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用,如下图:

%title插图%num

 

核心容器:

所有的Spring模块都是在核心容器之上构建的,是Spring框架*基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理

核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring表达式语言,Spring Expression Language)等模块组成,它们的细节如下:

*)spring-core模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能

*)spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦

*)context模块建立在由core和 beans 模块的基础上建立起来的,它以一种类似于JNDI注册的方式访问对象

Context模块继承自Bean模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过Servelet容器)等功能

Context模块也支持Java EE的功能,比如EJB、JMX和远程调用等

            ApplicationContext接口是Context模块的焦点

            spring-context-support提供了对第三方库集成到Spring上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等

*)spring-expression模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是JSP2.1规范中定义的统一表达式语言的扩展,支持set和get属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从Spring IoC容器检索对象,还支持列表的投影、选择以及聚合等

 

数据访问/集成:

数据访问/集成层包括 JDBC(Java Data Base Connectivity),ORM(Object Relational Mapping),OXM(Object XML Mapping),JMS(Java Message Service) 和事务处理模块,它们的细节如下:

       *JDBC 模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码的解析

       *ORM 模块提供了对流行的对象关系映射API的集成,包括JPA、JDO和Hibernate等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理

       *OXM 模块提供了对OXM实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等

       *JMS 模块包含生产(produce)和消费(consume)消息的功能。从Spring 4.1开始,集成了spring-messaging模块

*)事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细)

 

Web:

Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:

       *Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分

       *Web-MVC 模块为web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和web表单完全地分离,且可以与Spring框架的其它所有功能进行集成

       *Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式

*)Web-Portlet 模块提供了用于Portlet环境的MVC实现,并反映了spring-webmvc模块的功能

 

       其他

       还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:

       *AOP 模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中

       *Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架

       *Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现

       *Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息

*)测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试

 

环境配置:

1、安装JDK(可参考我的另一篇博文:安装 Java 开发工具包JDK(Windows版本))

2、安装Eclipse IDE

3、安装Spring 框架库

a)在http://repo.spring.io/release/org/springframework/spring/下载*新版本的Spring 框架的二进制文件(我是Windows系统下载了spring-framework-5.1.0.RELEASE-dist.zip)

b)将下载下来的文件解压

\libs文件夹中会显示所有的Spring 库

%title插图%num

 

创建一个Hello World实例:

1、使用 Eclipse IDE 创建一个简单的 Java 项目

2、添加 Spring 框架

选中项目 -> 右键属性 -> Java Build Path,开始添加,如下图红框部分:

%title插图%num

其中,在添加jar包时,只需要添加核心jar包就可以,如下图红框部分:

%title插图%num

 

3、按下图红框部分,创建3个源文件:HelloWorld.java 、 MainApp.java、Beans.xml

%title插图%num

其中:

HelloWorld.java的代码:

 1 package com.tutorialspoint;
 2 
 3 public class HelloWorld {
 4    private String message;
 5    public void setMessage(String message){
 6       this.message  = message;
 7    }
 8    public void getMessage(){
 9       System.out.println("Your Message : " + message);
10    }
11 }

 

MainApp.java的代码:

(备注:

1、使用框架 API ClassPathXmlApplicationContext() 来创建应用程序的上下文。这个 API 加载 beans 的配置文件并*终基于所提供的 API,它处理创建并初始化所有的对象,即在配置文件中提到的 beans;

2、使用已创建的上下文的 getBean() 方法来获得所需的 bean。这个方法使用 bean 的 ID 返回一个*终可以转换为实际对象的通用对象。一旦有了对象,你就可以使用这个对象调用任何类的方法。)

 1 package com.tutorialspoint;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 public class MainApp {
 7    public static void main(String[] args) {
 8       ApplicationContext context = 
 9              new ClassPathXmlApplicationContext("Beans.xml");
10       HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
11       obj.getMessage();
12    }
13 }

 

Beans.xml的代码:

(备注:该文件用于给不同的 bean 分配唯一的 ID,并且控制不同值的对象的创建,而不会影响 Spring 的任何源文件)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 7 
 8    <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
 9        <property name="message" value="Hello World!"/>
10    </bean>
11 
12 </beans>

 

4、运行程序

%title插图%num

截止到现在,已经成功地创建了*个 Spring 应用程序,后续就需要更加深入的去了解Spring了。