由于同源策略, 当客户端和服务端再也不同一域下时, 要解决请求的跨域问题java
通常有两种方法 1) JSONP 2) CORSnode
JSONP仅限于GET请求,有必定的局限性web
CORS能够知足多种方法的请求, 须要作的是对response的响应头改写, 处理方式能够用Filter过滤指定范围的请求面试
CORS请求分为简单请求和非简单请求redis
简单请求要知足如下条件算法
Accept
、Accept-Language
、Content-Language
、Last-Event-ID
、Content-Type
(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)非简单请求时指对服务器有特殊要求的请求数据库
好比PUT \ DELETE方法, Content-Type是application/json的请求编程
非简单请求会先发送一个预检请求, 用OPTION方法.json
Remote Procedure Call \ 远程过程调用 : 一个计算机通信协议, 能够实现像调用本地服务同样调用远程服务, 而且让网络通信过程透明. 通常使用IDL接口定义语言, 方便跨平台远程过程调用.设计模式
如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle(开源)等都是基于RPC的框架.
RPC作到让中间的网络通信过程透明化, 通常选择动态代理的方式实现.
序列化是将数据结构或者对象转化成二进制串, 也就是编码的过程.
反序列化是将二进制串转换成数据结构或者对象的过程.
序列化是为了 进行网络传输
反序列化是为了 后续对其处理
Netty是一款基于NIO开发的网络通讯框架, 对比于BIO, 他的并发性能获得很大提升.
不少RPC框架是基于Netty这一IO通讯框架, 好比阿里的HSF, Dubbo, Twitter的finagle等.
RPC是基于TCP/IP协议的 , HTTP是基于HTTP协议的 , 传输效率RPC效率更高一些 .
结构性模式,不是建立型模式
咱们建立具备现有对象的对象, 并向外界提供功能接口. 以解决直接访问对象时带来的问题, 好比访问情景多样化, 直接访问会给使用者或者系统结构带来不少麻烦, 因此在访问此对象时, 加上一个对此对象的访问层.
代理模式是指 一个公共接口,一个实现类,一个代理类,代理类持有实现类实例,代理执行实例方法。 执行过程当中不直接访问实体对象,而是经过代理对象访问。
代理过程当中能够加上一些其余的用途。Spring的AOP面向切面编程是基于动态代理, 切入的点就是一个个被代理的类.
代理类和实体类已经肯定, 在编译以前已经完成.
在程序执行过程当中建立代理类是动态代理. 能够统一的管理代理类.
java.lang.reflect包下的Proxy类用来动态建立一个代理对象的类
而且须要实现InvocationHandler这个接口,让每一个代理类的实例都关联到了一个handler,当咱们经过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用
RESTful是一种架构风格, REST意思是表示层状态转化(Representation state transfer)
REST的特色是
程序同步执行 , 当代码A执行完以后再执行B , 若是A没有执行完 , B要等待 .
程序异步执行 , 当代码A执行中 , B不须要等待A执行完再执行 , 能够进入就绪状态准备执行 .
在A代码片断中 , 会执行B , 当B执行完 , B会执行A的callback函数 . 这是一种机制 . 能够将A和B抽象成接口 , 易于扩展 .
核心功能 , 核心容器提供IoC
面向切面编程
提供了针对web开发的特性
集成了JDBC , 简化了DAO的开发步骤
整合了第三方持久层框架
提供了web的MVC实现
根据数据流和变化作出响应 , 经过异步和回调的方式 .
TCP须要创建链接,UDP不须要创建链接 TCP的数据是可靠的,UDP不可靠 TCP的采用流的形式,UDP是报文的形式
Vector和ArrayList都是数组形式的集合,Vector是线程安全的,ArrayList不是. ArrayList读取比较快,增删比较慢, LinkedLIst不是线程安全的,是链表形式的,他的增删比较快,可是读取慢 ArrayList初始容量是10,当有数组添加时才真正的分配容量 每次都是经过copyOf的方式扩容到以前的1.5倍
索引的数据结构是:B+树 B-树 散列表 索引是放在内存中的,能够实现快速查询,可是会下降更新表的速度。 索引不走like,可是‘xx%’会走 索引列不能有null值
尽可能在常常用的where和order by上建索引 尽可能不要用in not in ,会扫描全表 尽可能少用or ,会放弃索引
面向服务的架构 , 松耦合 位置透明 可在异构平台复用 便于测试
Dubbo是一个开源的SOA治理方案,是一个分布式服务框架。 注册中心严重依赖第三方zookeeper或者redis,组件出现问题,服务会中断 Dubbo只支持RPC调用 SpringCloud有本身的注册组件Eureka 支持RESTfulAPI 消息组建是Stream 集成了MQ和Apache kafka
线程本地副本 每一个线程都会有一个副本,ThreadLocal建立的副本是存在线程的ThreadLocals里面 应用在数据库链接 session管理方面 解决了线程安全问题 线程能够随时访问 适用set/get方法。
java支持序列化机制,将一个对象表示为一个字节序列
callable的方法是call(),runnable的方法是run() Callable执行方法有返回值 Runnable的执行方法没有返回值 Callable返回一个Future对象,能够经过get获取结果
具备可见性,就是被修饰的变量,一旦被其余线程修改,会当即同步给主存,让其余线程知道 没有原子性 由于被修饰的变量能够被多线程修改
频繁的建立和销毁线程会下降工做效率 提升线程利用率 经常使用参数 corePoolSize(线程池大小) maximumPoolSize(最大线程数) keepAliveTime(可空闲时间) 执行顺序 1. 当前线程小于核心线程数,建立线程 2. 当前线程大于核心线程数,进入任务队列 3. 任务队列满了,核心线程数小于最大线程数,建立线程 4. 抛出异常
-127~128
synchronized最慢 synchronized和lock是实现同步锁(原子性)的两种方式 Lock提供了更普遍,更优雅的方式. synchronized在执行完后会自动释放,lock要手动释放 synchronized是jvm里面的,是java的关键字,lock是一个类 synchronized会让等待的线程一直等待,lock会尝试得到锁
ConrurentHashMap作了什么 线程安全:Vector HashTable StringBuffer 线程不安全:ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBuilder Collections.synchronizedMap()可使集合线程安全 ConrurentHashMap是线程安全的HashMap
谈谈你对HashMap的掌握 HashMap不是线程安全的,以数组方式存储Key-value构成的Entry对象,无限量扩容,扩容时要从新计算Hash
String StringBuffer StringBuider有什么区别 String 是不可变的,不能被继承和修改,用final修饰的类,线程安全. StringBuffer能够被改变,可是线程不安全. StringBuilder也是可变的,线程安全.
如何排除 线程T1和T2,T1得到L1,可是要得到L2后才能释放L1,T2得到L2,可是要得到L1之后才能释放L2,这样有可能会出现死锁,避免方式是加synchronized同步锁.
程序计数器(至关于指针 不共享) 虚拟机栈 (运行时的数据,方法 不共享) 方法区 (常量,类信息,变异后的代码 线程共享) 堆 (建立的对象 线程共享) 本地方法栈 (本地方法运行时的数据 不共享)
BeanFactory根据标识建立bean的过程
singleton做用域建立的bean , SpringIoC容器中只有一个对应的实例 .
SpringAOP基于JDK的动态代理
ApplicationListener的实现 . 定义一种一对多的关系 , 当一个对象状态发生改变时 , 其余的对象也对应发生改变 .
不是一个框架,而是快速构建项目的方式 默认的代码和注释配置 以最少的配置或者零配置开发和构建 适用新项目,不适合将SpringFramework的项目转化 SpringBoot约定过配置,不须要声明资源映射,资源映射会自动处理。
单例模式不必定线程安全,涉及多线程时要对其改造,通常是加锁或者适用threadlocal。
在分布式系统中 协调各个节点 监视各个节点的状态 根据节点提交的反馈进行下一步的合理操做
提供了文件系统 通知机制
根据是否持久化 / 是否有编号 分为四种znode节点 .
通知机制 是watch关心的节点 当发生变化时 , 通知客户端 .
命名服务
惟一的path 能够经过path相互发现
配置管理
管理配置 , 将配置信息放到zk的节点上去 并监听对应的节点 当有配置发生变化时能够通知应用程序 .
集群管理
有新的节点加入或退出 选举master
分布式锁
能够把zk的节点当作一把锁 , 全部程序都去建立这个节点 , 成功的即获得锁 , 用完删除便可释放锁 .
其余未获得锁的程序能够排序建立节点 , 等锁释放了 , 按照顺序获得锁 .
单例做用域下 scope = singleton , 表示一个bean 在Spring IoC 容器中只有一个实例 .
prototype做用域中 , 每一次请求都会建立一个实例 , 并配置和装饰 , 但不会调用对象的生命周期回调函数 , 不会负责bean的生命周期 .
在每一次的HTTP 的request / session中建立实例 , 而且尽在request / session中有效 .
java的反射机制能够得到对象的类 , 以及属性 , 方法 , 和构造函数 .
动态代理基于反射机制 . IoC的依赖注入也是基于反射机制 .
抽象类经过extends继承 , 接口是经过implements实现接口 .
抽象类能够有构造器 , 接口没有构造器 .
抽象类和接口都不能实例化
接口中的方法只能是public的 , 但抽象方法没有限制
只能继承一个抽象类 , 能够实现多个接口
事务要完整 , 要么所有作完 , 要么没有作
事务开始到结束 , 数据库的完整约束没有变 .
事务在访问数据库时 , 不被干扰 , 相互隔离 .
事务完成后 , 数据库不能回滚 .
脏读
不可重复读
幻读
使用缓存技术 / 查询语句的优化 / 优化表结构加索引 / 集群的方式
基于C开发 / 跨平台 / 能够做为HTTP服务器做为网站的发布处理 / 做为反向代理服务器实现负载均衡
将一个数据表和索引分别存储在不一样的物理文件中
-- 增长 partition by range(id){ partition user_1 values less than (10), partition user_2 values less than (20) } --删除 alter table user drop partition user_1 ; alter talbe user drop partition user_2;
分区的表不支持外键 , 可能会让索引失灵 .
map.get(key);
map.put(key, value);
list.get(location);
list.add(object);
boolean flag = set.add(object);
dataType[] array = new dataType[size]
加载 - 链接(验证 - 准备 - 解析) - 初始化 - 使用 - 卸载
加载
将class加载到jvm的方法区中
链接
验证 检验加载类是否有问题
准备 将静态变量分配内存
解析 将符号转化成直接引用
初始化
执行Static静态的代码块 - 执行构造函数 (从父类开始)
BootstrapClassLoader jre/lib/rt下的
ExtensionClassLoader jre/lib/ext下的
AppClassLoader classpath下的
CustomClassLoader 自定义的