小编说一下分布式管理事务
简单的来说呢, 分布式事务其实就是一次大的操作分成了好的小的操作, 这些小的操作分别部署在不同的服务器上, 而且属于不同的应用, 分布式的事务其实就是保证这些小的事务要么都成功, 要么都失败.
分布式事务出现的场景比如在支付和在线下单都会出现, 我了解的分布式事务管理解决方法就是二次提交, 基于 MQ 的特性, MQ 作为二次提交的中间节点, 负责储存请求数据的, 在失败的情况下可以进行多次尝试, 还有可以基于 MQ 中的事务回滚操作, 可以保证性能, 又能保证业务一致性的方案.
请你简单介绍一下 SpringCloud 组件分别是什么, 并有什么用处?
SpringCloud 中有五个组件, 分别是:
服务发现 --Eureka
负载均衡 --Ribbon
断路器 --Hystrix
网关 --Zuul
配置 --SpringCloud Config
Eureka 是 Netflix 的一个子模块, 也是核心的模块之一, Eureka 是一个基于 REST 的服务, 用于定位服务, 服务注册等功能, 有了这些功能, 只需要使用服务的标识符, 就可以访问到服务, 而不需要调用服务的配置文件了, 功能类似于 dobbo 中的 zookerper.
Ribbon 主要提供负载均衡算法, 它提供了一系列的配置项, 比如连接超时, 重试, 重试算法等, 他有一些实现策略: 简单轮询负载均衡, 加权响应时间, 区域感知轮询, 随机负载均衡.
Hystrix 可以防止个应用程序多次试图执行一个操作, 就是很可能失败的操作, 断路器模式也可以检测出故障是不是解决了, 如果问题得到了解决, 那么应用程序就可以尝试调用操作.
Zuul 网关类似于 Nginx, 反向代理, 不过 netflix 自己增加了一些配合其他组件的特性.
Spring Cloud Config
这个是静态的, 得配合 SpringCloudBus 实现动态的配置更新.
为什么 eureka 可以实现高可用?
在微服务的项目中, 我们要考虑到发生故障的情况, 所以也要对服务的注册中心也要进行高可用的部署, 那么 eureka 就是通过多个实例进行互相注册, 然后修改每个 serviceUrl 就可以, eurekaServer 的高可用其实就是将自己作为服务去其他的注册中心注册自己, 这样就可以形成一组互相注册的注册中心, 就可以实现服务清单的互相同步, 这样就达到了高可用的情况.
Git 合并分支的命令是什么?
查看分支: Git branch
创建分支: Git branch
切换分支: Git checkout
创建 + 切换分支: Git checkout -b
合并某分支到当前分支: Git merge
删除分支: Git branch -d
HashMap 和 HashTable 的区别?
首先他们两个的底层都是基于数组 + 链表实现的, 然后 hashtable 的 key 和 value 都不可以为空, 他是线程安全的, 他实现线程安全的方法是在修改数据时锁住整个 hashtable, 这样的话效率就会很低.
Hashmap 是线程非安全的, 他可以存空值, 我对他印象比较深的就是他的初始 size 是 16, 然后每次扩容都是以 2 的 n 次幂扩容的.
负载均衡的策略有哪些?
大约有很多种, 但我了解的有轮询的方式和最小连接数, 轮询就是很简单的实现, 依次将请求发送给后端的服务器, 有点就是实现简单, 请求分配均匀, 缺点也是在均匀, 因为有的服务器性能好, 可以承受更多的请求, 但是他都是均匀分配的, 所以也是有不合适的地方. 最小连接数就是在后端服务器性能差异较大的话, 可以优化 lc 的性能, 高权值的服务可以承载更高的连接负载.
线程池是什么?
线程池就是 java.util 包下的有一个接口, 用来创建线程池的, 加入一个服务完成一项任务需要的时间是创建线程的时间, 执行线程的时间, 和销毁线程的时间, 如果创建的时间和销毁的时间大于执行任务的时间, 那我们就要采用线程池来提高服务器的性能了, 线程池包括: 线程池管理器 (就是用来创建并管理线程的, 也包括销毁, 添加新任务) 工作线程(线程池中的线程, 在没有任务处于等待的情况下, 可以循环的执行任务) 任务接口(每个任务必须实现接口, 供工作线程的调用), 任务队列(用来存放没有处理的任务, 提供一种缓冲的机制) 线程池就是关注如何优化创建线程时间和销毁线程时间的.
常见的线程池有单个的线程池, 和固定数量的线程池, 还有就是无数量限制的线程池.
熔断是什么, 用来处理什么问题的?
熔断机制就是应对微服务雪崩效应的一种链路保护机制, 就是当我们某个微服务忽然不可用或者响应时间过长的时候, 就会进行服务降级, 熔断该节点的服务调用, 然后响应错误信息, 等到检测这个应用响应正常的时候, 再恢复这个链路. SpringCloud 中的熔断是通过 Hystrix 实现的, 它会监测服务的调用状况,
当失败到达一定阈值的时候, 就会启动熔断, 熔断机制的注解就是加一个注解,@hystrixCommand.
线程间的通信是什么, 通信状态有几种?
在一个进程中, 线程一般都不是单独存在的, 而是多个线程之间需要进行通信的. 他们的体现就是, 当一个线程传输数据给另一个线程, 一个线程执行完特定的任务后转到另一个线程继续执行任务. 线程通信的方法有 perform, 还有 NSmachport: 本地之间的通信, 通过传递端口对象变量进行端口间的通信. 他应该是通过代理模式来传递消息的. 管道, 命名管道, 信号, 消息队列, 共享内存
消息队列是干什么的, 举一个实际应用场景?
消息队列 MQ 就是一个保存消息的容器, 另外它也是一个高性能的中间件.
实际场景的话当我们用户注册后要初始化好多操作, 比如调用邮箱服务发邮件, 调用促销活动发优惠券, 这时候我们就可以把监听服务交给 MQ, 当用户注册成功之后, 就通知 MQ 让其他服务开始操作, 确保能保证用户的性能.
为什么要做服务降级?
因为当我们的服务压力剧增的情况下, 要根据实际业务以及流量, 对一些服务和页面要有策略的不处理或者换一种简单的方式处理, 从而释放服务器资源保证核心交易正常工作或者高效工作.
熔断和服务降级是用什么实现的?
Springcloud 有服务熔断和降级的机制是 Hystrix, 通过 Hystrix 的注解 HystrixCommond 实现的. 服务降级有几种实现方法, 超时降级, 故障降级, 限流降级. 也可以在配置中心配置
sql 的隔离级别有哪些.
未提交读: 事务还没提交, 而别的可以看到他修改数据的后果, 就是脏读.
提交读: 就是一个事务在执行的时候, 其他事务看不到他的操作, 所以看到的是旧数据, 也是无效的数据.
可重复读: 可以保证读取同一条数据的一致性, 却不能保证没有插入新的数据.
可串行化: 是最高的隔离级别, 由于他加上了大量的锁, 所以可能会出现大量的请求超时, 性能比较低下.
Localstorge 是干什么的, sessionstorge 是做什么, sessionstorge 和 Localstorge 的区别
sessionStorage 仅在当前浏览器关闭之前有效, 不在不同的浏览器窗口共享, 在同源的同窗口可以共享跨页面刷新依然存在, 存在本地. 如果浏览器支持, 浏览器崩溃并重启之后依然会存在.
localStorage 除非主动清除否则始终有效, 无论窗口关闭与否, 存储大小达 5M, 存本地
Spring 原理?
内部最核心的就是 IoC 了, 动态注入, 让一个对象的创建不用 new 了, 可以自动的生产, 这其实就是利用 java 里的反射, 反射其实就是在运行时动态的去创建, 调用对象, Spring 就是在运行时, 跟 xml Spring 的配置文件来动态的创建对象, 和调用对象里的方法的 .
Spring 还有一个核心就是 AOP 这个就是面向切面编程, 可以为某一类对象 进行监督和控制 (也就是 在调用这类对象的具体方法的前后去调用你指定的 模块) 从而达到对一个模块扩充的功能. 这些都是通过 配置类达到的.
Spring 目的: 就是让对象与对象 (模块与模块) 之间的关系没有通过代码来关联, 都是通过配置类说明管理的(Spring 根据这些配置 内部通过反射去动态的组装对象)
要记住: Spring 是一个容器, 凡是在容器里的对象才会有 Spring 所提供的这些服务和功能.
- spring aop? IoC ?
- IoC
概念: 控制权由对象本身转向容器; 由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
核心: bean 工厂; 在 Spring 中, bean 工厂创建的各个实例称作 bean
AOP
1, 代理的两种方式:
静态代理:
l 针对每个具体类分别编写代理类;
l 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个 InvocationHandler, 然后借用 JDK 反射包中的 Proxy 类为各种接口动态生成相应的代理类
tomcat 优化?
优化连接配置, 可以修改 conf/server.xml 文件, 修改连接数, 关闭客户端 dns 的查询.
采用集群
调整线程数量
优化 tomcat 参数
什么是反射?
Java 反射就是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意方法和属性; 并且能改变它的属性
spring 拦截器 sturts 过滤器有什么区别?
1. 拦截器是基于 java 反射机制的, 而过滤器是基于函数回调的;
2. 拦截器不依赖于 servlet 容器, 而过滤器依赖于 servlet 容器;
3. 拦截器只能对 Action 请求起作用, 而过滤器则可以对几乎所有请求起作用;
4. 拦截器可以访问 Action 上下文, 值栈里的对象, 而过滤器不能;
5. 在 Action 的生命周期中, 拦截器可以多次调用, 而过滤器只能在容器初始化时被调用一次.
6.Springmvc 的入口是一个 servlet 即前端控制器, 而 Struts2 入口是一个 filter 过虑器
sql 优化?
模糊查询的时候不要在字段前面加 %
多用 join 少用子查询
给常用的字段加索引
Where 和 having 相比较用 where
为什么要加索引?
在一个或者一些字段需要频繁操作的时候, 创建索引会提高会快的速度, 因为会从全盘扫描改为索引扫描, 但是索引不是越多越好, 太多的索引会占用很多的索引表空间, 而且加上索引之后, 执行 insert 操作会很慢.
MySQL 中的 mysam 和 innodb 是干什么的
Mysam 和 innodb 是 MySQL 中最常见的两个表类型, 各有优缺点, innodb 具有事务回滚和崩溃修复的能力, Mysam 相对简单所以效率上要比 innodb 好, 所以在进行读写分离的时候, innodb 适合做写的操作, mysam 适合做读的操作
Jvm 结构?
方法区, java 堆, java 栈, 本地方法栈, 指令计数器以及其他隐含寄存器
Wait 和 sleep 的区别
这两个方法来自不同的类分别是 Thread 和 Object
最主要是 sleep 方法没有释放锁, 而 wait 方法释放了锁, 使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁).
wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用, 而 sleep 可以在任何地方使用(使用范围)
sleep 必须捕获异常, 而 wait,notify 和 notifyAll 不需要捕获异常
Java 开发模式都有什么?
集中式架构
分布式服务
微服务
垂直拆分
服务治理(SOA)
线程池
线程池就是提前创建若干个线程, 如果有任务需要处理, 线程池里的线程就会处理任务, 处理完之后线程并不会被销毁, 而是等待下一个任务. 由于创建和销毁线程都是消耗系统资源的, 所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能
来源: http://www.jianshu.com/p/4104566f1d08