版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panhaigang123/article/details/79587633
======freemarker=========================================
选择freemarker替换jsp原因
freemarker模板不编译成类所以没有PermGen<盘杰嗯>问题
支持jsp标签 支持json数据格式 可以直接从数据源加载页面和模板,动态更新
什么是freemarker
freemarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(html网页,电子邮件)的通用工具
freemarker的应用案例
新闻门户网站:后台添加新闻时 通过新闻数据+预定义的模板ftl生成静态的html,新闻数据插入数据库
绑定该html新闻保存的html位置 如果该新闻被推送到首页 生成首页静态html时 将该新闻的超链接指向
该文章的静态html
======lucene============================================
lucene介绍
lucene是一个Java编写的开源的全文检索引擎,自定义索引格式,容易部署,方便扩展
Lucene的原理
Lucene是基于关键词索引和查询,会把文本解析为一个个关键字存储到索引文件中
有倒排索引:正常情况下文章号对应文章中的关键词 倒排索引就变成了关键词对应拥有该关键词的所有文章
Lucene分词器
将一个短语拆分成单个有意义词来建立索引 英文可以根据分号来拆分 中文需要有专业的分词器 IK分词器 庖丁解牛
什么是solr
solr是以Lucene为内核开发的企业级搜索应用 应用程序可以通过http请求的方式(json格式)来提交索引,查询索引
提供了比Lucene更丰富的查询语言,是一个高性能,高可用的环境全文搜索引擎
solr是如何应用在项目中的
使用solrcloud搭建分片集群 至少需要2n+1台机器来满足高可用(单机故障 其他机器还原)
和搞并发(多台机器分担单机的并发压力 搭建集群来负载均衡)
=============maven=======================================
maven有哪些优点和缺点
优点
简化了项目的依赖管理
有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译
maven有很多插件,便于功能的扩展,比如自动发布版本等
缺点
maven是一个庞大的构建,学习难度大
maven采用约定优于配置的策略,虽然上手容易,一旦出了问题,难于调试
当依赖很多时,会搞的eclipse很卡
在国内很多repository无法访问,需要配置私服
maven的坐标
一般maven使用groupID(公司名) artifactId(项目名) version(版本号) packaging(项目打包的方式)
maven常见的依赖范围有哪些
compile:编译依赖,默认依赖的方式,在编译,测试,运行三个阶段都有效
test:测试依赖,只对于测试classpath有效
provided:已经提供依赖范围,测试,编译有效。运行无效,因为由容器已经提供 例如servlet-api
system:当maven仓库不存在时 指定jar包本地的位置
maven的生命周期
clean周期:主要用于清理上一次构建产生的文件 可以理解为删除target目录
默认周期
process-resources 默认处理src/main/resources/下的文件,将其输出到测试的classpath目录中
compile 编译src/main/Java下的Java文件,产生对应的class
process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中
test-compile 编译src/test/java下的Java文件,产生对应的class
test 运行测试用例
package 打包构件,即生成对应的jar,war包等
install 将构件部署到本地仓库
deploy 部署构件到远程仓库
site周期
site 产生项目的站点文档
site-deploy 将项目的站点文档部署到服务器
多模块如何聚合
配置一个打包类型为pom的聚合模块,然后在该pom中使用
<modules><module>模块项目</module></modules>
元素声明要聚合的模块
对于一个多模块项目,如何管理项目依赖的版本
通过父模块中声明<dependencyManagement>和<pluginManagement> 然后让子模块通过<parent>元素指定父模块
这样子模块在定义依赖可以只定义groupId和artifactId 自动使用version统一整个项目的依赖的版本
一个项目的依赖来源于不同的组织,可能这些依赖还会依赖别的jar包,如何保证这些传递依赖不会引起版本冲突
使用<dependency>中的<exclusion>元素 将会引起冲突的jar包去掉依赖传递 例如
<dependencies>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
<!-- 排除 -->
<exclusions>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queries</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-sandbox</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 把lucene 5.5.4的版本引入 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queries</artifactId>
<version>5.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-sandbox</artifactId>
<version>5.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>5.5.4</version>
</dependency>
</dependencies>
==========nginx=========================================
什么是Nginx
Nginx是一个高性能的http和反向代理服务器,同时也是一个非常高效的反向代理、负载均衡
为什么要用Nginx
跨平台、配置简单
非阻塞、高并发连接:处理2~3万并发连接数
内存消耗小:开启10个Nginx才占150M
内置的健康检查功能:如果有一个服务器出现宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了,
会重新请求提交到其他节点上
稳定性高:宕机的概率非常小
接收用户的请求是异步的:浏览器发送请求到Nginx服务器,他先将用户请求全部接收下来,再一次性发送给后端web服务器
极大减轻了web服务器的压力,一边接收web服务器的返回数据,一边发送给浏览器客户端
可以有多台Nginx服务器,使用dns做负载均衡(域名对应多个a<ip>记录)
事件驱动:通信机制采用epoll模型(Nio2异步非阻塞)
为什么Nginx性能这么高
有出色的事件处理机制===异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
Nginx是如何处理一个请求的
首先Nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在Nginx的master进程里面先初始化好这个监控的连接
在进行监听,然后在分出多个子进程出来,子进程会竞争承担新的连接。此时,客户端就可以向Nginx发送连接了
接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换,最后Nginx或客户端来主动关掉连接
一个连接就结束了
正向代理
如果一台机器无法上网,可以通过一台联网的机器代理,使其可以上网=====代理的对象是客户端
反向代理
隐藏了真实的服务端,反向代理服务器(Nginx就是一个性能非常好的反向代理的服务器)会把我们的请求转发到真实的服务器那里去===代理对象是服务端
动态资源、静态资源分离(动态文件与静态文件的分离)
动态资源、静态资源分离是让动态网站里的动态网页根据一定的规则把不变的资源和经常变的资源区分开来,动静资源做好拆分以后
我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
为什么要做动、静分离
动、静分离将网站静态资源与后台应用分开部署,提高用户的访问静态代码的速度,降低对后台应用访问
静态资源放到Nginx中,动态资源转发到tomcat服务器中
负载均衡
负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中
主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力
=========Rabbitmq=======================================
什么是rabbitmq
是一种消息队列,应用程序对应用程序的通信方法。应用程序通过读写出队列的消息来通信,而无需专用连接来链接他们
rabbitmq的几种消息队列
简单模式
:单个发送者(生产者)将消息发送到队列(每个队列都有一个唯一的名字) 单个接受者(消费者)获取消息
工作队列模式
:一般用于任务分配 发布者发布任务到队列 多个消息接受者接受消息 谁接受到某个消息 其他接受者就只能消费其他消息
例:12306抢票 秒杀活动
发布订阅模式
:生产者发布主题消息 订阅该主题的所有订阅者都可以接受消息 例:广播
路由模式:
生产者发布消息并指定一个routingkey 消费者有相同的routingkey才能接受消息
Topics路由模式
:生产者发布消息指定一个模糊的routingkey(*.a) 消费者满足这个模糊的routingkey(1.a)就可以接受消息
=========zookeeper=======================================
什么是zookeeper
zookeeper是一个使用树形结构存储数据的数据库 可以拥有高可用的集群(最少2n+1台机器组成),拥有两种角色leader(负责写入)+follower(分担读的压力)
zookeeper集群如何保证数据一致性
zookeeper中有一个leader该主机是用于写,写入的数据通过paxos算法 将所有的数据同步到follower服务器中
如果leader挂掉后,会重新选举一个leader
zookeeper如何存储数据
zookeeper使用树状结构存储数据
zookeeper的节点类型有哪些
永久节点:数据自动持久化到磁盘
临时节点:客户端连接时数据保存 客户端session超时或断开数据自动删除
顺序节点:顺序自动编号持久化节点
zookeeper应用场景
分布式配置中心
用于微服务注册中心 注册微服务的信息
实现分布式锁 分布式主键 秒杀
zookeeper的配置参数有哪些 具体意义
tickTime:zookeeper中的一个时间单元 zookeeper中所有时间都是以这个时间单元为基础 进行整数倍配置
initLimit:初始化同步数据花费的时间 默认为10个tickTime
syncLimit:leader和follwer之间发送心跳,检测对方是否挂掉 默认5个tickTime无回应就剔除挂掉的哪一个
dataDir:数据文件存储的目录
dataLogDir:日志文件存放的目录
clientPort:zookeeper对外服务的端口 默认2181