javaweb icon indicating copy to clipboard operation
javaweb copied to clipboard

http://www1350.github.io/

Results 100 javaweb issues
Sort by recently updated
recently updated
newest added

方法1: 使用TreeMap,可以参考下面的代码 ``` public class Testing { public static void main(String[] args) { HashMap map = new HashMap(); ValueComparator bvc = new ValueComparator(map); TreeMap sorted_map = new TreeMap(bvc); map.put("A",99.5); map.put("B",67.4);...

java基础

https://github.com/silence940109/Java/tree/master/Java_Singleton

http://blog.163.com/lnsjc321@126/blog/static/5348428720154325730234/

中间件

高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法发微博,发微信等。一般而言,衡量高可用做到什么程度可以通过一年内服务不可用时间作为参考,要做到3个9的可用性,一年内只能累计有8个小时不可服务,而如果要做到5个9的可用性,则一年内只能累计5分钟服务中断。所以虽说每个公司都说自己的服务是7*24不间断的,但实际上能做到5个9的屈指可数,甚至根本做不到,国内互联网巨头BAT(百度,阿里巴巴,腾讯)都有因为故障导致的停服问题。对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能保证整个系统的高可用。对于数据库服务而言,高可用可能更复杂,对用户的服务可用,不仅仅是能访问,还需要有正确性保证,因此讨论数据库的高可用方案时,一般会同时考虑方案中数据一致性问题。今天这篇文章主要讨论MySQL数据库的高可用方案,介绍每种方案的特性以及优缺点,本文是对各种方案的总结,希望抛砖引玉,和大家一起讨论。 1.基于共享存储的方案SAN 方案介绍:SAN(Storage Area Network)简单点说就是可以实现网络中不同服务器的数据共享,共享存储能够为数据库服务器和存储解耦。使用共享存储时,服务器能够正常挂载文件系统并操作,如果服务器挂了,备用服务器可以挂载相同的文件系统,执行需要的恢复操作,然后启动MySQL。共享存储的架构如下: ![image](https://cloud.githubusercontent.com/assets/7789698/21716269/82913240-d444-11e6-8535-5a0ae89c4d24.png) 优点: 1.可以避免存储外的其它组件引起的数据丢失。 2.部署简单,切换逻辑简单,对应用透明。 3.保证主备数据的强一致。 限制或缺点: 1.共享存储是单点,若共享存储挂了,则会丢失数据。 2.价格比价昂贵。 2.基于磁盘复制的方案 DRBD 方案介绍:DRBD(Distributed Replicated Block Device)是一种磁盘复制技术,可以获得和SAN类似的效果。DBRD是一个以linux内核模块方式实现的块级别同步复制技术。它通过网卡将主服务器的每个块复制到另外一个服务器块设备上,并在主设备提交块之前记录下来。DRBD与SAN类似,也是有一个热备机器,开始提供服务时会使用和故障机器相同的数据,只不过DRBD的数据是复制存储,不是共享存储。DRBD的架构图如下: ![image](https://cloud.githubusercontent.com/assets/7789698/21716274/8cba63b8-d444-11e6-964e-aa18283690b4.png) 优点: 1.切换对应用透明 2.保证主备数据的强一致。 限制或缺点: 1.影响写入性能,由于每次写磁盘,实质都需要同步到网络服务器。 2.一般配置两节点同步,可扩展性比较差 3.备库不能提供读服务,资源浪费 http://blog.chinaunix.net/uid-20639775-id-3337484.html 3.基于主从复制(单点写)方案 前面讨论的两种方案分别依赖于底层的共享存储和磁盘复制技术,来解决MYSQL服务器单点和磁盘单点的问题。而实际生产环境中,高可用更多的是依赖MySQL本身的复制,通过复制为Master制作一个或多个热副本,在Master故障时,将服务切换到热副本。下面的几种方案都是基于主从复制的方案,方案由简单到复杂,功能也越来越强大,实施难度由易到难,各位可以根据实际情况选择合适的方案。...

MySql

之前看到有开源项目用了github来做maven仓库,寻思自己也做一个。研究了下,记录下。 简单来说,共有三步: 1. deploy到本地目录 2. 把本地目录提交到gtihub上 3. 配置github地址为仓库地址 # 配置local file maven仓库 deploy到本地 maven可以通过http, ftp, ssh等deploy到远程服务器,也可以deploy到本地文件系统里。 例如把项目deploy到/home/hengyunabc/code/maven-repo/repository/目录下: ``` hengyunabc-mvn-repo file:/home/hengyunabc/code/maven-repo/repository/ ``` 通过命令行则是: mvn deploy -DaltDeploymentRepository=hengyunabc-mvn-repo::default::file:/home/hengyunabc/code/maven-repo/repository/ 推荐使用命令行来deploy,避免在项目里显式配置。 https://maven.apache.org/plugins/maven-deploy-plugin/ https://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html # 把本地仓库提交到github上...

https://github.com/alibaba/dubbo/wiki/user-guide-sample#%E5%9B%9E%E5%A3%B0%E6%B5%8B%E8%AF%95 # 启动时检查 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。 如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上。 可以通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。 关闭某个服务的启动时检查:(没有提供者时报错) ``` ``` 关闭所有服务的启动时检查:(没有提供者时报错) ``` ``` 关闭注册中心启动时检查:(注册订阅失败时报错) ``` ``` 也可以用dubbo.properties配置: ``` dubbo.reference.com.foo.BarService.check=false dubbo.reference.check=false dubbo.consumer.check=false dubbo.registry.check=false ``` 也可以用-D参数: ``` java -Ddubbo.reference.com.foo.BarService.check=false java -Ddubbo.reference.check=false java -Ddubbo.consumer.check=false...

中间件

http://blog.jobbole.com/109466/ http://blog.jobbole.com/108834/?utm_source=blog.jobbole.com&utm_medium=relatedPosts http://blog.jobbole.com/106868/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

工具

官网 http://www.liquibase.org/index.html https://github.com/liquibase/liquibase ``` ``` ``` @Configuration public class LiquibaseConfig { @Autowired private DataSource dataSource; @Bean public liquibase.integration.spring.SpringLiquibase springLiquibase() throws LiquibaseException { liquibase.integration.spring.SpringLiquibase liquibase = new liquibase.integration.spring.SpringLiquibase(); liquibase.setChangeLog("classpath:db/db.changelog-master.xml"); liquibase.setDataSource(dataSource); liquibase.setShouldRun(true);...

工具

Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene为开发人员提供了相当完整的工具包,可以非常方便地实现强大的全文检索功能。 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。 全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文等东方文字则需要切分字词,以达到按词索引的目的 全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向WWW[1]的开发接口、二次应用开发接口等等。功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能,外围则由各种不同应用具有的功能组成。结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等等共同构成了全文检索系统。图1.1展示了上述全文检索系统的结构与功能。 ![image](https://cloud.githubusercontent.com/assets/7789698/21489049/7d5014fc-cc21-11e6-8e33-628e68d7a911.png) 在上图中,我们看到:全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。一个全文检索应用的优异程度,根本上由全文检索引擎来决定。因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。另一个方面,一个优异的全文检索引擎,在做到效率优化的同时,还需要具有开放的体系结构,以方便程序员对整个系统进行优化改造,或者是添加原有系统没有的功能。比如在当今多语言处理的环境下,有时需要给全文检索系统添加处理某种语言或者文本格式的功能,比如在英文系统中添加中文处理功能,在纯文本系统中添加XML或者HTML格式的文本处理功能,系统的开放性和扩充性就十分的重要。 Lucene作为一个优秀的全文检索引擎,其系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式,其次通过抽象将系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式的处理,最终达成了一个低耦合高效率,容易二次开发的检索引擎系统。 以下将讨论Lucene系统的结构组织,并给出系统结构与源码组织图: ![image](https://cloud.githubusercontent.com/assets/7789698/21489058/980be366-cc21-11e6-805c-aa0f69567507.png) 从图中我们清楚的看到,Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。Lucene的将所有源码分为了7个模块(在java语言中以包即package来表示),各个模块所属的系统部分也如上图所示。需要说明的是org.apache.lucene.queryPaser是做为org.apache.lucene.search的语法解析器存在,不被系统之外实际调用,因此这里没有当作对外接口看待,而是将之独立出来。 从面象对象的观点来考察,Lucene应用了最基本的一条程序设计准则:引入额外的抽象层以降低耦合性。首先,引入对索引文件的操作org.apache.lucene.store的封装,然后将索引部分的实现建立在(org.apache.lucene.index)其之上,完成对索引核心的抽象。在索引核心的基础上开始设计对外的接口org.apache.lucene.search与org.apache.lucene.analysis。在每一个局部细节上,比如某些常用的数据结构与算法上,Lucene也充分的应用了这一条准则。在高度的面向对象理论的支撑下,使得Lucene的实现容易理解,易于扩展。 Lucene在系统结构上的另一个特点表现为其引入了传统的客户端服务器结构以外的的应用结构。Lucene可以作为一个运行库被包含进入应用本身中去,而不是做为一个单独的索引服务器存在。这自然和Lucene开放源代码的特征分不开,但是也体现了Lucene在编写上的本来意图:提供一个全文索引引擎的架构,而不是实现。 了解数据流分析的重要性: 理解Lucene系统结构的另一个方式是去探讨其中数据流的走向,并以此摸清楚Lucene系统内部的调用时序。在此基础上,我们能够更加深入的理解Lucene的系统结构组织,以方便以后在Lucene系统上的开发工作。这部分的分析,是深入Lucene系统的钥匙,也是进行重写的基础。 Lucene系统中的主要的数据流以及它们之间的关系图: ![image](https://cloud.githubusercontent.com/assets/7789698/21489062/9ed60334-cc21-11e6-8bb1-2fa1df0ce6b5.png) 图2.2很好的表明了Lucene在内部的数据流组织情况,并且沿着数据流的方向我们也可以对与Lucene内部的执行时序有一个清楚的了解。现在将图中的涉及到的流的类型与各个逻辑对应系统的相关部分的关系说明一下。 图中共存在4种数据流,分别是文本流、token流、字节流与查询语句对象流。文本流表示了对于索引目标和交互控制的抽象,即用文本流表示了将要索引的文件,用文本流向用户输出信息;在实际的实现中,Lucene中的文本流采用了UCS-2作为编码,以达到适应多种语言文字的处理的目的。Token流是Lucene内部所使用的概念,是对传统文字中的词的概念的抽象,也是Lucene在建立索引时直接处理的最小单位;简单的讲Token就是一个词和所在域值的组合,后面在叙述文件格式时也将继续涉及到token,这里不详细展开。字节流则是对文件抽象的直接操作的体现,通过固定长度的字节(Lucene定义为8比特位长,后面文件格式将详细叙述)流的处理,将文件操作解脱出来,也做到了与平台文件系统的无关性。查询语句对象流则是仅仅在查询语句解析时用到的概念,它对查询语句抽象,通过类的继承结构反映查询语句的结构,将之传送到查找逻辑来进行查找的操作。 图中的涉及到了多种逻辑,基本上直接对应于系统某一模块,但是也有跨模块调用的问题发生,这是因为Lucene的重用程度非常好,因此很多实现直接调用了以前的工作成果,这在某种程度上其实是加强了模块耦合性,但是也是为了避免系统的过于庞大和不必要的重复设计的一种折衷体现。词法分析逻辑对应于org.apache.lucene.analysis部分。查询语句语法分析逻辑对应于org.apache.lucene.queryParser部分,并且调用了org.apache.lucene.analysis的代码。查询结束之后向评分排序逻辑输出token流,继而由评分排序逻辑处理之后给出文本流的结果,这一部分的实现也包含在了org.apache.lucene.search中。索引构建逻辑对应于org.apache.lucene.index部分。索引查找逻辑则主要是org.apache.lucene.search,但是也大量的使用了org.apache.lucene.index部分的代码和接口定义。存储抽象对应于org.apache.lucene.store。没有提到的模块则是做为系统公共基础设施存在。 首先,我们需要的是按照目标语言的词法结构来构建相应的词法分析逻辑,实现Lucene在org.apache.lucene.analysis中定义的接口,为Lucene提供目标系统所使用的语言处理能力。Lucene默认的已经实现了英文和德文的简单词法分析逻辑(按照空格分词,并去除常用的语法词,如英语中的is,am,are等等)。在这里,主要需要参考实现的接口在org.apache.lucene.analysis中的Analyzer.java和Tokenizer.java中定义,Lucene提供了很多英文规范的实现样本,也可以做为实现时候的参考资料。其次,需要按照被索引的文件的格式来提供相应的文本分析逻辑,这里是指除开词法分析之外的部分,比如HTML文件,通常需要把其中的内容按照所属于域分门别类加入索引,这就需要从org.apache.lucene.document中定义的类document继承,定义自己的HTMLDocument类,然后就可以将之交给org.apache.lucene.index模块来写入索引文件。完成了这两步之后,Lucene全文检索引擎就基本上完备了。这个过程可以用下图表示: ![image](https://cloud.githubusercontent.com/assets/7789698/21489081/adb2e1ce-cc21-11e6-976f-29c0c2e02bce.png) # Lucene索引文件格式 首先在Lucene的文件格式中,以字节为基础,定义了如下的数据类型: 表 3.1 Lucene文件格式中定义的数据类型 |数据类型 | 所占字节长度(字节)...

搜索引擎