JAVA开发大全
2019-03-25 14:57:28 6 举报
AI智能生成
java技术栈总结
作者其他创作
大纲/内容
设计模式
为什么要使用设计模式
分类
creational(创建型)
Singleton Pattern
保证一个类仅有一个实例,并提供一个访问它的全局访问点
Factory Pattern
工厂模式
工厂模式
Static Factory Method
简单工厂
简单工厂
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定
应该创建哪一个产品类
应该创建哪一个产品类
Spring中的BeanFactory
Abstract Factory Pattern
Builder Pattern
Prototype Pattern
structural(结构型)
Adapter Patten
适配器模式
适配器模式
解决的问题:两个接口无法适配,需要一个中间类来将其适配起来
举个例子:我们经常会遇到调用第三方API的事情,但是有时候
第三方的API我们直接使用我们的接口来调用,会出现参数不能直接匹配
或者返回值不是我们想要的,那么我们就可以在第三方接口和我们自己的接口
中间加一个适配器类,这个类提供API供我们的API友好调用,同时将请求组装
调用第三方API,将返回的结果再次组装返回给我们的API
第三方的API我们直接使用我们的接口来调用,会出现参数不能直接匹配
或者返回值不是我们想要的,那么我们就可以在第三方接口和我们自己的接口
中间加一个适配器类,这个类提供API供我们的API友好调用,同时将请求组装
调用第三方API,将返回的结果再次组装返回给我们的API
behavioral(行为型)
数据结构与算法
云产品
AWS
域名解析-Route 53
* Godady
* Godady
内容分发服务器-CloudFront
负载均衡器-Load Balancers
Classic ELB
Application Load Balancer
服务器-EC2
数据库-RDS
文件存储器-S3/EFS
性能监控-Cloud Watch
后端技术
JAVA
JavaSE
基础语法
数据类型
8种基本数据类型
数值型
整型
byte
short
int
long
浮点型
float
double
字符型 char
布尔型 boolean
引用类型
类
接口
数据
枚举类型 enum
类型转换
装箱/拆箱
运算符与表达式
算术运算符
关系运算符
赋值运算符
移位运算符
位运算符
流程控制结构
顺序结构
选择(条件)结构
循环结构
重载 VS 重写
重载 overload
针对同一个类或者接口而言
同名不同参
重写 override
以继承为基础,子类可以重写父类实现的方法,从而实现自己的功能
不允许重写的两种情况
private修饰的方法
final修饰的方法
面向对象OOP
事物
对象
类
接口
三大特性
封装
属性
对象的具体特征
方法
对对象具体特征操纵的方法
继承/派生
类
子类继承父类,对父类进行扩展,Java中对类的继承只允许单继承
接口
子类实现接口,接口中定义的方法需要在子类中实现
多态
即多种形态,表现为对接口和抽象类中的抽象方法的重写,每个类可以有自己不同的实现
七大设计原则
巧记:迪衣里开合接单
巧记:迪衣里开合接单
单一职责原则
一个类的功能尽可能单一
开闭原则
对扩展开放,对修改关闭
依赖倒置原则
针对抽象编程(接口和抽象类),而不是具体实现类
里氏替换原则
所有引用其基类(父类)的地方都能透明的使用其子类对象
接口隔离原则
使用多个单一的接口,而不是继承自一个总的接口
如Collection集合中的实现类,都分别单独继承Cloneable和Serializable接口,
而不是笼统的继承Collection接口
如Collection集合中的实现类,都分别单独继承Cloneable和Serializable接口,
而不是笼统的继承Collection接口
合成复用原则
使用多各类的合成,而不是继承。我也没太懂
迪米特原则
一个类尽量不要关联其他类,不要和陌生人说话
集合框架
java.util.*
java.util.*
Collection
List
ArrayList
Collections.synchronizedList(new ArrayList<>())
了解下香不香
了解下香不香
Vector
Set
TreeSet
HashSet
Queue
LinkedList
Map
TreeMap
HashMap
WeakHashMap
HashTable
Concurrent
ConcurrentHashMap
分治思想:ConcurrentHashMap默认将hash表分为16个桶,
诸如get、put、remove等常用操作只锁住当前需要用到的桶。
分治思想:ConcurrentHashMap默认将hash表分为16个桶,
诸如get、put、remove等常用操作只锁住当前需要用到的桶。
常用工具类
Apache Commons
BeanUtils
提供了对于Javabean进行各种操作,如克隆对象
属性等等
提供了对于Javabean进行各种操作,如克隆对象
属性等等
Betwixt
XML与Java对象之间的相互转换
XML与Java对象之间的相互转换
Codec
处理常用的编码方法的工具类包
如DES, SHA1, MD5, Base64等
处理常用的编码方法的工具类包
如DES, SHA1, MD5, Base64等
Collections
Java集合框架操作
Java集合框架操作
Compress
Java提供文件打包压缩类库
Java提供文件打包压缩类库
Configuration
一个Java应用程序的配置管理类库
一个Java应用程序的配置管理类库
DBCP
提供数据库连接池的服务
提供数据库连接池的服务
DbUtils
提供对jdbc的操作封装来简化数据查询和记录读取操作
提供对jdbc的操作封装来简化数据查询和记录读取操作
Email
Java发送邮件,对Javamail的封装
Java发送邮件,对Javamail的封装
FileUpload
提供文件上传功能
提供文件上传功能
HttpClien
提供HTTP客户端与服务器的各种通讯操作
现在已改成HttpComponents
提供HTTP客户端与服务器的各种通讯操作
现在已改成HttpComponents
IO
IO工具的封装
IO工具的封装
Lang
Java基本对象方法的工具类包,如
StringUtils, ArrayUtils等等
Java基本对象方法的工具类包,如
StringUtils, ArrayUtils等等
Logging
提供的是一个Java的日志接口
提供的是一个Java的日志接口
Validator
提供了客户端和服务器端的数据验证框架
提供了客户端和服务器端的数据验证框架
Lombok
一个可以让你少写一些你不想写的代码,但是降低了代码的可读性和观赏性
一个可以让你少写一些你不想写的代码,但是降低了代码的可读性和观赏性
Hutool
也是一个帮助类,牛逼的不要不要的
IO
字节流
InputStream输入
FileInputStream
从本地文件中读取数据
从本地文件中读取数据
StringBufferInputStream
从StringBuffer中读取数据
从StringBuffer中读取数据
ByteArrayInputStream
从Byte数组中读取数据
从Byte数组中读取数据
ObjectInputStream
SequenceInputStream
将两个或者多个输入流当成一个输入流依次读取
将两个或者多个输入流当成一个输入流依次读取
PipedInputStream
从与其他线程共用的管道中读取数据
从与其他线程共用的管道中读取数据
FilterInputStream
BufferedInputStream
DataInputStream
PushbakInputStream
OutputStream输出
FileOutputStream
向本地文件写入数据
向本地文件写入数据
ObjectOutputStream
ByteArrayOutputStream
向Byte数组写入数据
向Byte数组写入数据
PipedOutputStream
向与其他线程共用的管道中写入数据
向与其他线程共用的管道中写入数据
FilterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
字符流
Reader输入
BufferedReader
InputStreamReader
连接字节流和字符流的桥梁
连接字节流和字符流的桥梁
FileReader
StringReader
PipedReader
ByteArrayReader
FilterReader
PushbackReader
Writer输出
BufferedWriter
OutputStreamWriter
FilterWriter
PrinterWriter
StringWriter
PipedWriter
CharArrayWriter
FilterWriter
File
RandomAccessFile(独立于IO)
搞清楚IO的底层原理
并发
并发产生的原因
出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的
现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,
处理器可以改变语句对应机器指令的执行顺序;
处理器可以改变语句对应机器指令的执行顺序;
解决方案
可见性:volatile关键字修饰变量,强制各个线程从主内存中读取数据
原子性:使用重量级的synchronize关键字修饰,其内部是执行时加入了monitorenter和monitorexist来保证的
也就是对象锁monitor机制
也就是对象锁monitor机制
解决原子性问题,可以使用Java并发包中
提供的Atomic类,它的原理是CAS乐观锁。
提供的Atomic类,它的原理是CAS乐观锁。
Unsafe类
基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;
数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;
引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;
对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。
这些类存在的目的是对相应的数据进行原子操作。所谓原子操作,是指操作过程不会被中断,保证数据操作是以原子方式进行的。
数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;
引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;
对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。
这些类存在的目的是对相应的数据进行原子操作。所谓原子操作,是指操作过程不会被中断,保证数据操作是以原子方式进行的。
as-if-serial
happen-before原则
多线程
线程池
// Java线程池的完整构造函数
public ThreadPoolExecutor(
int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。
int maximumPoolSize, // 线程数的上限
long keepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长,
// 超过这个时间,多余的线程会被回收。
BlockingQueue<Runnable> workQueue, // 任务的排队队列
ThreadFactory threadFactory, // 新线程的产生方式
RejectedExecutionHandler handler) // 拒绝策略
public ThreadPoolExecutor(
int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。
int maximumPoolSize, // 线程数的上限
long keepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长,
// 超过这个时间,多余的线程会被回收。
BlockingQueue<Runnable> workQueue, // 任务的排队队列
ThreadFactory threadFactory, // 新线程的产生方式
RejectedExecutionHandler handler) // 拒绝策略
ThreadLocal
1.ThreadLocal 是什么?
2. ThreadLocal 的作用?
3. ThreadLocal的应用场景?
JavaEE
基础
Servlet
Lifecycle
init(ServletConfig config)方法,在Servlet初始化时被调用
service(ServletRequest request, ServletResponse response)方法,处理客户端请求时调用
destory()方法,在Servlet销毁时被调用
Configurations
web.xml配置servlet和servlet-mapping
@WebServlet注解
ServletConfig
代表当前Servlet
获取Servlet初始化参数init-param
ServletContext
代表当前web应用
获取web应用初始化参数context-param
整个web应用数据共享
ServletRequest
客户端请求
ServletResponse
服务端响应
Servlet@3
异步Filter
asyncSupported=true
asyncSupported=true
JSP
九大内置对象
application: ServletContext类型,表示当前Web应用
page: Object类型,当前页面对象
pageContext: PageContext类型,页面上下文对象
config: ServletConfig对象,表示当前Servlet
out: JspWriter类型,JSP页面输出流
request: ServletRequest类型,表示HTTP请求
response: ServletResponse类型,表示HTTP响应
session: HttpSession类型,表示当前会话
exception: Throwable类型
page: Object类型,当前页面对象
pageContext: PageContext类型,页面上下文对象
config: ServletConfig对象,表示当前Servlet
out: JspWriter类型,JSP页面输出流
request: ServletRequest类型,表示HTTP请求
response: ServletResponse类型,表示HTTP响应
session: HttpSession类型,表示当前会话
exception: Throwable类型
四大作用域
page: 表示页面范围
request: 表示请求范围
session:表示当前会话范围
application: 表示当前Web应用范围
request: 表示请求范围
session:表示当前会话范围
application: 表示当前Web应用范围
三大指令
<%@page ...%>
定义页面依赖属性,比如脚本语言,error页面、缓存需求等等
定义页面依赖属性,比如脚本语言,error页面、缓存需求等等
<%@include ...%>
包含其他文件
包含其他文件
<%@taglib ...%>
引入标签库的定义
引入标签库的定义
10大动作元素
jsp:include
在页面请求的时候引入一个文件
在页面请求的时候引入一个文件
jsp:useBean
寻找或者实例化一个JavaBean
寻找或者实例化一个JavaBean
jsp:setProperty
设置JavaBean的属性
设置JavaBean的属性
jsp:getProperty
输出某个JavaBean的属性
输出某个JavaBean的属性
jsp:forward
把请求转到一个新的页面
把请求转到一个新的页面
jsp:plugin
根据浏览器类型为Java插件生成OBJECT或EMBED标记
根据浏览器类型为Java插件生成OBJECT或EMBED标记
jsp:element
定义动态XML元素
定义动态XML元素
jsp:attribute
设置动态定义的XML元素属性
设置动态定义的XML元素属性
jsp:body
设置动态定义的XML元素内容
设置动态定义的XML元素内容
jsp:text
在JSP页面和文档中使用写入文本的模板
在JSP页面和文档中使用写入文本的模板
JSTL
核心标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如:<c:if> <c:when> <c:forEach>等
如:<c:if> <c:when> <c:forEach>等
格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
如:<fmt:formatNumber> <fmt:timeZone>
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
如:<fmt:formatNumber> <fmt:timeZone>
SQL标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
JSTL SQL标签库提供了与关系型数据库进行交互的标签。
如:<sql:setDataSource> <sql:query> <sql:update>
JSTL SQL标签库提供了与关系型数据库进行交互的标签。
如:<sql:setDataSource> <sql:query> <sql:update>
XML标签
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL XML标签库提供了创建和操作XML文档的标签。
如:<x:set> <x:when> <x:parse>
JSTL XML标签库提供了创建和操作XML文档的标签。
如:<x:set> <x:when> <x:parse>
JSTL函数
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。
如:<fn:contains()> <fn:endWith()>
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。
如:<fn:contains()> <fn:endWith()>
自定义标签
EL表达式
JSP表达式语言(Expression Language)使得访问存储在JavaBean中的数据变得非常简单。
JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。
JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。
Spring
为什么会有Spring
Web发展的4个阶段
1. Model1(JSP+JavaBean)
2. Model2(JSP+Servlet+JavaBean)
3. EJB(各种配置,笨重框架)
4. Spring
IOC
AOP
事务管理
注解
组件类注解
@Repository
@Service
@Controller
@Component
@Service
@Controller
@Component
装配类注解
子主题
MVC模块注解
@Controller
@RequestMapping
@RequestParam
@PathVariable
@RequestBody
@ResponseBody
@RestController
@ModelAttribute
@RequestMapping
@RequestParam
@PathVariable
@RequestBody
@ResponseBody
@RestController
@ModelAttribute
事务模块注解
@Transactional(propagation="x")
propagation: 传播性
propagation: 传播性
在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked,如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务
还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked,如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务
还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。
AOP模块注解
@Aspect
@Pointcut
@Around
@Before
@After
@AfterReturning
@AfterThrowing
@Pointcut
@Around
@Before
@After
@AfterReturning
@AfterThrowing
条件注解
@Conditional(xxx.class)注解来实现只有某个Bean被创建时才会创建另外一个Bean,
这样就可以依据特定的条件来控制Bean的创建行为,这样的话我们就可以
利用这样一个特性来实现一些自动的配置。
这样就可以依据特定的条件来控制Bean的创建行为,这样的话我们就可以
利用这样一个特性来实现一些自动的配置。
Bean
Profile
Event
EL
SpringBoot
基础部分
本质
SpringBoot是对Spring的二次开发,通过大量的组合注解来简化配置,
通过各种starter轻松实现与其他中间件的集成。其中组合注解、
条件注解为SpringBoot简化配置提供了可能。
通过各种starter轻松实现与其他中间件的集成。其中组合注解、
条件注解为SpringBoot简化配置提供了可能。
启动原理
@SpringBootApplication是一个组合注解,其中包括@ComponentScan,
@EnableAutoConfiguration, @SpringBootConfiguration
@EnableAutoConfiguration, @SpringBootConfiguration
注解
Controller
@Controller
@RestController
@RestController
@RestController是Spring4之后新加的注解,是在@Controller注解的基础上
添加了@ResponseBody而成的组合注解,二者都是注解在类上
添加了@ResponseBody而成的组合注解,二者都是注解在类上
@RequestMapping
配置url映射,可以注解在类和方法上
@RequestMapping注解有6个属性
* value:指定请求的实际地址
* method:指定请求类型GET/POST/PUT/DELETE等
* consumes: 指定处理请求的提交内容类型(Content-Type) application/json, text/html
* produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定的类型才返回
* params: 指定request中必须包含某些参数值时才让方法处理
* headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@RequestBody 获取POST请求消息体的值,一般对应一个model
@RequestMapping注解有6个属性
* value:指定请求的实际地址
* method:指定请求类型GET/POST/PUT/DELETE等
* consumes: 指定处理请求的提交内容类型(Content-Type) application/json, text/html
* produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定的类型才返回
* params: 指定request中必须包含某些参数值时才让方法处理
* headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@RequestBody 获取POST请求消息体的值,一般对应一个model
DAO
@Repository
需要在Spring中配置扫描地址,
然后生成Dao层的Bean才能被注入到Service层中。
需要在Spring中配置扫描地址,
然后生成Dao层的Bean才能被注入到Service层中。
@Mapper
不需要配置扫描地址,通过xml里面的namespace里面的接口地址,
生成了Bean后注入到Service层中。
不需要配置扫描地址,通过xml里面的namespace里面的接口地址,
生成了Bean后注入到Service层中。
日志配置
默认配置
1. SpringBoot默认使用Logback。Spring Boot内部采用的是Commons Logging进行日志记录,
但在底层为Java Util Logging、Log4J2、Logback等日志框架提供了默认配置 。
2. SpringBoot默认为我们输出的日志级别为INFO、WARN、ERROR
3. 日志切割logging.file.max-size=? 保留天数logging.file.max-history=?保存地址logging.file=my.log
但在底层为Java Util Logging、Log4J2、Logback等日志框架提供了默认配置 。
2. SpringBoot默认为我们输出的日志级别为INFO、WARN、ERROR
3. 日志切割logging.file.max-size=? 保留天数logging.file.max-history=?保存地址logging.file=my.log
应用
动态更改日志等级
配置文件读取注入
@PropertySource("classpath:user-config.properties")注解类上
@Value配合EL表达式来注入到类中的属性
@Value配合EL表达式来注入到类中的属性
WebMvcConfigurer配置
官方推荐
SpringBoot2.0前
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {}
SpringBoot2.0后
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {}
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {}
SpringBoot2.0后
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {}
配置ResourceHandlers
处理静态资源例如js,css等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/web/**").addResourceLocations("classpath:/web/")
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/web/**").addResourceLocations("classpath:/web/")
}
配置ViewController
实现一个请求到视图的映射,无需书写controller
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("web/login.html");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("web/login.html");
}
配置MessageConverter
这个配置一般针对API接口,配置在请求返回时内容采用什么转换器进行转换,
SpringBoot默认自动配置jackson
SpringBoot默认自动配置jackson
配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomHandlerInterceptro()).addPathPatterns("/**");
// excludePathPatterns表示不拦截
}
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomHandlerInterceptro()).addPathPatterns("/**");
// excludePathPatterns表示不拦截
}
配置过滤器
方法一:@WebFilter注解类
方法二:实现Filter接口,@Component注解类
方法二:实现Filter接口,@Component注解类
@WebFilter注解,指定拦截路径以及一些参数,
同时需要在启动类使用@ServletComponentScan扫描带
@WebFilter、@WebServlet、@WebListener并将帮我们注入bean
同时需要在启动类使用@ServletComponentScan扫描带
@WebFilter、@WebServlet、@WebListener并将帮我们注入bean
静态资源配置
方法一:静态资源文件配置类
方法二:配置文件中配置
spring.mvc.static-path-pattern=/static/**
spring.mvc.static-path-pattern=/static/**
统一异常处理
方式一:实现HandlerExceptionResolver接口并使用@Component注解成为bean(和在WebMvcConfigurerAdapter中重写extendExceptionHandlerResolver,在其内添加Exception类是一样的)
方式二:使用@ControllerAdvice和@ExceptionHandler可实现对指定的Exception处理
方式三:实现ErrorController接口并使用@Controller接口注解,实现对渲染层及其他异常的处理
一和二都只能处理Controller层之内的异常
方式二:使用@ControllerAdvice和@ExceptionHandler可实现对指定的Exception处理
方式三:实现ErrorController接口并使用@Controller接口注解,实现对渲染层及其他异常的处理
一和二都只能处理Controller层之内的异常
配置错误页面
默认在/templates/error/下
使用404.hmtl/5xx.html等
使用404.hmtl/5xx.html等
配置跨域
全局跨域
局部跨域
模块部分
Security
Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。
它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。
它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。
shiro
相对于security的轻量级权限控制
actuator
SpringBoot内置监控
data-redis
客户端
Jedis
Redisson
Lettuce
JVM
垃圾收集器与内存分配策略
对象是否存活
4种引用
强引用(Strong Reference)
软引用(Soft Reference)
弱引用(Weak Reference)
虚引用(Phantom Reference)
判断对象存活的算法
引用计数算法
可达性分析算法
GC Root不可达的对象回收
方法区对象的回收
垃圾回收算法
标记-清除算法
复制算法
标记-整理算法
分代收集算法
垃圾收集器
Serial串行收集器
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
Parallel Old收集器
CMS收集器
G1收集器
内存分配与回收
对象优先在Eden分配
触发Minor GC(新生代GC)的条件
空间分配担保
大对象直接进入老年代
长期存活的对象将直接进入老年代
动态对象年龄判断
HotSpot实现方式
枚举根节点
安全点
安全区域
JVM参数配置
串行回收器参数配置
-XX:+UseSerialGC
-XX:+SurivorRatio
-XX:PretenureSizeThreshold
-XX:MaxTenuringThreshold
并行回收器参数配置
-XX:+UseParNewGC
-XX:ParallelGCThreads
-XX:MaxGCPauseMillis=50
-XX:+GCTimeRatio
-XX:+UseAdaptiveSizePolicy
-XX:+UseParallelGC
-XX:+UseParalleOldGC
CMS收集器参数配置
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction
-XX:+CmsFullGcsBeforeCompaction
-XX:+CMSClassUnloadingEnabled
-XX:+CMSParallelRemarkEnable
-XX:UseCMSInitatingOccupancyFraction
-XX:+UseCMSInitatingPermOccupancyOnly
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSIncrementalMode
G1收集器参数配置
-XX:+UseG1GC
-XX:+UnlockExperimentalVMOptions
-XX:GCPauseIntervalMillis=200
GC日志配置
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDataStamps
-XX:+PrintHeadAtGc
-XX:+DisableExplicitGC
性能优化
Tools
JDK自带
1. Create and Build Applications
appletviewer
extcheck
jar
java
javac
javadoc
javah
javap
jdb
jdeps
2. Security
keytool
jarsigner
policytool
3. Internationalization
native2ascii
4. Remote Method Invocation(RMI)
rmic
rmiregistry
rmid
serialver
5. Java IDL and RMI-IIOP
tnameserv
idlj
orbd
servertool
6. Deploy Applications and Applets
pack200
unpack200
javapackager
javafxpackager
7. Java Web Start
javaws
8. Monitor Java Applications
jconsole
jvisualvm
9. Monitor the JVM
jps
jstat
jstatd
jmc
10. Web Services
schemagen
wsgen
wsimport
xjc
11. Troubleshooting
jcmd
jinfo
jhat
jmap
jsadebugd
jstack
12. Scripting
jrunscript
jjs
付费工具
AppDynamic
* 在setenv.sh中配置agent
NewRelic
* 在newrelic.yml中配置license key
* 在tomcat/bin/catalina.sh中配置agent
* 注意newrelic的日志会很大
* 在tomcat/bin/catalina.sh中配置agent
* 注意newrelic的日志会很大
透视宝
开源工具
Pinpoint
MoSKito
BTrace
运行时动态输出信息
运行时动态输出信息
调优
1. 调优调的是什么
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数
另外要看下CPU的情况
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数
另外要看下CPU的情况
2. 怎么查
1. 各种监控上上去,另外生成dump文件
1. 分析GC的频率和时长
2. 查看当前字符串常量池大小,和占用空间最多的都是哪些
3. 分析线程的个数,已经查看哪些线程频繁创建和销毁,是否有必要引入线程。线程的死锁检查
4. 热点检查
* CPU热点:检查系统哪些方法占用的大量CPU时间
* 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
5. 内存泄漏检查,配置环境变量,当发生内存泄漏时保存日志
2. 查看当前字符串常量池大小,和占用空间最多的都是哪些
3. 分析线程的个数,已经查看哪些线程频繁创建和销毁,是否有必要引入线程。线程的死锁检查
4. 热点检查
* CPU热点:检查系统哪些方法占用的大量CPU时间
* 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
5. 内存泄漏检查,配置环境变量,当发生内存泄漏时保存日志
兵器在哪里
取我方天画戟
取我方天画戟
1、jps 查看应用进程
2、jinfo -flags pid 查看曾经赋值的一些参数
3、jstat
查看类装载信息
jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10次
查看垃圾收集信息
jstat -gc PID 1000 10
4、jstack
查看线程堆栈信息
jstack PID
5、jmap
生成堆快照
jmap -heap PID
dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
jvm配置一下参数会自动生成dump文件,不用手动生成。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
2、jinfo -flags pid 查看曾经赋值的一些参数
3、jstat
查看类装载信息
jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10次
查看垃圾收集信息
jstat -gc PID 1000 10
4、jstack
查看线程堆栈信息
jstack PID
5、jmap
生成堆快照
jmap -heap PID
dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
jvm配置一下参数会自动生成dump文件,不用手动生成。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
常用分析工具:
1、jconsole
2、jvisualvm
4、MAT 对文件分析工具
5、gc日志分析
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
gc日志分析工具:
在线:http://gceasy.io
离线:GCViewer
1、jconsole
2、jvisualvm
4、MAT 对文件分析工具
5、gc日志分析
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
gc日志分析工具:
在线:http://gceasy.io
离线:GCViewer
1、cpu占用率高如何排重
(1)top命令定位进程
(2)top -Hp PID 查看进程中各个线程cpu使用情况。 例:top -Hp 1893
(3)例如:在1893进程中4519线程cpu使用率较高
把4519这个线程转为16进制 print %x 4519 ——> 11a7
接下来通过jstack命令,查看栈信息
sudo -u admin jstack 1893 | grep -A 200 11a7
(1)top命令定位进程
(2)top -Hp PID 查看进程中各个线程cpu使用情况。 例:top -Hp 1893
(3)例如:在1893进程中4519线程cpu使用率较高
把4519这个线程转为16进制 print %x 4519 ——> 11a7
接下来通过jstack命令,查看栈信息
sudo -u admin jstack 1893 | grep -A 200 11a7
3. 怎么调
1. 针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值;
2. 年轻代和年老代将根据默认的比例(1:2)分配堆内存, 可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代。比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。
3. 年轻代和年老代设置多大才算合理
线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用
2. 年轻代和年老代将根据默认的比例(1:2)分配堆内存, 可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代。比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。
3. 年轻代和年老代设置多大才算合理
线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用
JMM
1. 计算机各个部件的速度差异引出缓存一致性的问题
2. JMM是如何保证高并发下缓存一致性的
3. JMM-JAVA内存模型介绍
- 变量的各种操作(read/load/use/assign/store/write/lock/unlock)
- JMM指令规范
- JMM三大特性:可见性,原子性,有序性
- Happen-before
4. volatile关键字(保证了可见性和有序性,但不能保证原子性)
可见性:变量在线程间的可见性
有序性:禁止指令重排
有序性:禁止指令重排
5. HappenBefore规则
感悟
工作中最好的建议
正视自己的价值
刚入职时需要做什么
大数据开发
小规模数据处理
Python数据处理
中等规模数据处理
ELK生态
大数据基础平台
分布式协调系统ZooKeeper
大数据基础平台Hadoop
大数据存储
分布式数据仓库 Hive
分布式列式数据库 HBase
分布式消息系统 Kafka
大数据采集
分布式导数系统 Sqoop
分布式日志采集系统 Flume
任务调度
Quarz难用
Quarz难用
分布式任务调度 Azkaban
XXL-JOB是一个轻量级分布式任务调度平台
opencron
LTS,light-task-scheduler
Elastic-Job
大数据处理
快速通用的分布式计算引擎 Spark
新一代分布式计算引擎 Flink
大数据应用OLAP生态
日志
ELK Stack(集中式日志解决方案)
Elasticsearch
Kibana
Logstash
Filebeat
日志系统
1. 收集-能够采集多种来源的日志数据
2. 传输-能够稳定的把日志数据传输到中央系统
3. 存储-如何存储日志数据
4. 分析-可以支持UI分析
5. 警告-能够提供错误报告,监控机制
数据库
数据库原理
理论
CAP理论
DBProxy
分布式数据库
Aurora AWS上的分布式关系型数据库
P6SpyDriver P6Spy 是针对数据库访问操作的动态监测框架,它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改。P6Spy 分发包包括P6Log,它是一 个可记录任何 Java 应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。
ORM
oracle
oracle中有个高级应用是oracle由queue,有个设置可以记录每次的sql cmd
elasticsearch
索引
创建索引
创建mapping映射
mysql
实战
怎么给字符串字段加索引?比如email
架构
设计原则
软件工程的四个要求
可维护性
可扩展性
可复用性
灵活性好
软件设计的六大原则
单一职责
依赖倒置原则
里氏替换原则
开闭原则
接口隔离原则
迪米特原则
API设计
安全设计常用方式
发
数据加密
传
appid+密钥
token机制
签名机制
收
黑白名单
时间戳
限流机制
验
数据合法性验证
大型网站架构核心思想
要素
性能
性能测试
不同视角下的性能
基准
指标
方法
报告、分析
优化方案
前端优化
浏览器优化
CDN加速
反向代理
后端优化
使用分布式缓存
集群化
异步调用
代码优化
存储优化
硬件优化
RAID
分布式存储
合适的存储数据结构
高并发场景三把利器
缓存
降级
限流
可用性
应用高可用
集群
服务高可用
集群
隔离
超时
降级
异步
异地多活
数据高可用
集群
备份
分布式数据库的CAP原则
发布
测试
预发布
代码控制
灰度发布
监控
扩展性
解耦
传统设计模式解耦
异步消息队列机制解耦
重用
服务化
伸缩性
通过增减资源达到增减吞吐量
应用服务集群伸缩
负载均衡
HTTP Redirect负载
DNS负载
反向代理
IP负载
4层负载LVS
分布式缓存集群伸缩
数据库集群伸缩
RDBMS伸缩
负载均衡
HTTP Redirect负载
DNS负载
反向代理
IP负载
4层负载LVS
HTTP Redirect负载
DNS负载
反向代理
IP负载
4层负载LVS
分布式缓存集群伸缩
数据库集群伸缩
RDBMS伸缩
NoSQL伸缩
RDBMS伸缩
安全性
WAF
加密
MD5
对称加密
非对称加密
内容安全
过滤
反垃圾
发爬虫
常见攻击
XSS
CRSF
SQL注入攻击
文件上传漏洞
DOS / DDOS攻击
分布式
CAP理论
Consistency 强一致性,保证数据中的数据完全一致(可以理解为写操作之后的读操作,必须返回该值)
Avaiable 在系统异常时,仍然可以提供服务。这里的可用性,一方面要求系统可以正常的运行返回结果,另一方面同样对响应速度有一定的保障
Partition Tolerance 分区容错
分布式存储系统
如GFS
如GFS
结构化存储
structured storage system
structured storage system
MySQL / PostgreSQL
传统的结构化存储系统强调的是:
(1)结构化的数据(如关系表)
(2)强一致性
(3)随机访问(索引,CRUD,SQL语言)
(1)结构化的数据(如关系表)
(2)强一致性
(3)随机访问(索引,CRUD,SQL语言)
非结构化存储
no-structed storage system
no-structed storage system
非结构化存储强调的是高可扩展性,典型的系统就是分布式文件系统。
缺点就是无法支持随机访问random access操作
缺点就是无法支持随机访问random access操作
半结构化存储
semi-structure storage system
semi-structure storage system
解决非结构化存储系统随机访问性能差的问题
NoSQL\Key-Value Store等
NoSQL系统既有分布式文件系统所具有的可扩展性,
又有结构化存储系统的随机访问能力(如update/read) 如HBase, Google Bigtable
NoSQL\Key-Value Store等
NoSQL系统既有分布式文件系统所具有的可扩展性,
又有结构化存储系统的随机访问能力(如update/read) 如HBase, Google Bigtable
In-memory存储
业务的高并发,存储系统对低延迟的要求越来越高,
内存价格的降低,基于内存的存储系统开始普及。
memcahed, redis-基于磁盘的存储系统做cache
内存价格的降低,基于内存的存储系统开始普及。
memcahed, redis-基于磁盘的存储系统做cache
NewSQL
兼备 RDBMS 的特性(例如:完整的 SQL 支持,ACID 事务支持),
又能像 NoSQL 系统那样具有强大的可扩展能力 - Google Spanner研发当中
又能像 NoSQL 系统那样具有强大的可扩展能力 - Google Spanner研发当中
分布式计算系统
如MapReduce
如MapReduce
传统基于msg的系统
MapReduce-like系统
MapReduce(Hadoop和Spark为代表) / Hive
图计算系统
基于状态(state)的系统
Streaming系统
为流式数据提供服务,如storm.spark straming, flink
分布式锁
如Chobby
如Chobby
分布式数据库
如BigTable, Spanner
如BigTable, Spanner
分布式MQ
如Kafka
如Kafka
分布式ML
如TensorFlow
如TensorFlow
产品工具
分布式配置中心
Apollo 阿波罗 携程框架
分布式日志手机系统ELK
Logstash
收集和分析
Elasticsearch
搜索与存储
Kabana
可视化展示
可配合Kafka使用
性能优化
性能监控
CPU/Memory/RDS使用率
服务器并发用户数
系统响应时间Lantency
In-service服务器数量
DB Connection
文件上传数量变化
分布式性能监控工具
Pinpoint
Google Dapper
New Relic收费
App Dynamic收费-能监控到SQL级别,各个方法调用的耗时情况
硬件优化
数据库优化
P6SpyDriver P6Spy 是针对数据库访问操作的动态监测框架
主要特点:
1. 通过P6Log拦截和记录JDBC语句,对SQL语句的整个编译,执行进行监控
2. 清晰的输出SQL耗时,方便开发中调优
3. 切入的是JDBC Driver,不会对ORM层产生影响,后期上线直接替换为原生的jdbc driver
主要特点:
1. 通过P6Log拦截和记录JDBC语句,对SQL语句的整个编译,执行进行监控
2. 清晰的输出SQL耗时,方便开发中调优
3. 切入的是JDBC Driver,不会对ORM层产生影响,后期上线直接替换为原生的jdbc driver
JVM参数调优
代码优化
微服务
SpringCloud框架
服务注册中心
Eureka(2.0后闭源)
AP
AP
Eureka原理
服务注册
1. Eureka Client延迟注册,默认延迟40秒
2. 在应用启动后,Eureka Client将会向Eureka Server发送心跳,默认周期是30s,
如果Eureke Server在多个心跳周期内都没有接收到某个节点的心跳,
Eureka Server将会从服务注册表中把这个服务节点移除(默认90s)。
3. 服务注册使用了EurekaClient.register(instanceInfo)方法
2. 在应用启动后,Eureka Client将会向Eureka Server发送心跳,默认周期是30s,
如果Eureke Server在多个心跳周期内都没有接收到某个节点的心跳,
Eureka Server将会从服务注册表中把这个服务节点移除(默认90s)。
3. 服务注册使用了EurekaClient.register(instanceInfo)方法
服务发现
Discovery
启动类
获取注册信息
服务续约
客户端源码(DiscoveryClient类里面):通过发送心跳进行续约,告诉注册中心我还活着
注册服务的时候调用了initScheduledTasks,开启任务调度来进行服务续约和获取服务端注册列表
注册服务的时候调用了initScheduledTasks,开启任务调度来进行服务续约和获取服务端注册列表
Eureka基本搭建
服务端
@EnableEurekaServer
@EnableEurekaServer
客户端
@EnableEurekaClient
@EnableEurekaClient
Eureka集群搭建
修改系统配置
/etc/hosts
127.0.0.1 my-eureka-server1.com
127.0.0.1 my-eureka-server2.com
127.0.0.1 my-eureka-server1.com
127.0.0.1 my-eureka-server2.com
配置文件
服务同步实现原理
服务的负载均衡实现
RestTemplate Bean声明添加@LoadBalanced
@LoadBalanced默认采用
Eureka自我保护
源码分析
Zookeeper(CP)
适用于大数据方向
适用于大数据方向
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,
是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:
配置维护、域名服务、分布式同步、组服务等。
是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:
配置维护、域名服务、分布式同步、组服务等。
Consul(CP)
适用于企业级应用
适用于企业级应用
Go语言开发的,提供分布式的服务注册、发现、配置等功能,
每个功能都可以单独使用和组合。Consul实现了Raft协议来保证这种强一致性
每个功能都可以单独使用和组合。Consul实现了Raft协议来保证这种强一致性
Nacos
Nacos 是 SpringCloud Alibaba生态系统中重要的注册中心实现
CAP理论(分布式基础)
CAP关注的数据的读写,而不是整个服务系统架构
AP(Eureka)
CP(Consul/Zeekpeer)
CP(Consul/Zeekpeer)
网关服务
SpringCloud Gateway
服务网关,性能是Zuul的1.6倍
服务网关,性能是Zuul的1.6倍
过滤
路由
限流
限流算法: 计数器算法,漏斗算法,令牌桶算法
Zuul
基于HttpServlet的实现,进入维护状态
配置中心
SpringCloud Config
服务配置
服务配置
是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,
server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,
client通过接口获取数据、并依据此数据初始化自己的应用。
server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,
client通过接口获取数据、并依据此数据初始化自己的应用。
搭建复杂,约定多,设计繁重,没有界面,难以上手
Nacos Config
搭建简单,有可视化界面,配置管理更高效
远程调用
SpringCloud Feign
服务调用(进入维护)
服务调用(进入维护)
Feign进行远程调用,@PostMapping时,传递多个参数时,使用@RequestBody进行参数传递
也就是需要一个DTO对象,如果是单个参数,可以使用@RequestParam,
如果是多个就会报参数找不到的情况
也就是需要一个DTO对象,如果是单个参数,可以使用@RequestParam,
如果是多个就会报参数找不到的情况
SpringCloud Ribbon
负载均衡(SC1.0的产物)
负载均衡(SC1.0的产物)
概述
Ribbon是通过将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,
服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表通过负
载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的
服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表通过负
载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的
Dubbo
Spring Cloud Loadbalancer
服务限流
SpringCloud Hystirx
服务降级/熔断/隔离
服务降级/熔断/隔离
是Netflix中开源的一个用于服务的隔离,熔断,降级,和缓存的开源组件。主要特点是:
1. 隔离:线程池隔离(各个服务都安排一个线程池),信号量隔离(AtomicInteger)
2. 熔断:服务调用异常达到某个阈值,触发熔断,后续请求直接返回fallBack函数的结果
3. 降级:保证服务的应答,但是返回的不是正常的业务结果
4. 缓存:缓存请求的结果。@CacheResult(所有参数都是key)@CacheKey(自己指定key) @CacheRemove(哪个key不缓存) / 自己实现HystrixCommand.getCacheKey方法
1. 隔离:线程池隔离(各个服务都安排一个线程池),信号量隔离(AtomicInteger)
2. 熔断:服务调用异常达到某个阈值,触发熔断,后续请求直接返回fallBack函数的结果
3. 降级:保证服务的应答,但是返回的不是正常的业务结果
4. 缓存:缓存请求的结果。@CacheResult(所有参数都是key)@CacheKey(自己指定key) @CacheRemove(哪个key不缓存) / 自己实现HystrixCommand.getCacheKey方法
Hystrix的工作流程:
1. 每次调用都会创建一个HystrixCommand
2. 执行execute或queue做同步、异步调用
3. 判断熔断器是否打开,如果打开就做服务降级处理,如果关闭则继续
4. 判断线程池或信号量是否跑满,如果跑满就做服务降级处理,否则继续
5. 调用HystrixCommand的run方法,如果失败就做服务降级处理
6. 判断是否调用成功,成功就返回结果,失败就走服务降级
7. 计算熔断器状态,所有的运行状态(成功,失败,拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态
8. 服务降级:服务降级处理:
1. 熔断器打开 2. 线程池/信号量跑满 3. 调用超时 4. 调用失败
9. 返回结果
1. 每次调用都会创建一个HystrixCommand
2. 执行execute或queue做同步、异步调用
3. 判断熔断器是否打开,如果打开就做服务降级处理,如果关闭则继续
4. 判断线程池或信号量是否跑满,如果跑满就做服务降级处理,否则继续
5. 调用HystrixCommand的run方法,如果失败就做服务降级处理
6. 判断是否调用成功,成功就返回结果,失败就走服务降级
7. 计算熔断器状态,所有的运行状态(成功,失败,拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态
8. 服务降级:服务降级处理:
1. 熔断器打开 2. 线程池/信号量跑满 3. 调用超时 4. 调用失败
9. 返回结果
Sentinel
面向分布式服务框架的轻量级流量控制产品,主要以流量为切入点,从流量控制、
熔断降级、系统负载保护等多个维度来保护服务的稳定性
熔断降级、系统负载保护等多个维度来保护服务的稳定性
链路追踪
Dapper(Google)
Zipkin(Twitter)
案例
使用Zipkin来收集链路数据,然后通过RabbitMQ将数据传输到
ElasticSearch进行持久化存储,然后通过Kibana来展示链路数据
使用Zipkin来收集链路数据,然后通过RabbitMQ将数据传输到
ElasticSearch进行持久化存储,然后通过Kibana来展示链路数据
Eagleeye(鹰眼,阿里)
消息总线
SpringCloud Admin
服务监控
服务监控
SpringCloud Security
服务安全
服务安全
任务调度
Alibaba Cloud SchedulerX
分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时任务调度服务
XxlJob
服务器
Tomcat
Tomact架构及模块
Server
Service +
Connector +
Container -
Jasper
Naming
Session
Loging
JMX
Tomcat配置管理
Web应用配置
web.xml
web.xml
定义:web.xml是Web应用的部署描述文件,它支持的元素及属性
来自于Servlet规范定义。
来自于Servlet规范定义。
描述文件的配置分类
ServletContext初始化参数
<context-param></context-param>
<context-param></context-param>
会话配置
<session-config></session-config>
默认是30分钟
<session-config></session-config>
默认是30分钟
应用生命周期监听
<listener></listener>
<listener></listener>
Filter定义及映射
用于配置Web应用过滤器,用来过滤资源请求及响应。
经常用于认证、日志、加密、数据转换等。
<filter></filter>
<filter-mapping></filter-mapping>
用于配置Web应用过滤器,用来过滤资源请求及响应。
经常用于认证、日志、加密、数据转换等。
<filter></filter>
<filter-mapping></filter-mapping>
MIME类型映射
<mime-mapping></mime-mapping>
<mime-mapping></mime-mapping>
欢迎文件列表
<welcome-file-list></welcome-file-list>
<welcome-file-list></welcome-file-list>
错误页面
<error-page></error-page>
<error-page></error-page>
本地化及编码映射
<locale-encoding-mapping-list></locale-encoding-mapping-list>
<locale-encoding-mapping-list></locale-encoding-mapping-list>
完全配置
<security-constraint></security-constraint>
<security-role></security-role>
<security-constraint></security-constraint>
<security-role></security-role>
JNDI配置
Tomcat日志配置
运行中的日志
分5类:catalina、localhost、manager、admin、host-manager
分7中日志级别: SERVER > WARNING > INFO > CONFIG > FINE > FINER > FINEST
默认级别为FINE
默认级别为FINE
修改conf/logging.properties中的内容来设定日志级别
设置catalina日志级别为FINE
1catalina.org.apache.juli.FileHandler.level = FINE
禁用catalina日志输出
1catalina.org.apache.juli.FileHandler.level = OFF
输出catalina所有的日志消息输出
1catalina.org.apache.juli.FileHandler.level = ALL
设置catalina日志级别为FINE
1catalina.org.apache.juli.FileHandler.level = FINE
禁用catalina日志输出
1catalina.org.apache.juli.FileHandler.level = OFF
输出catalina所有的日志消息输出
1catalina.org.apache.juli.FileHandler.level = ALL
访问日志
修改tomcat/conf/server.xml中Host下的Valve,去掉注释
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
可修改pattern来修改输出
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
可修改pattern来修改输出
catalina容器启动阶段的配置,如服务器类加载器路径等
conf/catalina.properties
conf/catalina.properties
server.xml配置
tomcat应用服务器核心配置文件
tomcat应用服务器核心配置文件
acceptorThreadCount:接收socket连接的线程数
maxThread:最大线程数
acceptCount:最大线程数占满后,可以接受排队的队列长度;若acceptCount也占满了,返回connection refused
maxThread:最大线程数
acceptCount:最大线程数占满后,可以接受排队的队列长度;若acceptCount也占满了,返回connection refused
Tomcat安全
1. 专门创建一个用户只用于tomcat的服务,防止入侵者直接拿到root权限执行webshell
2. 修改管理端口及关闭服务的字符串8005 SHUTDOWN
3. 隐藏服务器信息。添加自定义error pages,修改tomcat信息
4. 禁止tomcat遍历目录 listings=false
5. 去除Host组建的自动部署
6. 可以删除掉AJP connector
IO
哪些框架使用了epoll
中间件
MyBatis
四大对象
Executor
StatementHandler
ParameterHandler
ResultSetHandler
Keepalived
Redis
压测
redis-benchmark
Redis与Memcache对比
Redis数据类型及常用场景
String
KV存储,热点数据,预减库存
简单动态字符串
Hash
哈希表,压缩列表
List
微博消息按插入顺序展示,队列
双向链表,压缩列表
Set
Tag,Label,共同关注,抽奖系统
整数数组
Zset
最热,排行榜
压缩表,跳表
GEO
微信摇一摇地理位置信息
Hyperloglog
基数统计
Bitmap
瑞士军刀
消息队列
慢查询
持久化
RBD
AOF
pipeline批量操作
发布订阅
事务
Redis Sentinel
(2.8)
(2.8)
主从配置
Redis Cluster
(3.0)
(3.0)
slot-分区
通信 +10000
gossip
ping/pong/meet/fail
常见问题
Redis单线程为什么还那么快
Redis和数据库一起使用时如何保证一致性
Redis集群通信原理
Redis穿透,击穿,雪崩
Redis CAS是怎么做的
基于 Redis Lua 实现 CAS
为什么要使用pipeline
Redis Key是如何寻址的
Redis缓存过期策略
Redis实现分布式锁
单节点模式的分布式锁
多节点模式的分布式锁
长尾延迟
Dateway
Dataway 工具化的提供 DataQL 配置能力
MQ
RabbitMQ
RabbitMQ基本概念
RabbitMQ开发的基本步骤
Producer的可靠性投递
保证消息的成功发出
保证Broker节点的成功接收
发送端收到Broker确认应答
完善的消息补偿机制
保证Broker节点的成功接收
发送端收到Broker确认应答
完善的消息补偿机制
ReturnListener: 用于消息投递失败时候的处理
用于一般的业务
RocketMQ
用于电商,可根据业务需求进行二次开发
Kafaka
用于大数据,性能强大,但是功能没有RabbitMQ多
0 条评论
下一页