杂记
Posted archimedes-euler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂记相关的知识,希望对你有一定的参考价值。
1、Amdahl定律
加速比=优化前系统耗时/优化后系统耗时
设加速比为speedup,系统内必须串行化的程序比重为F(=串行化步骤/总步骤),cpu处理器数量为N,则有speedup ;
2、系统优化的层次
1、代码优化层面
2、软件架构层面
3、JVM虚拟机层面
4、数据库层面
5、操作系统层面
3、单例模式
1、饿汉式:不可做到延时加载
2、懒汉式:用synchronized,可以做到延时加载,但是效率低下
3、内部类方式:不用synchronized,也可以做到延时加载,还可兼顾效率
4、动态创建数组的初值问题
对于动态创建的,没有初始化的数组,字符串数组元素的内容为null;int,byte,short,long数组元素的内容为0;float,double数组元素的内容为0.0;boolean数组元素的内容为false;char数组元素的内容不存在。
5、方法同名问题
普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。
6、数据库类型:
1、一种是关系数据库,典型代表产品:DB2,mysql,Oracle;
2、另一种则是层次数据库,代表产品:IMS层次数据库。
3、非关系型数据库有MongoDB、memcachedb、Redis等。
7、字符流名字问题
以InputStream(输入)/OutputStream(输出)为后缀的是字节流;
以Reader(输入)/Writer(输出)为后缀的是字符流
8、加密算法
常用的对称加密算法有:DES、3DES、RC2、RC4、AES
常用的非对称加密算法有:RSA、DSA、ECC
使用单向散列函数的加密算法:MD5、SHA
9、Catch块的匹配问题
当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这样如果父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会获得匹配的机会,也即子异常类型所在的catch语句块将是不可到达的语句。所以,一般将父类异常类即Exception老大放在catch语句块的最后一个
10、代理模式
1、应用场景
1、远程调用的网络代理
2、安全代理
3、延迟加载
2、正向代理和反向代理的区别
1、位置不同
正向代理,架设在客户机和目标主机之间;
反向代理,架设在服务器端;
2、代理对象不同
正向代理,代理客户端,服务端不知道实际发起请求的客户端;
反向代理,代理服务端,客户端不知道实际提供服务的服务端;
3、用途不同
正向代理,为在防火墙内的局域网客户端提供访问Internet的途径;
反向代理,将防火墙后面的服务器提供给Internet访问;
4、安全性不同
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务;
反向代理都对外都是透明的,访问者并不知道自己访问的是哪一个代理
11、负载均衡
1、软负载均衡
软件负载均衡则是通过在服务器上安装的特定的负载均衡软件或是自带负载均衡模块完成对请求的分配派发。
1、 轮询
轮询。作为非常经典的负载均衡策略,早期该策略应用地非常广泛。其原理很简单,给每个请求标记一个序号,然后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景。其缺点也非常明显,该策略将节点视为等同,与实际中复杂的环境不符。加权轮询为轮询的一个改进策略,每个节点会有权重属性,但是因为权重的设置难以做到随实际情况变化,仍有一定的不足。
2、 随机
随机。与轮询相似,只是不需要对每个请求进行编号,每次随机取一个。同样地,该策略也将后端的每个节点是为等同的。另外同样也有改进的加权随机的算法,不再赘述。
3、 最小响应时间
通过记录每次请求所需的时间,得出平均的响应时间,然后根据响应时间选择最小的响应时间。该策略能较好地反应服务器的状态,但是由于是平均响应时间的关系,时间上有些滞后,无法满足快速响应的要求。因此在此基础之上,会有一些改进版本的策略,如只计算最近若干次的平均时间的策略等。
4、 最小并发数
客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生较大的不同,并没有达到真正的负载均衡?最小并发数的策略则是记录了当前时刻,每个备选节点正在处理的事务数,然后选择并发数最小的节点。该策略能够快速地反应服务器的当前状况,较为合理地将负责分配均匀,适用于对当前系统负载较为敏感的场景。
2、硬负载均衡
F5负载均衡是硬件负载均衡的一种。硬件负载均衡,顾名思义,在服务器节点之间安装专门的硬件进行负载均衡的工作。
F5是负载均衡产品的一个品牌,其地位类似于原来诺基亚在手机品牌中的位置。除了F5以外,Radware、Array、A10、Cisco、深信服和华夏创新都是负载均衡的牌子,因为F5在这类产品中影响最大,所以经常说F5负载均衡。
12、href属性中的请求
页面中超链接中href属性中的请求,默认提交方式get
13、soa架构
SOA:Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。采用的通讯协议soap协议(http协议+xml报文格式传输)
14、soap
soap对象访问协议是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同,SOAP包是XML格式的
15、架构
架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行
16、开发环境
Dev:开发环境
UAT:验收测试环境
Test:测试环境
Pre:预生产环境
Pro:生产环境
QA:质量管理
17、RPC
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
18、rpc远程调用框架
几种比较典型的RPC的实现和调用框架。
(1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。
(2)Hessian,是一个轻量级的remoting
on http工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。
(3)thrift是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
(4)SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
(4) Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
19、SOA架构与微服务架构区别
SOA架构主要针对企业级、采用ESB服务(ESB企业服务总线),非常重,需要序列化和反序列化,采用XML格式传输。
微服务架构主要互联网公司,轻量级、小巧,独立运行,基于Http+Rest+JSON格式传输。
20、亨元模式
亨元模式是为数不多的,只为提升系统性能而生的设计模式;他和对象池最大的不同是:亨元对象是不可相互替代的,它们各自都有各自的含义和用途;而对象池中的对象都是等价的
21、postman
1、body传递的数据的方式
- form-data:表示http请求中的multipart/form-data方式,会将表单的数据处理为一条消息,用分割符隔开,可以上传键值对或者上传文件
- x-www-form-urlencoded:会把表单数据转换为键值对,比如 : name=Java&age = 23
- raw:可以上传任意格式的文本,文本不做任何修饰传到服务端。比如传一些xml,或者json数据,或者text文本数据等。
- binary:相当于Content-Type:application/octet-stream,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以一次只能上传一个文件。
注:multipart/form-data与x-www-form-urlencoded的区别
l multipart/form-data:可以上传文件或者键值对,最后都会转化为一条消息
l x-www-form-urlencoded:只能上传键值对,而且键值对都是通过&间隔分开的。
22、pom文件
1、relativePath
表示查找parent元素的地址的顺序:
本地仓库/远程仓库
<relativePath/>设定一个空值将始终从仓库中获取,不从本地路径(项目中的父工程)获取
23、Thymeleaf
1、介绍
Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP ;Thymeleaf是一款用于渲染XML/Xhtml/HTML5内容的模板引擎。类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。与其它模板引擎相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。
注意:由于Thymeleaf使用了XML DOM解析器,因此它并不适合于处理大规模的XML文件。
2、基本语法
1、变量表达式
${session.user.name}
<li th:each="book : ${books}">
<span th:text="${book.author.name}">
2、选择或星号表达式
*{customer.name}
<div th:object="${book}">
<span th:text="*{title}">...</span>
</div>
3、文字国际化表达式
#{main.title}
#{message.entrycreated(${entryId})}
<table>
<th th:text="#{header.address.city}">...</th>
<th th:text="#{header.address.country}">...</th>
</table>
4、URL表达式
URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。
@{/order/list}
URL还可以设置参数:
@{/order/details(id=${orderId})}
相对路径:
@{../documents/report}
<form th:action="@{/createOrder}">
<a href="main.html" th:href="@{/main}">
3、th标签
1、th标签优先级
include,each,if/unless/switch/case,with,attr/attrprepend/attrappend,value/href,src ,etc,text/utext,fragment,remove。
2、赋值、字符串拼接
<p th:text="${collect.description}">description</p>
<span th:text="‘Welcome to our application, ‘ + ${user.name} + ‘!‘">
字符串拼接还有另外一种简洁的写法
<span th:text="|Welcome to our application, ${user.name}!|">
3、条件判断 If
<a th:if="${myself==‘yes‘}" > </i> </a>
4、for 循环
<tr th:each="collect,iterStat : ${collects}">
<th scope="row" th:text="${collect.id}">1</th>
<td >
<img th:src="${collect.webLogo}"/>
</td>
<td th:text="${collect.url}">Mark</td>
<td th:text="${collect.title}">Otto</td>
<td th:text="${collect.description}">@mdo</td>
<td th:text="${terStat.index}">index</td>
</tr>
iterStat称作状态变量,属性有:
index:当前迭代对象的index(从0开始计算)
count: 当前迭代对象的index(从1开始计算)
size:被迭代对象的大小
current:当前迭代变量
even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)
first:布尔值,当前循环是否是第一个
last:布尔值,当前循环是否是最后一个
5、URL
如果需要Thymeleaf对URL进行渲染,那么务必使用th:href,th:src等属性,
<a th:href="@{/standard/{type}(type=${type})}">view</a>
<a href="details.html" th:href="@{/order/{orderId}/
details(orderId=${o.id})}">view</a>
设置背景
<div th:style="‘background:url(‘ + @{/<path-to-image>} + ‘);‘"></div>
根据属性值改变背景
<div class="media-object resource-card-image" th:style="‘
background:url(‘ + @{(${collect.webLogo}==‘‘ ? ‘
img/favicon.png‘ : ${collect.webLogo})} + ‘)‘" ></div>
几点说明:
上例中URL最后的(orderId=${o.id}) 表示将括号内的内容作为URL参数处理,该语法避免使用字符串拼接,大大提高了可读性
@{...}表达式中可以通过{orderId}访问Context中的orderId变量
@{/order}是Context相关的相对路径,在渲染时会自动添加上当前Web应用的Context名字,假设context名字为app,那么结果应该是/app/order
6、内嵌变量
为了模板更加易用,Thymeleaf还提供了一系列Utility对象(内置于Context中),可以通过#直接访问:
dates : java.util.Date的功能方法类。
calendars : 类似#dates,面向java.util.Calendar
numbers : 格式化数字的功能方法类
strings : 字符串对象的功能类,contains,startWiths,prepending/appending等等。
objects: 对objects的功能类操作。
bools: 对布尔值求值的功能方法。
arrays:对数组的功能类方法。
lists: 对lists功能类方法
sets
maps
- dates
${#dates.format(date, ‘dd/MMM/yyyy HH:mm‘)}
${#dates.arrayFormat(datesArray, ‘dd/MMM/yyyy HH:mm‘)}
${#dates.listFormat(datesList, ‘dd/MMM/yyyy HH:mm‘)}
${#dates.setFormat(datesSet, ‘dd/MMM/yyyy HH:mm‘)}
${#dates.createNow()}
${#dates.createToday()}
- strings
${#strings.isEmpty(name)}
${#strings.arrayIsEmpty(nameArr)}
${#strings.listIsEmpty(nameList)}
${#strings.setIsEmpty(nameSet)}
${#strings.startsWith(name,‘Don‘)}
${#strings.endsWith(name,endingFragment)}
${#strings.length(str)}
${#strings.equals(str)}
${#strings.equalsIgnoreCase(str)}
${#strings.concat(str)}
${#strings.concatReplaceNulls(str)}
${#strings.randomAlphanumeric(count)}
24、Gradle
spring 项目建议使用Gradle进行构建项目,相比maven来讲 Gradle更简洁,而且gradle更时候大型复杂项目的构建
25、WebJars
WebJars是将客户端(浏览器)资源(javascript,Css等)打成jar包文件,以对资源进行统一依赖管理。WebJars的jar包部署在Maven中央仓库上,可以让我们以jar包的形式来使用前端的各种框架、组件
26、RabbitMQ
1、概念
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。RabbitMQ是实现AMQP(即Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件的一种,AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
2、应用场景
分布式事务的支持,RPC的调用等等
3、原理
通常我们谈到队列服务, 会有三个概念: 发消息者、队列、收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者和队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列。
- 左侧 P 代表 生产者,也就是往 RabbitMQ 发消息的程序。
- 中间即是 RabbitMQ,其中包括了交换机和队列。
- 右侧 C 代表 消费者,也就是往 RabbitMQ 拿消息的程序。
4、虚拟主机
虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。
为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户
只能在虚拟主机的粒度进行权限控制。
因此,如果需要禁止A组访问B组的交换机/队列/绑定,必
须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都
有一个默认的虚拟主机“/”。
5、交换机:Exchange
交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。在启用ack模式后,交换机找不到队列会返回错误。
这里有一个比较重要的概念:路由键 。消息到交换机的时候,交互机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键。
绑定:也就是交换机需要和队列相绑定,这其中如上图所
示,是多对多的关系。
交换机有四种类型:Direct, topic, Headers and Fanout
- Direct:direct 类型的行为是"先匹配, 再投送". 即在绑定时设定一个 routing_key, 消息的routing_key 匹配时, 才会被交换器投送到绑定的队列中去. 是RabbitMQ默认的交换机模式.
- Topic:按规则转发消息(最灵活)
- Headers:设置header attribute参数类型的交换机
- Fanout:转发消息到所有绑定队列
27、VMware连接方式
可以有三种模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。
1. bridged(桥接模式)
在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。
在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。
如果你想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。
2. NAT(网络地址转换模式)
使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置
信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手
工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行
通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,
你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可
如果你想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。
3. host-only(主机模式)
在某些特殊的网络调试环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。在host-only模式中,所有的虚
拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的
提示:在host-only模式下,虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。
在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1(host-only)虚拟网络的DHCP服务器来动态分配的。
如果你想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择host-only模式。
28、IP地址
IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。全0和全1的都保留不用。
A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同
1、A类:
(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)
第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
2、B类:
(128.1.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)
前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。
一般用于中等规模网络。
3、C类:
(192.0.1.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)
前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。
一般用于小型网络。
4、D类:
是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
5、E类:
是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。
6、保留地址
一、0.0.0.0
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一 律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。
二、255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言,应该是这样:“这个房间里的所有人都注意了!”这个地址不能被路由器转发。
三、127.0.0.1
本机地址,主要用于测试。用汉语表示,就是“我自己”。在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包。
四、224.0.0.1
组播地址,注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP (Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。
五、169.254.x.x
如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Wingdows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九 是你的网络不能正常运行了。
六、10.x.x.x、172.16。x。x~172.31。x。x、192.168。x。x
私有地址,这些地址被大量用于企业内部网络中。一些宽带路由器,也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私 有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。在Internet上,这类地址是不能出现的。
七、1.1.1.1
1.1.1.1是路由器或交换机自己设置的IP
29、XSS攻击
XSS(Cross Site Scripting),XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中
以上是关于杂记的主要内容,如果未能解决你的问题,请参考以下文章