200-成功。客户端请求已成功。
301-永久重定向。
302-临时重定向,A访问B
304-走缓存,未修改。
307-访问转发,A调用B
401-鉴权失败,需要正确账号密码
403-权限限制,禁止访问 SSL IP地址 客户端证书
404-文件或资源未找到。
405-HTTP请求方法错误
406-客户端浏览器不接受所请求页面的MIME类型。
407-要求进行代理身份验证。
500-服务器内部错误 asp错误 服务器占用率 文件权限
501-页眉值指定了未实现的配置
502-网关问题
503-服务器节点不可用
504-网关超时。
505-HTTP版本不受支持
项目推动能力
规范项目流程
测试资源的充分程度
用例的覆盖率
会议纪要,信息同步
负责模块业务文档
主流程接口测试
多环境多轮测试
代码变更行覆盖率
回归测试切换多种用例
每日测试报告
多轮验收
迭代bug分析
web服务层 Nginx openresty
web应用服务层 tomcat
持续集成CI:频繁地 (一天多次) 将代码集成到主干,经过让产品可以快速迭代,同时还能保持高质量
代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
持续交付CD : 频繁地将软件的新版本,交付给质量团队或者用户,以供测试
持续部署 代码在任何时刻都是可部署的,可以进入生产阶段。
性能的常用指标包括页面的白屏时间,首屏时间,资源占用,页面渲染时间,帧率
content-type
json
x-www-form-urlencoded是浏览器默认的编码格式,如果参数值中需要&,则必须对其进行编码
form-data 不会对参数编码
SVN
集中式版本控制系统,版本库是集中存放在中央服务器的,工作的时候,用的是自己的电脑,所以,我们首先需要
从中央服务器上拉取最新的版本,然后开始工作,等工作完了,再把自己的工作提交到中央服务器。
Git
分布式版本控制系统没有中央服务器的概念,我们使用相关的客户端提取的不只是最新的文件,而是把代码仓库完整
地镜像下来,相当于每个人的电脑都是一个完整的版本库,这样的话,任何一处协同工作的服务器出现故障,都可以
用任何一个镜像出来的本地仓库恢复。并且,即便在网络环境比较差的情况下也不用担心,因为版本库就在本地电脑
GitHub开源免费,私有仓库收费,适合开源项目
GitLab私有仓库也免费。允许免费设置仓库权限;
多态的实现
在程序中定义的引用变量所指向的具体类型 和 该引用变量的生成对象调用在编程的时候并不确定,当处于运行期间才确定。
父类的引用指向子类的对象。接口的引用指向实现类的对象, 重载和重写
C语言和java各类型占字节数
char 1 short int 2 int 4 float 4 double 8 long 8 long long 8
byte 1 char 2 short 2 int 4 float 4 long 8 double 8 boolean
maven是一个项目管理工具,基于项目对象模型,maven主要是用来解决导入java类依赖的jar,编译java项目主要问题。
负责版本,构建,输出,依赖关系 文档和构建结果 项目关系 移植性管理
maven的生命周期 - 编译、测试、打包、集成、验证、部署
约定优于配置 - 默认值,尽量不去修改
/项目目录
pom.xml 用于maven的配置文件
/src 源代码目录
/src/main 工程源代码目录
/src/main/java 工程java源代码目录
/src/main/resource 工程的资源目录
/src/test 单元测试目录
/src/test/java
/target 输出目录,所有的输出物都存放在这个目录下
/target/classes 编译之后的class文件
pom中依赖
groupId 必须 团体标识 com.
artifactId 必须 项目的唯一标识符 tomcat
version 必须
scope 作用域限制
type 一般在pom引用依赖时候出现,其他时候不用
optional 是否可选依赖
常用的mvn依赖
fastjson
easyexcel
lombok 省去setter getter
Apache
Apache是Web服务器,Tomcat是Java应用服务器。
优点:处理静态文件速度快,适合静态HTML和图片。
缺点:配置相对复杂,自身不支持动态页面。不支持动态请求如:CGI、Servlet/JSP、PHP、ASP等;
Tomcat
是Java开发的一个符合JavaEE的Servlet规范的JSP服务器(Servlet容器),是 Apache 的扩展。
优点: 基于java-Servlet容器。 处理动态请求,静态HTML 动态 JSP Servlet 都能处理。
缺点: 只能用作java容器,效率没有Apache高。
8080:建立http连接 用,如浏览器访问
8005:关闭tomcat通信接口
8009:与其他http服务器通信接口,用于http服务器集合
Nginx
优点:nginx常用做静态内容服务和反向代理服务器,直接外来请求转发给后面的应用服务器,
负载均衡、反向代理、处理静态文件优势。Nginx 处理静态请求的速度高于Apache。
Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。
缺点:Nginx 只适合静态和反向代理。
将服务器接收到的请求按照规则分发的过程,称为负载均衡。
总结: Apache是同步多进程模型,一个连接对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。
tomcat更多用来做一个应用容器
RPC Remote Procedure Call远程过程调用 ,像调用本地服务一样调用服务器的方法, 基于TCP/IP传输层协议, 架构包括 客户端,客户端存根,服务端存根,服务端
HTTP服务主要是基于HTTP协议的,遵从RESTFUL风格,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
RPC存在效率优势。HTTP协议是在传输层协议TCP之上的,HTTP优点就是简单、直接、开发方便
RPC服务主要是针对大型企业的,而HTTP服务主要是针对小企业的,因为RPC效率更高,而HTTP服务开发迭代会更快
Restful 更简洁,更有层次,更易于实现缓存等机制。
传统 新增+更新=post ,现在 更新=PUT 传统删除=get或post , 现在删除=delete
七层协议
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口; HTTP
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输; TCP/IP
第五层:网络层。定义网络设备间如何传输数据;
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据。
三次招手和四次挥手
TCP三次握手过程
第一次握手:主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,请求建立连接,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
第二次握手:主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用那个序列号作为起始数据段来回应我
第三次握手:主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了,这样3次握手就完成了,主机A和主机B 就可以传输数据了。
四次挥手
第一次: 当主机A完成数据传输后,将控制位=1,提出停止TCP连接的请求 ;
第二次: 主机B收到控制位后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK=1;
第三次: 由B端再提出反方向的关闭请求,将FIN=1 ;
第四次: 主机A对主机B的请求进行确认,将ACK=1,双方向的关闭结束.。
HTTP 超文本传输协议
HTTP服务主要是基于HTTP协议的,遵从RESTFUL风格,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
无状态协议,对于事务处理没有记忆能力,比如被人访问2次,是同一个人还是不同人不会记录。
支持 B/S 及 C/S 模式。
灵活的数据类型,content-type
客户端和服务器端建立连接 -客户端发送请求数据到服务器-服务器端接收到请求后处理,然后将处理结果响应客户端–关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭)
请求行、请求头、请求数据
请求行包括 请求方法,协议,url,端口号
get 请求方式 post 请求方式
HTTP1.1 持续连接,增减缓存-cache-control ,断点传输
Http2.0 连接共享,头部压缩,服务器推送
https 基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
1、SSL 证书费用:开启 HTTPS 要申购 SSL 证书,每年要在证书上花费不菲的费用。
2、HTTPS 连接服务器端资源占用高
3、HTTPS 协议握手费时:多几次握手,网络耗时变长,用户从 HTTP 跳转到 HTTPS 还要一点时间。
HTTPS和HTTP的区别是什么
1、HTTPS是加密传输协议,HTTP是明文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO;
4、 HTTPS标准端口443,HTTP标准端口80;
5、 HTTPS基于传输层,HTTP基于应用层;
6、 HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
7、HTTP默认使用80端口,HTTPS的默认端口为443,如果使用80端口访问HTTPS协议的服务器可能会被拒绝。
HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 ConNECT 方法
Mysql
事务:把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行。
1.原子性:事务是内的操作是一个整体,是不可分割的。
2.一致性:同一个事务,多次读取数据库中的同一个数据,读取的内容应该是一致的,不变的。
3.隔离性:不同事务之间相互独立,互不干扰。
4.持久性:事务提交后,事务内的操作对数据库的修改被永久保存在数据库文件中。
关系型的数据库,存储数据之前,必须先建表建库,随着数据的复杂度越来越高,所建表的数量也就越来越多
无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。
mysql为什么要用索引?
索引可以把随机I/O变为顺序I/O,把所搜结果进行排序,不使用磁盘临时表,减少了存储引擎需要扫描的数据量,加快查询速度
ES
ES是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。
ES是不支持事务,高可用和可扩展。
存储和读取方式: Gateway,代表ES索引的持久化存储方式。ES默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。
原理: 搜索的时候,要依靠倒排索引;排序的时候,需要依靠正排索引
拥有灵活的结构。文档不依赖于预先定义的模式。是层次型的。ES中,每个文档,其实是以json形式存储的
索引(Index) ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。 索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
类型(Type) 类型是索引内部的逻辑分区 一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。
分片(Shard)一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互
节点(Node) 一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。
cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。
terms 精确查找 查询多个字段, 数组
term 精确查找 查询一个字段
match 模糊查找,分词查找。 包含词的任何一个字
match_phrase 模糊查找 包含词的全部。
Redis是一种非关系型持久化数据库,Key-value类型, 推送和订阅, 通知, key 过期等等特性
数据类型多 - 支持Strings、Lists类型(有序)Sets类型(无序)完成排序(SORT)
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。 因为存储在内存中,数据结构简单,所以快。
原子性 - 所有操作都是原子性的
R目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
对于Redis,半支持事务,语法错误会回滚,而运行错误则不会
数据内查询比较高的热点数据,且数据不是变化频繁的。先查redis,再查数据库,缓解数据库查询压力。
可以允许丢失的数据都可以使用redis做存储方案,例如session、缓存、队列数据、临时中专数据、等等
mongodb 是一个内存数据库 通知,推送
易扩展,大数据量高性能,灵活的数据模型,高可用。
灵活的数据模型 - 不需要为事先存储的数据建立字段
大数据 - 具有非常高的读写性能
易扩展 - 去掉了关系型数据库的关系型特性
查看当前数据库: db
查看所有的数据库: show dbs 或者 show databases
切换数据库: use db_name
删除当前数据库:db.dropDatabase()
db.createCollection(name,options) ,
db.stu.insert({name:‘gj’,gender:1})
db.集合名称.save(document)
db.集合名称.find()
db.集合名称.update( ,{multi: })
MongoDB不支持事务操作,多线程读写出错
MongoDB占用空间过大
RabbitMQ
是一个实现了高级消息队列协议(AMQP)的开源消息中间件
broker:消息中间件处理节点,每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。
以broke为中心,采用push,需要确认。
负载均衡需要单独的loadbalancer进行支持。
master queue:每个队列都分为一个主队列和若干个镜像队列。
mirror queue:镜像队列,作为master queue的备份。
在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。
不足:由于master queue单节点,吞吐量受限,导致性能瓶颈。摆脱不了架构设计上的致命缺陷。
Kafka
是一种高吞吐量的分布式发布订阅消息系统
具有高性能、持久化、多副本备份、横向扩展能力、高吞吐量
以Consumer为中心,采用pull,无确认
负载均衡搭配zk,对broke和consumer管理
Producer 消息生产者,向Broker发送消息的客户端
Consumer 消息消费者,从Broker读取消息的客户端
一个Kafka 集群包括很多Broker 消息中间件处理节点,一个Kafka节点就是一个broker
Topic 主题,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。
持久化消息 7天过期。非持久化消息最多4次。
zk - zookeeper
分布式协调服务中间件,文件系统+监听通知机制。 特点:消息广播和崩溃恢复
能提供服务注册、配置管理、容灾备份功能,主leader 从follow管理
主要是它的树形节点来实现的。当有数据变化的时候或者节点过期的时候,会通过事件触发通知对应的客户端数据变化了,然后客户端再请求zk获取最新数据,采用push-pull来做数据更新。
消息广播:集群中zk在数据更新的时候,通过leader节点将将消息广播给其他follower节点,采用简单的两阶段提交模式,先request->ack->commit,当超过一半的follower节点响应可以提交就更新代码。
崩溃恢复:当leader挂了,或者超半数follower投票得出leader不可用,那么会重新选举,这段期间zk服务是不可用的。通过最新的 xid来选举出新的leader,选举出来后需要将新的leader中的数据更新给超过半数的follower节点才能对外提供服务。
分布式
一个业务分拆多个子业务,部署在不同的服务器上。
TestNg https://blog.csdn.net/df0128/article/details/83243822
配置TestNG.xml 设置某些文件执行 ?
@setup @Test @teardown
@BeforeGroups @AfterGroups
@BeforeSuite @AfterSuite
@BeforeClass @AfterClass
@BeforeTest @AfterTest
@DataProvider 数据驱动,提供二维数组 Object [] []
@Test(enabled = false) 忽略这个case不执行
@Test(timeOut = 5000) 性能测试 超时失败
@Test(groups=“group2”) 此用例归属某个组 可以有多个 @Test(groups = {“mysql”,“database”})
@Test(dependsonMethods= {“TestNgLearn1”}, alwaysRun=true) 依赖某个方法 dependsOnGroups
使用参数
1 注解,然后xml中读取参数
@Test(enabled=true)
@Parameters({“param1”, “param2”})
2 @DataProvider使用参数
@DataProvider(name = “xx”)
@Test(dataProvider = “xx”)
TestNG.xml文件
报告名称 详细程度 串行并行 none parallel为并行才有用
parallel = tests,
TestNG 会在相同的线程中运行相同标记下的所有方法, 但每个下的方法会运行在不同的线程下。
应用:可以将非线程安全的类放在同一个标签下,并且使其可以利用TestNG多线程的特性的同时,让这些类运行在相同的线程中。
parallel = methods
TestNG 会在不同的线程中运行测试方法,除非那些互相依赖的方法。那些相互依赖的方法会运行在同一个线程中,并且遵照其执行顺序。
parallel = classes
TestNG 会在相同线程中相同类中的运行所有的方法,但是每个类都会用不同的线程运行
包含 不包含
顺序
@BeforeSuite---------
@BeforeTest-------
@BeforeClass-------
@BeforeMethod-------
suite中方法执行顺序,preserve-order=true时,按照顺序执行。
同一类中多个方法,执行顺序是按照方法名的首字母升序排序执行的,也可以,使用priority指定执行顺序(默认值为0),数值越小,越靠前执行
获取class名:
Thread.currentThread().getStackTrace()[1].getClassName();
获取方法名:
Thread.currentThread().getStackTrace()[1].getMethodName();
获取行号:
Thread.currentThread().getStackTrace()[1].getLineNumber();
获取文件名(带后缀):
Thread.currentThread().getStackTrace()[1].getFileName();
测试环境查看
kubectl get pod -n citest| grep kic-crm-commercial
查看具体容器日志
kubectl logs -n citest --tail=200 -f
简便命令 写到 ~/.bash_profile这个文件中
kp 查pod kl+服务器 查日志
aliap kp=“kubectl get pods -n citest|grep kic-crm-”
alias kl="kubectl logs -n citest --tail=200 -f "
cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Kubernetes k8s是Google开源的一个容器编排引擎
它支持自动化部署、可弹性运行、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,
实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
xxl XXL-JOB
是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
xxl-job环境依赖于mysql,不用ZooKeeper,与SpringBoot有非常好的集成.
对于企业维护起来成本不高,还有失败的邮件告警
QPS
QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,单位时间处理流量的能力
服务系统一定时间内接收客户端请求的一个并发处理能力。
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3
TPS 每秒传输的事物处理个数 单位时间处理事务的能力
TPS是对服务系统请求的响应能力。测试人员会主动按一定tps的量来主动发起接口请求,比如tps=50,就是每秒请求50次,获取一个平均的响应时间(单位一般都是毫秒ms)。
压力测试人员口中的TPS50 200ms返回,就是指每秒测试人员主动发起50次请求,这些请求会在平均200ms返回。
1、这个服务,在多长时间段,多少人会访问
2、页面的渲染时间+资源文件的载入时间+接口的获取时间需要保证1s~2s内完成。
页面访问的2、5、8原理(用户进入服务2s内要展示完所有内容,超过5秒用户就无法忍受了,超过8秒就没有人再等了,直接关闭服务)
3、接口获取时间 200ms以内(考虑到你页面也要2s打开,还要给其他工作留时间)
总请求数 = 用户数2w * 请求数 2次 = 4w
每秒要求处理的请求数=总请求数/时间(120秒) 即约350
接口幂等
通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次,比如:
订单接口, 不能多次创建订单
支付接口, 重复支付同一笔订单只能扣一次钱
支付宝回调接口, 可能会多次回调, 必须处理重复回调
普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次
悲观锁
这是一种对数据的修改持有悲观态度的并发控制方式。总是假设最坏的情况,
每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。
select … for update (写锁、排它锁)
乐观锁
假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,
如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
CDN
内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,
当终端用户(北京)发起HTTP请求时,处理流程如下:
当终端用户(北京)向www.a.com下的指定资源发起请求时,首先向LDNS(本地DNS)发起域名解析请求。
LDNS检查缓存中是否有www.a.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
当授权DNS解析www.a.com时,返回域名CNAME www.a.tbcdn.com对应IP地址。
域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
LDNS获取DNS返回的解析IP地址。
用户获取解析IP地址。
用户向获取的IP地址发起对该资源的访问请求。
如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。
(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。
DDL (Data Definition Language 数据库定义语言): 用于定于数据库的三级结构,包括外模式、概念模式、内模式及相互之间的映像,定义数据的完整性、安全控制等约束。DDL不需要commit。
DDL包括:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME
DML (Data Manipulation Language 数据操作语言): 分为交互型DML和嵌入型DML,需要commit。
DML包括:INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE
DQL (Data Query Language 数据查询语言): 查询
DQL包括:SELECT
DCL (Data Control Language 数据库控制语言): 用于授权、角色控制
DCL包括:GRANT授权、REVOKE取消授权
TCL (Transaction Control Language 事务控制语言): 事务操作
TCL包括:SAVEPOINT事务中设置保存点可用于回滚、ROLLBACK回滚、SET TRANSACTION改变事务、COMMIT保存完成的工作
敏捷迭代
冲刺会、早会、总结会
三方会议才有效
风险意识、过程管理、项目控制
线程
创建线程的三种方法
1、继承Thread类,重写run方法,创建子类对象,调用start方法
2、new Thread(new Runable).start
3、new Thread(FutureTask.Callable接口) 对象.get()
ExecutorService线程池
核心线程数,总线程数
ThreadPoolExecutor(int corePoolSize, // 1 核心线程池大小
int maximumPoolSize, // 2 最大线程池大小
long keepAliveTime, // 3 线程最大空闲时间
TimeUnit unit, // 4 时间单位
BlockingQueue workQueue, // 5 线程等待队列
ThreadFactory threadFactory, // 6 线程创建工厂
RejectedExecutionHandler handler ) { //7 拒绝策略
拒绝策略
AbortPolicy 默认 丢掉这个任务并且抛出RejectedExecutionException异常
DiscardPolicy 直接丢掉这个任务并且不会有任何异常
DiscardOldestPolicy 丢弃最老的。
CallerRunsPolicy 添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行
自定义 只要实现RejectedExecutionHandler接口
//可缓存线程池
ExecutorService ThreadPool1 = Executors.newCachedThreadPool();
//可重用固定个数的线程池
ExecutorService ThreadPool2 = Executors.newFixedThreadPool(2);
//定长线程池 支持定时及周期性任务执行——延迟执行
ScheduledExecutorService ThreadPool4 = Executors.newScheduledThreadPool(5);
//延迟1s,每3s执行1次
ThreadPool4.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println(“延迟1秒后每3秒执行一次”);
}
}, 1, 3, TimeUnit.SECONDS);
//单线程化的线程池
ExecutorService ThreadPool5 = Executors.newSingleThreadExecutor();
ThreadPool5.execute
BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
ArrayBlockingQueue(int i):规定大小的BlockingQueue,其构造必须指定大小。其所含的对象是FIFO顺序排序的。
linkedBlockingQueue()或者(int i):大小不固定的BlockingQueue,若其构造时指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE来决定。其所含的对象是FIFO顺序排序的。
PriorityBlockingQueue()或者(int i):类似于linkedBlockingQueue,但是其所含对象的排序不是FIFO,而是依据对象的自然顺序或者构造函数的Comparator决定。
SynchronizedQueue():特殊的BlockingQueue,对其的操作必须是放和取交替完成。
网关
网关是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。
API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,
这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,
而不用去处理这些策略性的基础设施。
性能指标有哪些?
注册用户数、在线用户数、并发用户数、请求响应时间、事务响应时间、每秒点击数、吞吐率、业务成功率、tps(每秒事务处理数)、资源利用率,cpu、内存、带宽等
软件测试的目的与原则
使用人工或自动化,来测试某个系统的过程。目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别,目的在于发现错误.
一个成功的测试用例在于发现至今未发现的错误,一个成功的测试是发现了至今未发现的错误的测试。
软件生存周期及其模型是什么?
是从可行性研究到需求分析、需求设计、编码、测试、软件发布维护的过程。在经历需求、分析、设计、实现、部署后,软件将被使用并进入维护阶段,直到最后由于缺少维护费用而逐渐消亡。这样的一个过程,称为"生命周期模型"(Life Cycle Model)。



