- 安装AB
rpm -ivh http://repo.webtatic.com/yum/centos/5/`uname -i`/webtatic-release-5-0.noarch.rpm
yum install httpd-tools
- 使用AB
ab -r -n 100000 -c 10000 http://10.120.151.223:8080/
需加-r,则在收到SOCKET错误的时候不会退出
这段的意思是发送100000个请求,其中并发是10000个
- 修改LINUX能打开的文件的最大数
2、 修改目标
我们的目标是:让每一个用户登录系统后系统打开的最大文件数都是我们设定好的。
但我这里不得不说的是:非常遗憾,网上很多这方面关于ulimit设置修改资源限制的文章,但没一篇文章管用。
把这个目标分解为两个目标:
2.1、设置对root用户登录系统生效
这个目标可以实现起来不难
2.2、设置对所有用户生效
这个就非常麻烦了,弄不好还会把你的系统给整坏,因为要重编译Linux的内核才行!
所以权衡之下,我只实现了第一个目标,因为第二个目标的风险太大,我想如果我之前知道这点,那么我在装系统的时候我会先做这个处理,但现在我觉得已经晚了。
3、 修改的地方
3.1、修改/etc/security/limits.conf
通过 vi /etc/security/limits.conf修改其内容,在文件最后加入(数值也可以自己定义):
* soft nofile = 65536
* hard nofile = 65536
root soft nofile 65536
root hard nofile 65536
* 表示该配置对所有用户均有效,root用户要特别加两行。
3.2、修改/etc/profile
通过vi /etc/profile修改,在最后加入以下内容
ulimit -n 65536
然后重新登录即可生效了。
说明:
其实只修改/etc/profile就可以生效了,但我还是建议把/etc/security/limits.conf也修改一下。
最后强调的是,你如果要使得修改对所有用户都生效,那么现在看来你只能重新编译Linux的内核才行。
- 安装APR,参考:http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/
$ wget http://apache.fayea.com//apr/apr-1.5.1.tar.gz
$ cd /path/to/tomcat/bin
$ tar zxvf tomcat-native.tar.gz
$ cd tomcat-native-x.y.z-src/jni/native
$ ./configure --with-apr=/usr/local/apr --with-ssl=/usr/lib64/openssl
$ make install
- 修改server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
URIEncoding="UTF-8"
enableLookups="false"
tcpNoDelay="true"
compression="on" compressionMinSize="2048"
maxThreads="20000" connectionTimeout="-1"
compressableMimeType="application/json,text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"/>
https的也要修改:
<Connector SSLEnabled="true" clientAuth="false"
port="8443" keystoreFile="/root/java/keystore/server.jks" keystorePass="123456"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS"
URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"
acceptCount="1000" maxThreads="1000" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false" tcpNoDelay="true"
compression="on" compressionMinSize="2048"
compressableMimeType="application/json,text/html,text/xml,text/javascript,text/css,text/plain" />
- JVM启动参数
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
参考网址:
http://www.cnblogs.com/baibaluo/archive/2011/08/23/2150305.html
http://ifeve.com/tomcat-connector-tuning-2/
http://sndapk.blog.51cto.com/5385144/1306278
***** Data Analytics : Technology Area *****
1. Real Time Analytics : Apache Storm
2. In-memory Analytics : Apache Spark
3. Search Analytics : Apache Elastic search, SOLR
4. Log Analytics : Apache ELK Stack,ESK Stack(Elastic Search, Log
Stash, Spark Streaming, Kibana)
5. Batch Analytics : Apache MapReduce
***** NO SQL DB *****
1. MongoDB
2. Hbase
3. Cassandra
***** SOA *****
1. Oracle SOA
2. JBoss SOA
3. TiBco SOA
4. SOAP, RESTful Webservices
最近接项目要求,要在svn主干上创建分支,用分支来进行程序的bug修改,而主干上进行新功能的开发。分支上的bug修改完,发布后,可以合并到主干上。项目程序可以在主干和分支之间进行切换,来实现主干和分支的同时维护。
1.创建分支
创建分支实际上就是将程序copy一份到指定的分支目录,如下图示:

在项目名称上点击右键,弹出菜单,选择“Team”,再选择“Branch/Tag”,弹出下面的页面:

上图中的“Copy to URL”填写创建新分支的路径地址,后面会将程序copy到该目录下,形成新的分支。点击“Next”:

选择当前最新的版本,点击“Next”

如果勾选了上图下面的switch working copy to new branch/tag,eclipse的程序项目会自动切换到分支下。这里我们不选择,待会自己切换。
这样就创建了一个1.0的分支
2.合并
可以从主干合并到分支,也可以从分支合并到主干,根据需要可以选择合适的选项,如下图:

上图中的选项:
1) 从主干合并到分支
2) 从分支合并到主干
3) 将主干上的修改合并到分支
4) 合并2个分支到主干
5) 从主干到分支,手工指定不需要合并的修改
6) 从主干到分支,手工指定要合并的修改

上图显示没有任何修改,所以不用进行合并。
3.切换
在项目名称上点击右键,选择“Team” –> “switch to another Branch/Tag/Revision”。

选择需要切换的目的地址,点击ok即可。
这样,在项目里就可以在主干和若干分支间进行任意切换,来实现对不同版本/分支的程序进行修改提交操作。
实习期间mentor让看看Tuscany——apache的一个顶级项目。之前一直没有接触过,听mentor说了下用途过后,感觉其像是alibaba的分布式服务框架Dubbo,简要看了看,似乎和RMI也有相关性。总之它也是面向服务的分布式框架。经过一下午的尝试,发现Tuscany 2和Tuscany 1还是有比较大的不同(API方面、设计思想没有深入研究不知道),网上关于Tuscany的资料也不多,所以在此写文章mark一下。
Tuscany 1的API参考这位博主http://blog.csdn.net/ajun_studio/article/details/7770023
1. 准备
首先是在工程中引入Tuscany 2.0.1的jar包,从一个Apache的China镜像上不难找到(PS:Tuscany 1在官网上已经不维护了)。
工程需要实现客户端调用远程服务器端的服务的功能。该项目中调用远程完成“加”的功能。
2. 入门
首先添加IAdd接口
package com.ajun.tuscany.server;
public interface IAdd {
double add(double n1,double n2);
}
然后是实现类Addpackage com.ajun.tuscany.server;
public class Add implements IAdd {
@Override
public double add(double n1, double n2) {
// TODO Auto-generated method stub
return n1 + n2;
}
}
加减乘除都属于“计算”类,此处为了简便,只实现“加”方法。然后是“计算”的接口。package com.ajun.tuscany.server;
public interface ICalculator {
double add(double n1, double n2);
}
然后是“计算”的实现,注意一定要在setter中加入@Reference,否则会报错,这里类似于Spring的注入。package com.ajun.tuscany.server;
import org.oasisopen.sca.annotation.Reference;
public class Calculator implements ICalculator {
private IAdd add;
public IAdd getAdd() {
return add;
}
@Reference
public void setAdd(IAdd add) {
this.add = add;
}
@Override
public double add(double n1, double n2) {
// TODO Auto-generated method stub
return this.add.add(n1, n2);
}
}
到此,基本的业务逻辑类就编写好了,接下来,是Tuscany中重要的配置文件,即XXX.composite,其本质也是一个xml。如果不是面向分布式服务,该xml文件结构类似Spring的application.xml。下面是Calculator.composite,注意配置文件中reference,name标记为add,应该也是同Spring的大写首字母规则,通过settrt注入。<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
targetNamespace="http://sample"
xmlns:sample="http://sample"
xmlns:scallop="http://scallop/xmlns/sca/1.1"
name="Calculator" >
<component name="CalculatorServiceComponent">
<implementation.java class="com.ajun.tuscany.server.Calculator" />
<reference name="add" target="AddComponent"/>
</component>
<component name="AddComponent">
<implementation.java class="com.ajun.tuscany.server.Add" />
</component>
</composite>
最后是运行main的类package com.ajun.tuscany.server;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class StartService {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("service启动");
ICalculator c = node.getService(Calculator.class,
"CalculatorServiceComponent");
System.out.println(c.add(2, 2));
}
}
运行输出如下2014-11-10 17:39:24 org.apache.tuscany.sca.node.impl.NodeFactoryImpl loadContributions
信息: Loading contribution: file:/E:/HuRanjie/EclipseWorkspace/Calculatoer_01/bin/
2014-11-10 17:39:24 org.apache.tuscany.sca.host.rmi.DefaultRMIHost registerService
信息: RMI service registered: rmi://127.0.0.1:8099/CalculatorRMIService
2014-11-10 17:39:24 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
信息: Add endpoint - binding.rmi - rmi://127.0.0.1:8099/CalculatorRMIService
2014-11-10 17:39:24 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
信息: Add endpoint - binding.sca - AddComponent/Add
service启动
4.0
3. 远程调用rmi
上面并没有将“计算”类作为一个服务,暴露给远程调用,只是实现了本地的装配。下面将其作为服务给远程调用,后面可以看到,只需要暴露一个包括host、port、serviceName
首先,修改配置文件,修改为如下样子——在本地(127.0.0.1)的8099端口暴露出名字为CalculatorRMIService的服务
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
targetNamespace="http://sample"
xmlns:sample="http://sample"
xmlns:scallop="http://scallop/xmlns/sca/1.1"
name="Calculator" >
<component name="CalculatorServiceComponent">
<implementation.java class="com.ajun.tuscany.server.Calculator" />
<service name="Calculator">
<interface.java interface="com.ajun.tuscany.server.ICalculator"/>
<tuscany:binding.rmi uri="rmi://127.0.0.1:8099/CalculatorRMIService"/>
</service>
<reference name="add" target="AddComponent"/>
</component>
<component name="AddComponent">
<implementation.java class="com.ajun.tuscany.server.Add" />
</component>
</composite>
服务器端的main主要功能是启动该服务,如下
package com.ajun.tuscany.server;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class StartService {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("service启动");
}
}
客户端通过rmi调用服务器端的服务,来实现功能,如下
package com.ajun.tuscany.client;
import java.rmi.Naming;
import com.ajun.tuscany.server.ICalculator;
public class CalculatorClient {
public static void main(String[] args) throws Exception {
ICalculator c= (ICalculator) Naming.lookup("//127.0.0.1:8099/CalculatorRMIService");
System.out.println(c.add(1, 2));
}
}
启动服务端输出
2014-11-10 18:00:30 org.apache.tuscany.sca.node.impl.NodeImpl start
信息: Starting node: http://tuscany.apache.org/sca/1.1/nodes/default0 domain: default
2014-11-10 18:00:30 org.apache.tuscany.sca.node.impl.NodeFactoryImpl loadContributions
信息: Loading contribution: file:/E:/HuRanjie/EclipseWorkspace/Calculatoer_01/bin/
2014-11-10 18:00:31 org.apache.tuscany.sca.host.rmi.DefaultRMIHost registerService
信息: RMI service registered: rmi://127.0.0.1:8099/CalculatorRMIService
2014-11-10 18:00:31 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
信息: Add endpoint - binding.rmi - rmi://127.0.0.1:8099/CalculatorRMIService
2014-11-10 18:00:31 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
信息: Add endpoint - binding.sca - AddComponent/Add
service启动
客户端输出
3.0
SequoiaDB(巨杉数据库)是一款分布式文档型NoSQL数据库,是业界唯一支持事务和SQL的产品。SequoiaDB既可作为Hadoop与Spark的数据源以满足实时查询和分析的混合负载,也可独立作为高性能、
灵活易用的数据库被应用程序直接使用。SequoiaDB已拥有的客户包括知名IT互联网公司和世界五百强企业。
http://www.sequoiadb.com/index.php?p=demo