您的位置 首页 java

Java面试题 消息中间件

六:消息中间件

1: WebService

基于 RESTful 类型的webService

RESTful是基于jax-rs的WebService.它即支持XML也支持JSON.

JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services的简写,是一个 Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。

使用

1.导入webservice依赖的jar包。支持json格式的jar包以及支持xml格式的jar包。

2.在web.xml文件中配置rest风格的拦截路径

3.创建一个service类,类上加@path注解,定义访问路径

常用注解

2: HttpClient

httpClient是一个支持http协议的客户端编程工具包,我们在java中调用httpClient是通过url模拟了一个http请求,这样就可以通过java代码直接发送请求获得服务端响应数据,首先构建HttpClient,new DefaultHttpClient(); httpClient发送请求的方式也分成两种形式:一个 new httpGet(),一个是new httpPost() 把请求的url放进去,然后用excute发送请求,获取响应信息,里面包含状态码,成功为200,包含响应内容,将内容转换为字符串,最后关闭连接,其中post请求是模拟表单提交完成的、不能传递参数

注意

1、httpclient连接后资源释放问题很重要,就跟我们用database connection要释放资源一样。

2、https网站采用ssl加密传输,证书导入要注意。

3、做这样的项目最好先了解下http协义,比如302,301,200,404返回代码的含义(这是最基本的), cookie ,session的机制。

4、httpclient的redirect状态默认是自动的,这在很大程度上给开发者很大的方便(如一些授权获得cookie),但是有时要手动管理下,比如

有时会遇到CircularRedirectException异常,出现这样的情况是因为返回的头文件中location值指向之前重复(端口号可以不同) 地址 ,导致可能会出现死

循环递归重定向,这时可以手动关闭:method.setFollowRedirects(false)

5、有的网站会先判别用户的请求是否是来自浏览器,如不是,则返回不正确的文本,所以用httpclient抓取信息时在头部加入如下信息:

header.put(“User-Agent”, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)”);

6、当post请求提交数据时要改变默认编码,不然的话提交上去的数据会出现乱码。重写postMethod的setContentCharSet()方法就可以了:

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

  1. 创建HttpClient对象。
  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
  6. 释放连接。无论执行方法是否成功,都必须释放连接

3: dubbo + zookeeper

(1)介绍

Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软 负载均衡 与容错,依赖分析与降级等。

当我们的项目非常大时,我们一般会将项目拆分成多个项目进行来开发,有利于项目的拓展性,这个时候项目与项目之间的相互调用就需要通过 中间件 来调用,我们可以使用dubbo来作为这个中间件。

Dubbo是alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合,从服务模型的角度来看,dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Provider)两个角色。既然有服务提供方和服务消费方那我们就要进行服务定义和服务注册。

1.调用关系

1)服务容器可以启动,加载,运行服务提供者。

2)服务提供者可以在注册中心注册自己提供的服务。

3)服务消费者可以从注册中心调用自己所需的服务。

4)注册中心返回服务提供者的地址列表,供服务消费者从中选择。

5)服务消费者基于软负载均衡算法,从中选择自己所需的服务。

6)可以从安装的监控中心查看运行的状态。

Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。

Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求。

(2)在项目中使用?

1)首先需要在linux中安装zookeeper。

2)在项目中导入dubbo和zookeeper所依赖的jar包,排除两个冲突包。

3)在服务层的applicationContext-service.xml中注册服务。首先用dubbo:application设置服务提供者的名字,然后用dubbo:regisitry设置注册中心的地址和端口号,协议是zookeeper,用dubbo:protocol设置在20880或其他端口号中暴露服务,最后用dubbo:service声明提供服务的接口。

4)在web表现层调用自己所需的服务,首先用dubbo:application设置服务调用者的名字,然后用dubbo:regisitry设置调用的注册中心,地址和端口号。最后用dubbo:referce声明调用服务的接口。

(3)Dubbo的通信协议

a) Dubbo——默认的,单纯 长连接 、NIO异步通信协议。适合数据量小、并发的的场景

b) RMI、 Hessian 、Http、websocket

(4)Dubbo默认使用什么 序列化 框架

默认使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

(5)测试和生产环境公用一套zookeeper,如何保证消费不冲突

a) 通过自定义Filter来实现IP白名单功能

b) 通过service分组功能实现

c) 通过版本控制实现

(6)zookeeper特性

1: 连通性:

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小

监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示

服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销

服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销

注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外

注册中心通过长连接感知服务提供者的存在,服务提供者 宕机 ,注册中心将立即推送事件通知消费者

注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表

注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

2:健状性:

监控中心宕掉不影响使用,只是丢失部分采样数据

数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务

注册中心对等集群,任意一台宕掉后,将自动切换到另一台

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

服务提供者无状态,任意一台宕掉后,不影响使用

服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

3:伸缩性:

注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心

服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

文章来源:智云一二三科技

文章标题:Java面试题 消息中间件

文章地址:https://www.zhihuclub.com/196597.shtml

关于作者: 智云科技

热门文章

网站地图