在以servlet方式集成hessian时很容易获得客户端request,就不做过多介绍,在此介绍一下Hessian结合spring时如何获得客户端request。
在remoting-servlet.xml中配置服务接口
<bean name="/userService" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="user"/>
<property name="serviceInterface" value="com.company.IUser"/>
</bean>
</beans>
我们查看HessianServiceExporter原代码发现:
public void handleRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
在该方法中可以获得客户端request,那我们就会有很多种方法得到此request;Aop方式或重写方法,下面针对重写方法做了一个简单的显示。
Hessian Service 线程上下文,用以线程安全地保存客户端 request:
public class HessianContext {
private ServletRequest _request;
private static final ThreadLocal<HessianContext> _localContext
= new ThreadLocal<HessianContext>() {
@Override
public HessianContext initialValue() {
return new HessianContext();
}
};
private HessianContext() {
}
public static void setRequest(ServletRequest request) {
_localContext.get()._request = request;
}
public static ServletRequest getRequest() {
return _localContext.get()._request;
}
public static void clear() {
_localContext.get()._request = null;
}
}
我们自定义类:
public class OurServiceExporter extends HessianExporter implements HttpRequestHandler {
private static final Logger logger = LoggerFactory.getLogger(OurServiceExporter.class);
@Override
public void handleRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
if (!"POST".equals(request.getMethod())) {
throw new HttpRequestMethodNotSupportedException(
request.getMethod(),
new String[]{"POST"},
"HessianServiceExporter only supports POST requests");
}
response.setContentType(CONTENT_TYPE_HESSIAN);
try {
HessianContext.setRequest(request); //保存Request到Hessian线程上下文
invoke(request.getInputStream(), response.getOutputStream());
}
catch (Throwable ex) {
logger.error("Hessian skeleton invocation failed");
throw new NestedServletException("Hessian skeleton invocation failed", ex);
}
finally {
HessianContext.clear();
}
}
}
在remoting-servlet.xml中配置服务接口
<bean name="/userService" class="com.mycompany.test.OurServiceExporter">
<property name="service" ref="user"/>
<property name="serviceInterface" value="com.company.IUser"/>
</bean>
</beans>
Service开发中就可以直接使用
HessianContext.getRequest(); 来获得客户端的request了,所有的客户端信息随你所用了,而且是线程安全的。
分享到:
相关推荐
例如,`HttpServletRequest`对象提供了`getRemoteAddr()`方法来获取客户端的IP地址,`getQueryString()`获取请求参数,而`getRequestURL()`则返回不带查询字符串的完整URL。如果需要包括查询字符串,可以使用`...
总结,Hessian作为高效的RPC框架,虽然没有内置获取客户端信息的功能,但通过分析其源码并适当扩展,我们能够实现这一需求。需要注意的是,直接修改开源库的源码可能带来维护上的困扰,因此在可行的情况下,推荐使用...
- **getRemoteAddr()**:获取客户端的IP地址。 - **getRemoteHost()**:获取客户端的主机名。 - **getSession()**:获取与当前请求关联的HttpSession对象。 - **getServerName()**:获取服务器的主机名。 - **...
2. **配置文件**:通过配置文件指定服务提供者和服务消费者的地址、端口等信息。 3. **启动服务**:服务提供者启动时,会向注册中心注册服务;服务消费者启动时,则会从注册中心获取服务列表并建立连接。 #### 五、...
客户端与服务器端之间的通信通常基于TCP/IP协议,使得进程间的交互变得透明,就像调用本地方法一样简单。 **RPC框架的主要组成部分:** 1. **客户端(Client)**:发起RPC调用的程序,它封装了远程方法的参数,并...
- 序列化是RPC框架中的重要环节,XXL-RPC支持Fastjson、Hessian、Java自带的序列化等多种序列化方式,选择合适的序列化方式可以影响性能和兼容性。 4. **线程池管理**: - 为了处理并发请求,XXL-RPC内部使用了...
在Java中,RPC框架如Hessian、Dubbo、gRPC等广泛应用于微服务架构中,以实现服务间的高效通信。本文将探讨在Java环境下,如何通过代理和反射来实现一个基础的RPC框架。 1. **代理模式**: 在RPC实现中,代理模式起...
学习这个简单的Java-RPC实现,你可以了解到RPC的基本原理,这对于理解和使用更复杂的RPC框架,如Dubbo、gRPC或Hessian等,是非常有帮助的。同时,它还能加深你对Java网络编程、多线程、并发控制以及对象序列化的理解...
在自定义RPC框架中,可以使用如Zookeeper、Eureka等服务注册与发现组件,确保客户端能动态找到服务提供者。服务提供者在启动时会将自己的地址注册到服务中心,而客户端则通过服务中心获取服务地址。 此外,负载均衡...
1. **地址**:服务提供者的网络地址,通常包含IP和主机名,如果未填写,系统会自动获取。 2. **端口**:服务监听的端口号,填-1表示系统自动选择。 3. **报文编码**:分为请求头和请求体,用于包装调用信息和参数。 ...
Java中常见的序列化库有Hessian、Protobuf、JSON等,这些库能将对象转换为字节流以便在网络上传输。 3. **服务注册与发现**:服务提供者需要将自己的服务注册到服务注册中心,服务消费者则通过服务注册中心查找并...
2. **请求封装**:客户端将调用信息(包括方法名、参数等)打包成特定格式的请求。 3. **请求发送**:客户端通过网络将请求发送给服务端。 4. **请求处理**:服务端接收到请求后,解码请求,找到对应的方法进行...
RPC(Remote Procedure Call)模式是一...天气服务是一个常见的应用场景,可能涉及多个城市天气信息的获取、查询和更新。通过分析这个项目,我们可以深入理解RPC如何在实际业务中工作,以及如何设计和优化分布式服务。
2. **网络连接(Network Connection)**:客户端和服务器之间的通信通常基于TCP/IP协议建立Socket连接。这种连接允许数据在网络中传输,是RPC的基础。 3. **服务端(Server)**:服务端提供了实际的服务实现,接收...
1. **请求构造**:客户端生成一个调用远程方法的请求,包括方法名、参数等信息。 2. **序列化**:请求被转换为网络可传输的格式,通常是字节流或XML、JSON等数据格式。 3. **网络传输**:序列化后的请求通过网络发送...
而数据传输通常采用Hessian或FastJson等序列化工具,将对象转换为字节流,以便在网络上传输。选择合适的序列化工具对性能和兼容性都有重要影响。 6. **负载均衡与容错策略** Dubbo支持多种负载均衡策略,如轮询、...
2. 容错与故障恢复:使用心跳检测、超时重试、幂等性设计等手段保证系统的高可用性。 3. 性能优化:通过缓存、异步处理、批量操作等方式提高分布式系统性能。 六、实战案例分析 本教程还将包含实际项目中的分布式...
4. **序列化/反序列化**:选择合适的序列化方式,如protobuf,JSON,Hessian等。 5. **负载均衡策略**:设计并实现负载均衡算法,如轮询、权重分配等。 6. **异常处理和重试机制**:确保在网络异常或服务失败时,...
5. **服务调用协议**:RPC框架通常有自己的服务调用协议,如Hessian、Thrift、gRPC等。这些协议定义了请求和响应的格式,以及如何进行序列化和反序列化。 6. **容错机制**:在分布式系统中,故障是常态。RPC框架...
1. **服务注册与发现**:BRAP框架使用中心化的服务注册表,服务提供者在启动时会将自己的服务注册到注册表,服务消费者通过查询注册表来获取服务提供者的地址信息,实现动态的服务发现。 2. **服务版本管理**:BRAP...