Apache+Mina源码研究
- 格式:pdf
- 大小:3.22 MB
- 文档页数:28
Servlet,Tomcat,Jetty,Netty,Mina对⽐Servlet, Tomcat, Jetty, Netty,Mina结论先说结论吧: Servlet是⼀种Java EE规范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。
Servlet本⾝并不能处理外部请求,需要Servlet容器的配合,Netty和MINA是⽹络框架,我们可以使⽤Netty造出⾃⼰类似Tomcat的web服务器。
简单的关系的话 Tomcat = Jetty > Netty & MINA > Servlet。
Servletwiki上的定义:Servlet 是⽤ Java 编写的服务器端程序。
其主要功能在于交互式地浏览和修改数据,⽣成动态 Web 内容。
狭义的 Servlet 是指Java 语⾔实现的⼀个接⼝,⼴义的 Servlet 是指任何实现了这个 Servlet 接⼝的类,⼀般情况下,⼈们将 Servlet 理解为后者。
Tomcatwiki的定义:Tomcat 是由 Apache 软件基⾦会下属的 Jakarta 项⽬开发的⼀个 Servlet 容器,按照 Sun Microsystems 提供的技术规范,实现了对 Servlet 和 JavaServer Page(JSP)的⽀持,并提供了作为 Web 服务器的⼀些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。
由于 Tomcat 本⾝也内含了⼀个 HTTP 服务器,它也可以被视作⼀个单独的 Web 服务器。
但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是⼀个⽤C语⾔实现的 HTTPWeb服务器;这两个 HTTP web server 不是捆绑在⼀起的。
Apache Tomcat 包含了⼀个配置管理⼯具,也可以通过编辑XML格式的配置⽂件来进⾏配置。
使用MINA构建NIO程序mina是非常好的C/S架构的java服务器,这里转了一篇关于它的使用感受。
前言MINA是Trustin Lee最新制作的Java通讯框架。
通讯框架的主要作用是封装底层IO操作,提供高级的操作API。
比较出名的通讯框架有C++的ACE、Python的Twisted,而Java的通讯框架还有QuickServer、Netty2、Cindy、Grizzly 等。
2004年6月,Trustin Lee发布了一个通讯框架Netty2,是Java界第一个事件模型架构的通讯框架,Cindy也从中借鉴了不少思想。
由于Netty2的架构不是很好,Trustin Lee在2004年底加入Apache Directory组之后,重写了整个框架,取名为MINA。
MINA是一个基于Java NIO的通讯框架,Java从1.4开始引入NIO,提供了一个非阻塞、高性能的IO底层。
目前使用MINA的产品并不是很多,比较出名的就有Apache Directory、Openfire (Jive出品的一个XMPP产品)、red5(研究flash流媒体flv技术的朋友应该很清楚这个东西,adobe fms的竞争者,国内也有视频网站在使用)等等。
笔者在07年初的时候,公司新项目需要用Java实现一个Socket Server,对比了Netty2、Cindy、QuickServer和MINA。
当时Netty2已经停止开发,也找不到官方网站和代码,比较了另外三个框架之后,毅然选择了当时文档比较缺乏和使用群较少的MINA,一年以来的使用经验来看,感觉还是很不错的,MINA有着清晰的架构,很方便做自定义的扩充。
在1.0发布之后,官方网站充实了很多,增加了不少文档,也听到越来越多的朋友开始使用MINA。
后来专门针对JDK 1.5发布了1.1的版本,使用JDK内置的concurrent代替backport-util-concurrent。
关键字: 分布式云计算Google的核心竞争技术是它的计算平台。
Google的大牛们用了下面5篇文章,介绍了它们的计算设施。
GoogleCluster: /archive/googlecluster.htmlChubby:/papers/chubby.htmlGFS:/papers/gfs.htmlBigTable:/papers/bigtable.htmlMapReduce:/papers/mapreduce.html很快,Apache上就出现了一个类似的解决方案,目前它们都属于Apache的Hadoop项目,对应的分别是:Chubby-->ZooKeeperGFS-->HDFSBigTable-->HBaseMapReduce-->Hadoop目前,基于类似思想的Open Source项目还很多,如Facebook用于用户分析的Hive。
HDFS作为一个分布式文件系统,是所有这些项目的基础。
分析好HDFS,有利于了解其他系统。
由于Hadoop的HDFS和MapReduce 是同一个项目,我们就把他们放在一块,进行分析。
下图是MapReduce整个项目的顶层包图和他们的依赖关系。
Hadoop包之间的依赖关系比较复杂,原因是HDFS提供了一个分布式文件系统,该系统提供API,可以屏蔽本地文件系统和分布式文件系统,甚至象Amazon S3这样的在线存储系统。
这就造成了分布式文件系统的实现,或者是分布式文件系统的底层的实现,依赖于某些貌似高层的功能。
功能的相互引用,造成了蜘蛛网型的依赖关系。
一个典型的例子就是包conf,conf用于读取系统配置,它依赖于fs,主要是读取配置文件的时候,需要使用文件系统,而部分的文件系统的功能,在包fs中被抽象了。
Hadoop的关键部分集中于图中蓝色部分,这也是我们考察的重点。
下面给出了Hadoop的包的功能分析。
Hadoop源代码分析(三)由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化。
一、概述Manticoresearch是一个开源的全文搜索引擎,它是用C++开发的,提供了快速、可靠和高效的搜索功能。
它可以被用于构建各种类型的应用程序,包括全球信息站、电子商务评台、企业内部搜索系统等。
本文将对Manticoresearch的源码进行解读,深入探讨其内部机制和原理。
二、Manticoresearch的核心功能Manticoresearch具有以下核心功能:1. 实时索引Manticoresearch支持实时索引,用户可以在数据变更后立即进行搜索操作,无需等待索引的重建。
这使得Manticoresearch可以被用于需要实时更新数据的应用场景。
2. 分布式搜索Manticoresearch支持分布式搜索,可以进行跨多个节点的搜索操作,提供了高可用性和扩展性。
3. 多种数据源支持Manticoresearch支持多种数据源,包括MySQL、PostgreSQL、MongoDB等,可以轻松地集成到不同的数据存储系统中。
4. 多种搜索方式Manticoresearch支持全文搜索、分面搜索、模糊搜索等多种搜索方式,满足了不同场景下的搜索需求。
三、Manticoresearch的源码解读1. 源码结构Manticoresearch的源码结构清晰,分为核心引擎、索引模块、搜索模块等多个部分。
其中,核心引擎负责数据的存储和管理,索引模块负责索引的构建和维护,搜索模块负责实现各种搜索算法和方式。
2. 数据存储Manticoresearch采用了倒排索引的方式进行数据存储。
在倒排索引中,每个关键词都对应一个包含这个关键词的文档列表,这使得搜索效率非常高。
3. 搜索算法Manticoresearch实现了多种搜索算法,包括布尔搜索、短语搜索、通配符搜索等。
这些搜索算法都是在倒排索引的基础上实现的,通过高效的数据结构和算法来提高搜索速度。
4. 分布式搜索Manticoresearch的分布式搜索功能是基于分片的。
最近有幸负责参与开发公司的CMPP短信网关程序,采用的是Apache Mina框架实现。
通过该项目对Socket通信、长连接有了更深一步的理解,于是就想试试将Mina用到Android平台的信息推送上。
经过了解发现,目前已经有不少成型的框架能够实现Android平台的信息推送,特别是AndroidPn。
平时我们开发手机客户端,都少不了要于服务器交互,那么当服务器端有新的数据时,客户端是怎么知道的呢?一般可以采用如下两种方式来实现:1)客户端定期(每隔一段时间,轮询)向服务器发起请求,以检测是否有新的数据。
如果轮询的频率太慢,可能导致获取的信息已经过时;如果轮询的频率过快会很耗电、耗手机流量;2)采用Android的广播机制,拦截服务端发送的短信。
即当服务器端有新的数据时,服务器向所有Android客户端发送短信,客户端基于广播机制将短信拦截并通过手机客户端应用呈现。
该方案成本较高,需要向电信运营商申请短信发送端口。
以上两种实现方式多少都存在着弊端,并不能真正满足要求,那有没有更好的实现方式呢?当然有,那就是信息推送。
推送就意味着当有新的数据时,服务器端会主动将数据“推”到客户端,而不需要客户端不停地检测。
这里就不再过多地对“信息推送”进行解释了,下面将直接通过一个AndroidPn示例来演示。
AndroidPn即Android Push Notification,它是Android平台的信息推送框架,基于XMPP协议的Java实现,它包含了完整的服务器端和客户端程序。
因此,我们不用开发一行代码,就能体验到信息推送,还在等什么,马上动手吧。
AndroidPn框架的下载地址:/projects/androidpn/files/,将以下文件全部下载:其中,androidpn-server是服务端程序,它包含可执行脚本,能够直接启动运行;android-demoapp是演示示例,一会就直接用它来演示;androidpn-client是客户端源代码,你可以用它来研究androidpn的内部实现。
Openfire源码研究Openfire源码目录结构1.build目录:build目录下收录的是生成安装文件(例如:rpm)所要的一些文件,例如JRE等。
2.resources目录:resources目录下收录的是一些为实现国际化(i18n)和本地化的一些编码文件(例如:英文,中文,法文,德文等)。
3.documentation目录:documentation目录下收录的是一些关于Openfire安装和配置的信息,但最终要的是这里有Openfire开发的Javadoc。
4.src目录:顾名思义这个src文件夹就是我们想要的Openfire源代码了,这下面又有许多文件夹,我们只要Java文件夹就好,这里面实现的Openfire的核心功能,通过它就可以调试Openfire了。
命名规则Openfire中常见的类名后缀命名包括Starter、Plugin、Listener、Dispatcher、Handler、Manager、Provider,通常情况下,这些命名类包括如下意义:XXStarter系统启动类,如org.jivesoftware.openfire.starter.ServerStarter,调用其start()方法可启动系统应用。
XXListener业务的最终处理类。
XXDispatcher调度类,其中有很多关键方法,如addListener(),以组合的方式,为类内定义的静态Set<XXListener>实例添加XXListener对象。
以便调用dispatchEvent(String property, EventType eventType, Map<String, Object> params)方法遍历处理Set集中的XXListener对象(通过调用XXListener对象的各实际方法完成实际业务)。
XXPlugin实现Plugin接口的插件类,需实现initializePlugin(PluginManager manager, File pluginDirectory)方法和destroyPlugin()方法。
TINY源码分析一、文件概述MAIN。
C: 主函数GLOBALS。
H:全局定义的文件SCAN。
C/SCAN。
H:词法分析PARSE.C/PARSE。
H:语法分析UTIL。
C/UTIL。
H:构造树SYMTAB。
C/SYMTAB.H:符号表CGEN。
C/CGEN.H:生成”汇编代码”CODE.C/CODE。
H:这个只是用来把分析过程输出到屏幕的。
二、各个文件的分析1。
MAIN。
C:主要有三个FILE*句柄:source-—源代码文件。
listing——显示分析过程的文件,这里重定向到stdout。
code—-目标汇编代码文件。
从该文件中可知程序运行的流程:检查参数正确否(tiny。
exe filename)->构造语法树(调用parse函数)->根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数。
2。
GLOBALS。
H:定义了关键字个数8个。
定义了关键字,运算符等内容的枚举值.定义了语句类型的枚举值,这个决定树的结点。
定义了变量类型(也就三种,void, integer,boolean)。
定义了树的节点--这个最重要了!!其结构如下所示: typedef struct treeNode{struct treeNode *child[MAXCHILDREN];struct treeNode *sibling;int lineno;NodeKind nodekind;union {StmtKind stmt; ExpKind exp;}kind;union { TokenType op;int val;char * name;}attr;ExpType type;/* for type checking of exps */}TreeNode;3.UTIL。
C/UTIL。
H主要函数TreeNode *newStmtNode(StmtKind kind)此函数创建一个有关语法树的声明节点TreeNode *newExpNode(ExpKind kind)此函数创建一个有关语法树的表述节点char *copyString(char * s)此函数分配和创建一个新的已存在树的复制void printTree(TreeNode * tree )输出一个语法树这两个文件主要是关于语法树的创建和输出4.SCAN。
JavaSSH库使⽤简介:Apachesshd和JSch(JavaSecureChannel)1.Apache sshdApache sshd是⼀个SSH协议的100%纯Java库,⽀持客户端和服务器。
sshd库基于Apache MINA项⽬(可伸缩⾼性能的异步IO库)。
官⽅⽹站:客户端⽰例代码:public void clentTest() throws IOException{String cmd="ifconfig";SshClient client=SshClient.setUpDefaultClient();client.start();ClientSession session=client.connect("bellring", "10.2.48.179", 22).await().getSession();session.addPasswordIdentity("bellring"); //session.addPublicKeyIdentity(SecurityUtils.loadKeyPairIdentity("keyname", new FileInputStream("priKey.pem"), null));if(!session.auth().await().isSuccess())System.out.println("auth failed");ChannelExec ec=session.createExecChannel(cmd);ec.setOut(System.out);ec.open();ec.waitFor(ClientChannel.CLOSED, 0);ec.close();client.stop();}public void sshdClientSftpTest() throws IOException, InterruptedException{Path src=Paths.get("src_sshd.txt");Files.deleteIfExists(src);Files.createFile(src);Files.write(src, "adsfa\nsdfs".getBytes());SshClient client=SshClient.setUpDefaultClient();client.start();ClientSession session=client.connect("bellring", "10.2.48.179", 22).await().getSession();//session.addPasswordIdentity("bellring"); session.addPublicKeyIdentity(SecurityUtils.loadKeyPairIdentity("keyname", new FileInputStream("priKey.pem"), null));if(!session.auth().await().isSuccess())System.out.println("auth failed");SftpClient sftp=session.createSftpClient();for(DirEntry de:sftp.readDir("."))System.out.println(de.filename+" "+de.attributes.type);OutputStream os=sftp.write("test/dst_sshd.txt");Files.copy(src, os);os.close();//sftp.remove("delete_file.txt");InputStream is=sftp.read("test/dst_sshd.txt");Path dst=Paths.get("dst1_sshd.txt");Files.deleteIfExists(dst);Files.copy(is, dst);is.close();sftp.close();client.stop();}服务器端⽰例代码:public void serverTest() throws IOException, InterruptedException{SshServer sshd = SshServer.setUpDefaultServer();sshd.setPort(22);//*give host key generator a path, when sshd server restart, the same key will be load and used to authenticate the serversshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(Paths.get("hostkey.ser")));sshd.setPasswordAuthenticator(new PasswordAuthenticator(){@Overridepublic boolean authenticate(String username, String password, ServerSession session) { System.out.println("authen: user="+username+" password="+password);if("bellring".equals(username) && "123456".equals(password))return true;return false;}});//use file ~/.ssh/authorized_keyssshd.setPublickeyAuthenticator(new DefaultAuthorizedKeysAuthenticator(false));//* CommandFactory can be userd in addition to the ShellFactory,//* it can also be used instead of the ShellFactory.//* The CommandFactory is used when direct commands are sent to the SSH server,//* as this is the case when running ssh localhost shutdown or scp xxxScpCommandFactory scpCmdFactory=new ScpCommandFactory();scpCmdFactory.setDelegateCommandFactory(new CommandFactory() {public Command createCommand(String command) {System.out.println("command = \"" + command + "\"");return new ProcessShellFactory(("cmd /c "+command).split(" ")).create();}});sshd.setCommandFactory(scpCmdFactory);sshd.start();}2.JSch(Java Secure Channel)jsch也是SSH2的纯Java实现。