框架部分
3.1Dubbo
1.Dubbo是什么?
答:DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用协议)远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架
说白了就是个远程服务调用的分布式框架
其核心部分包含:
1).远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2). 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3). 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
2.为什么要用Dubbo(优点和好处),解决什么问题?
答:Dubbo提供了三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现。
①透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
②软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
③服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
3.Dubbo如何暴露与发现服务?(一定要懂)
答:
节点角色说明: · Provider: 暴露服务的服务提供方。 · Consumer: 调用远程服务的服务消费方。 · Registry: 服务注册与发现的注册中心。 · Monitor: 统计服务的调用次调和调用时间的监控中心。 · Container: 服务运行容器。
调用关系说明: 0).服务容器负责启动,加载,运行服务提供者。
1).服务提供者在启动时,向注册中心注册自己提供的服务。
2).服务消费者在启动时,向注册中心订阅自己所需的服务。
3).注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推
送变更数据给消费者。
4).服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,
如果调用失败,再选另一台调用。
5).服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
4.Dubbo 和 Spring Cloud 有什么区别?
答:Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。这两种方式各有优劣。对于类似于电商等同步调用场景多并且能支撑搭建Dubbo 这套比较复杂环境的成本的产品而言,Dubbo 确实是一个可以考虑的选择。虽然在一定程度上来说Spring Cloud牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适。
5.Dubbo 支持的通信协议有哪些?
答:1).dubbo协议(默认),使用NIO异步通信,单一长连接,hessian序列化协议,使用在传输数据量较小(每次请求在100kb以内),但是并发量很高的场景。
2).rmi(Remote Method Invocation 远程方法调用)java二进制序列化,使用在多个短连接,使用在消费者和提供者数量差不多的情况,适用于文件的传输,一般比较少用。
3).hessian协议,hessian序列化协议,多个短连接,使用在提供者比消费者数量还多的请你赶快,适用于文件传输,一般比较少用。
6.怎么实现远程通信
答:远程通信:简单来说,就是一个系统去调用另一个系统中的数据.
常见的有三种方式:
(1)Webservice的方式:
1)优点:跨语言跨平台
2)缺点:它是基于soap协议的,使用http+xml的方式进行数据传输,http是应用层协议,传输效率不是很高,而且xml的解析也比 较费时,所以项目内部进行通信的时候,不建议使用Websservice的方式
(2)restful形式的服务:
1)优点:restful本身就是http,使用的是http+json的方式进行数据传输,因为json数据本身是非常简洁的,所以它比webservice的 传输效率更高;手机app端一般都使用该方法,其他很多项目也是用这种方式
2)缺点:如果服务太多的话,会出现服务之间调用关系混乱,此时就需要治理服务
(3)Dubbo:
使用的是RPC协议进行远程调用,RPC协议是一个二进制协议,直接使用的socket进行通信,传输效率高,并且可以统计出系统 之间的调用关系和调用次数系统分布式SAO系统的内部通信推荐使用dubbo
7.Dubbo为什么使用异步单一长连接?
答:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
8.Dubbo有哪几种集群容错方案,默认是哪种?
答:①Failover Cluster:失败重试
当服务消费方调用服务提供者失败后自动切换到其他服务提供者服务器进行重试。这通常用于读操作或者具有幂等的写操作,需要注意的是重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
②Failfast Cluster:快速失败
当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。通常这种模式用于非幂等性的写操作。
③Failsafe Cluster:失败安全
当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。
④Failback Cluster:失败自动恢复
当服务消费端用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作。
⑤Forking Cluster:并行调用
当消费方调用一个接口方法后,Dubbo Client会并行调用多个服务提供者的服务,只要一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
⑥Broadcast Cluster:广播调用
当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。
如上,Dubbo本身提供了丰富的集群容错模式,但是如果您有定制化需求,可以根据Dubbo提供的扩展接口Cluster进行定制。
9.Dubbo的异常机制是什么?
答:Dubbo有一个名为ExceptionFilter的异常过滤器,包含如下机制:
1).如果是checked异常,直接抛出 !
2).在方法签名上有声明,直接抛出 throws MyCustomException
3). 异常类和接口类在同一jar包里,直接抛出
4). 是JDK自带的异常,直接抛出(className.startsWith("java.") || className.startsWith("javax."))
5). 是Dubbo本身的异常,直接抛出(RpcException)
6). 其他异常通过RuntimeException
10.挂机_Dubbo挂机了怎么处理
答:首先zookeeper挂了还能调用服务,在启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用。但是在注册中心全部挂掉后增加新的提供者,则不能被消费者发现.(前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的。)
11.安全_dubbo+zookeeper如何解决不同系统间调用的安全性问题
答:Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。 (1)可以全局设置开启令牌验证:
<!--随机token令牌,使用UUID生成-->
<dubbo:provider interface="com.foo.BarService" token="true" />
<!--固定token令牌,相当于密码-->
<dubbo:provider interface="com.foo.BarService" token="123456" />
(2)也可在服务级别设置:
<!--随机token令牌,使用UUID生成-->
<dubbo:service interface="com.foo.BarService" token="true" />
<!--固定token令牌,相当于密码-->
<dubbo:service interface="com.foo.BarService" token="123456" />
(3)还可在协议级别设置:
<!--随机token令牌,使用UUID生成-->
<dubbo:protocol name="dubbo" token="true" />
<!--固定token令牌,相当于密码-->
<dubbo:protocol name="dubbo" token="123456" />
12.Zookeeper 介绍(谈谈你对zookeeper的了解)
答:官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbox 服务的注册中心,工业强度较高,可用于生产环境。
13.作用_zookeeper注册中心的作用?端口是多少
答1)作用:Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。
(2)端口及作用
①2181:对cline端提供服务
②3888:选举leader使用
③2888:集群内机器通讯使用(Leader监听此端口)
14.zookeeper在项目中怎么用的
答:1.作为dubbo的注册中心,暴露服务,然后消费方订阅服务用的
2.作为solr集群的调配中心,达到负载均衡的效果
15.缺陷_zookeeper存在什么缺陷
答:①本身不是为高可用性设计,master撑不住高流量容易导致系统crash;②zookeeper的选举过程速度很慢;③难以避免数据的不一致;④zookeeper的性能是有限的
3.2springmvc
1.讲下 springmvc框架的工作流程
答一:1)、用户向服务器发送请求,请求被 SpringMVC的前端控制器 DispatcherServlet截获。
2)、DispatcherServlet对请求的 URL(统一资源定位符)进行解析,得到 URI(请求资源标识符),然后根据该 URI,调用 HandlerMapping获得该 Handler配置的所有相关的对象,包括 Handler对象以及 Handler对象对应的拦截器,这些对象都会被封装到一个 HandlerExecutionChain对象当中返回。
3)、DispatcherServlet根据获得的 Handler,选择一个合适的 HandlerAdapter。HandlerAdapter的设计符合面向对象中的单一职责原则,代码结构清晰,便于维护,最为重要的是,代码的可复制性高。HandlerAdapter会被用于处理多种 Handler,调用 Handler实际处理请求的方法。
4)、提取请求中的模型数据,开始执行 Handler(Controller)。在填充 Handler的入参过程中,根据配置,spring将帮助做一些额外的工作
消息转换:将请求的消息,如 json、xml等数据转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换,如 String转换成 Integer、Double等。
数据格式化:对请求的消息进行数据格式化,如将字符串转换为格式化数字或格式化日期等。
数据验证:验证数据的有效性如长度、格式等,验证结果存储到 BindingResult或 Error中。
5)、Handler执行完成后,向 DispatcherServlet返回一个 ModelAndView对象ModelAndView对象中应该包含视图名或视图模型。
6)、根据返回的ModelAndView对象,选择一个合适的 ViewResolver(视图解析器) 返回给
DispatcherServlet。
7)、ViewResolver结合 Model和 View来渲染视图。
8)、将视图渲染结果返回给客户端。
以上 8个步骤,DispatcherServlet、HandlerMapping、HandlerAdapter和 ViewResolver等对象协同工
作,完成 SpringMVC请求—>响应的整个工作流程,这些对象完成的工作对于开发者来说都是不可
见的,开发者并不需要关心这些对象是如何工作的,开发者,只需要在 Handler(Controller)当中完成对请求的业务处理。
答二:
(1)用户发送请求至前端控制器DispatcherServlet; (2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
2、什么是Spring MVC ?简单介绍下你对springMVC的理解?
答:Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
3、Springmvc有什么优点:
答1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4)支持各种请求资源的映射策略。
4、Spring MVC的主要组件?
答1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
5、springMVC和struts2的区别有哪些?
答1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
6.SpringMVC怎么样设定重定向和转发的?
答:①转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
②重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
7、SpringMvc怎么和AJAX相互调用的?
答:通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
1)加入Jackson.jar
2)在配置文件中配置json的映射
3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
8、如何解决POST请求中文乱码问题,GET的又如何处理呢?
答:(1)解决post请求乱码问题:
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
(2)get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致
②另外一种方法对参数进行重新编码:
9、Spring MVC的异常处理 ?
答:可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
10、SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
11、 SpringMVC常用的注解有哪些?
答:@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
12、SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
答:一般用@Conntroller注解,表示是表现层,不能用别的注解代替。
13、如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
答:可以在@RequestMapping注解里面加上method=RequestMethod.GET。
14、怎样在方法里面得到Request,或者Session?
答:直接在方法的形参中声明request,SpringMvc就自动把request对象传入。
15、如果想在拦截的方法里面得到从前台传入的参数,怎么得到?
答:直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
16、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
答:直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面。
17、SpringMvc中函数的返回值是什么?
答:返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
18、SpringMvc用什么对象从后台向前台传递数据的?
答:通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。
19、怎么样把ModelMap里面的数据放入Session里面?
答:可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。
20、SpringMvc里面拦截器是怎么写的:
答:有两种写法:①一种是实现HandlerInterceptor接口;②另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:
21、注解原理:
答:注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
|