- 浏览: 320313 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Mr丶Chenn:
...
doFilter如何使用 -
Mr丶Chenn:
[url][url][url][url][/url][/url ...
doFilter如何使用 -
Mr丶Chenn:
...
doFilter如何使用 -
Mr丶Chenn:
引用引用引用引用引用
doFilter如何使用 -
honlin:
SafeUtil.getDateFormat().trim() ...
DateUtil
Spring HttpInvoke,一种较为常用的、基于Spring架构的服务器之间的远程调用实现,可以说是轻量级的RMI。
最初,我们使用Spring HttpInvoke同步配置数据,刷新多个服务器上的缓存,当然如果用分布式缓存是不是更好 !
使用Spring HttpInvoke,你可以调用远程接口,进行数据交互、业务逻辑操作等等。
废话不说了,上代码!
用户操作接口:
Java代码
- /**
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @since 1.0
- */
- public interface UserService {
- /**
- * 获得用户
- *
- * @param username
- * 用户名
- * @return
- */
- User getUser(String username);
- }
用户类,注意实现Serializable接口,这是执行远程调用传递数据对象的第一要求——数据对象必须实现Serializable接口,因为,要执行序列化/反序列化操作!
Java代码
- /**
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @since 1.0
- */
- public class User implements Serializable {
- private static final long serialVersionUID = 5590768569302443813L;
- private String username;
- private Date birthday;
- /**
- * @param username
- * @param birthday
- */
- public User(String username, Date birthday) {
- this.username = username;
- this.birthday = birthday;
- }
- // 省略
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return String.format("%s\t%s\t", username, birthday);
- }
- }
覆盖toString()方法,输出用户信息!
再看UserServiceImpl实现:
Java代码
- /**
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @since 1.0
- */
- public class UserServiceImpl implements UserService {
- private Logger logger = Logger.getLogger(UserServiceImpl.class);
- /*
- * (non-Javadoc)
- *
- * @see
- * org.zlex.spring.httpinvoke.service.UserService#getUser(java.lang.String)
- */
- @Override
- public User getUser(String username) {
- if (logger.isDebugEnabled()) {
- logger.debug("username:[" + username + "]");
- }
- User user = new User(username, new Date());
- if (logger.isDebugEnabled()) {
- logger.debug("user:[" + user + "]");
- }
- return user;
- }
- }
只把用户信息打出来即可说明调用效果!
看applicationContext.xml
Xml代码
- <bean
- id="userService"
- class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
- <property
- name="service">
- <bean
- class="org.zlex.spring.httpinvoke.service.impl.UserServiceImpl" />
- </property>
- <property
- name="serviceInterface"
- value="org.zlex.spring.httpinvoke.service.UserService" />
- </bean>
我们要把userService暴露出去,这样外部就可以通过http接口调用这个接口的实现了。
说说HttpInvokerServiceExporter,这个类用来在服务器端包装需要暴露的接口。
熟悉service,定义具体的实现类!
Xml代码
- <property
- name="service">
- <bean
- lass="org.zlex.spring.httpinvoke.service.impl.UserServiceImpl" />
- </property>
熟悉serviceInterface指向需要暴露的接口,注意使用value标注接口名称!
Xml代码
- <property
- name="serviceInterface"
- value="org.zlex.spring.httpinvoke.service.UserService" />
最后再看service-servlet.xml配置
Xml代码
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property
- name="urlMap">
- <map>
- <entry
- key="userTest"
- value-ref="userService" />
- </map>
- </property>
- </bean>
直接将请求指向刚才配置的userService
现在我们之间访问一下http://localhost:8080/spring/service/
这就说明,服务器端配置已经成功了!如果在日志中频繁得到这种异常,那很可能服务器被恶意访问了!
再看客户端实现:
Java代码
- /**
- * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
- * @since 1.0
- */
- public class UserServiceTest {
- private Logger logger = Logger.getLogger(UserServiceTest.class);
- private ApplicationContext context;
- private UserService userService;
- @Before
- public void initialize() {
- context = new ClassPathXmlApplicationContext("applicationContext.xml");
- userService = (UserService) context.getBean("userService");
- }
- @Test
- public void getUser() {
- User user = userService.getUser("zlex");
- if (logger.isDebugEnabled()) {
- logger.debug("user[" + user + "]");
- }
- }
- }
我们做了什么?Nothing!就跟调用一般Spring容器中的实现一样!
再看applicationContext.xml:
Xml代码
- <bean
- id="userService"
- class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
- <property
- name="serviceUrl"
- value="http://localhost:8080/spring/service/userTest" />
- <property
- name="serviceInterface"
- value="org.zlex.spring.httpinvoke.service.UserService" />
- </bean>
这里我们可以通过Spring容器调用userService,而实际上,他是一个HttpInvokerProxyFactoryBean,在这个配置里,定义了访问地址serviceUrl,和访问接口serviceInterface。
执行测试!
如果我们这样写,其实默认调用了SimpleHttpInvokerRequestExecutor做实现,这个实现恐怕只能作为演示来用!
这也是效率问题所在!!!
为提高效率,应该通过Commons-HttpClient!
我们需要做什么?导入这个jar,改改xml就行!
Xml代码
- <bean
- id="userService"
- class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
- <property
- name="serviceUrl"
- value="http://localhost:8080/spring/service" />
- <property
- name="serviceInterface"
- value="org.zlex.spring.httpinvoke.service.UserService" />
- <property
- name="httpInvokerRequestExecutor">
- <ref
- bean="httpInvokerRequestExecutor" />
- </property>
- </bean>
- <bean
- id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
- <property
- name="httpClient">
- <bean
- class="org.apache.commons.httpclient.HttpClient">
- <property
- name="connectionTimeout"
- value="2000" />
- <property
- name="timeout"
- value="5000" />
- </bean>
- </property>
- </bean>
通过HttpClient,我们可以配置超时时间timeout和连接超时connectionTimeout两个属性,这样,服务器执行操作时,如果超时就可以强行释放连接,这样可怜的tomcat不会因为HttpInvoke连接不释放而被累死!
回头看了一眼我N多年前的代码,万岁,我当时确实是这么实现的!好在没有犯低级错误!!!
执行操作!
这时,转为org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor实现了!
不过同事认为,这个效率还是不够高!!!
再改,改什么?还是xml!
Xml代码
- <bean
- id="httpInvokerRequestExecutor"
- class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
- <property
- name="httpClient">
- <bean
- class="org.apache.commons.httpclient.HttpClient">
- <property
- name="connectionTimeout"
- value="2000" />
- <property
- name="timeout"
- value="5000" />
- <property
- name="httpConnectionManager">
- <ref
- bean="multiThreadedHttpConnectionManager" />
- </property>
- </bean>
- </property>
- </bean>
- <bean
- id="multiThreadedHttpConnectionManager"
- class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
- <property
- name="params">
- <bean
- class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
- <property
- name="maxTotalConnections"
- value="600" />
- <property
- name="defaultMaxConnectionsPerHost"
- value="512" />
- </bean>
- </property>
- </bean>
改用MultiThreadedHttpConnectionManager,多线程!!!
测试就不说了,实践证明:
默认实现,服务器平均10s左右才能响应一个请求。
多线程实现,服务器平均20ms左右响应一个请求。
这简直不是一个数量级!!!
注意:在HttpClient的3.1版本中,已不支持如下配置,相应的方法已经废弃!
Xml代码
- <property
- name="connectionTimeout"
- value="2000" />
- <property
- name="timeout"
- value="5000" />
如果仔细看看文档,
引用
HttpClient that uses a default MultiThreadedHttpConnectionManager.
commons 系列的实现怎么会不考虑多线程呢?人家默认实现就是多线程的!同事多虑了!
当然,同事还补充了一句,需要控制连接数!
难怪,这里要设置
Xml代码
- <bean
- class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
- <property
- name="maxTotalConnections"
- value="600" />
- <property
- name="defaultMaxConnectionsPerHost"
- value="512" />
- </bean>
默认啥情况?
引用
maxConnectionsPerHost 每个主机的最大并行链接数,默认为2
public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2;
maxTotalConnections 客户端总并行链接最大数,默认为20
public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20;
public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2;
maxTotalConnections 客户端总并行链接最大数,默认为20
public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20;
--以下是艺术家补充
增加一个service-servlet.xm(对应urlMap)l,放在web-inf目录下
web.xml中配置
1 |
< servlet >
|
2 |
< servlet-name >service</ servlet-name >
|
3 |
< servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >
|
4 |
< load-on-startup >1</ load-on-startup >
|
5 |
</ servlet >
|
6 |
< servlet-mapping >
|
7 |
< servlet-name >service</ servlet-name >
|
8 |
< url-pattern >/service/*</ url-pattern >
|
9 |
</ servlet-mapping >
|
发表评论
文章已被作者锁定,不允许评论。
-
ApplicationContextAware接口用法
2011-12-31 09:43 1071加载Spring配置文件时,如果Spring配置文件中所定义的 ... -
WebApplicationContext : org.springframework.web.context.ContextLoaderListener作用
2011-10-11 10:54 861如果您想要在自己所定义的Servlet类别中使用Spring的 ... -
Spring框架下获取Bean的几种方式
2011-10-11 09:50 1051写道 通过xml配置文件 bean配置在xml里面,spri ... -
jdbcTemplate查询及返回值方法
2011-06-24 11:02 5036private RowMapper amnyMapper = ... -
Spring中的声明式事务的几种配置方式
2011-05-30 10:51 1131Spring中的声明式事务的 ... -
spring声明式事务管理
2011-05-26 14:31 895applicationContext.xml中配置 ... -
baseDao
2011-05-25 17:56 4642* Description: 支持hibernate,ibat ... -
TransactionProxyFactoryBean用继承简化配置
2011-05-23 15:04 2601Spring在TransactionDefinition接口中 ... -
在spring中管理多个job
2011-05-23 11:50 14851:spring配置文件 <bean id= ... -
spring中JdbcTemplate使用
2011-05-23 11:03 12321:建立dao public abstr ... -
spring的ContextLoaderListener
2011-05-19 11:27 246801:spring 参数配置 ContextLo ... -
MethodInvokingJobDetailFactoryBean的并发问题
2011-05-19 09:25 11589大家在使用quartz的时候,一般只设置了“targetObj ... -
spring定时任务
2011-04-27 15:55 1190Spring调度任务的运行时间可通过TriggerBean的属 ... -
spring中注入hibernate与ibatis结合使用
2011-04-27 14:58 36991: spring配置文件注入hibernate ... -
对spring与ibatis结合的补充
2011-04-27 13:33 966如果 sql-map-config.xml 是写在类中,需要从 ... -
spring与ibatis结合
2011-04-27 13:15 11491: dao 要继承 SqlMapClientDaoSu ... -
spring
2011-04-21 17:58 872<bean id="propertyConfi ...
相关推荐
采用了httpInvoke远程调用技术,为了简单只用了jsp->controller->dao分层。。其中的jsp controller 放在_web工程中,业务逻辑放在_svc中,分开下载,如果觉得没有,就可以不用下载另外一个工程了,持久层用mybatis,...
spirng远程调用可运行简单实例。包含所需所有jar spring-*-3.*.RELEASE.jar aopalliance.jar等。
主要介绍了spring cloud feign实现远程调用服务传输文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Spring远程调用使用http方式,将server和client直接部署后,进入http://localhost/HttpClientSpringRMIClient/即可
适合有spring框架的javaEE平台,出自spring的HttpInvokerServiceExporter导出器,依赖Spring.jar
使用 spring 的 httpinvoker 进行远程调用
spring RMI 远程接口调用 包含服务端客户端程序,可完整运行
dubbo zookee mybatis springboot java 增删改查demo 服务远程调用 服务组测 服务发现 dubbo zookee mybatis springboot java 增删改查demo 服务远程调用 服务组测 服务发现 dubbo zookee mybatis springboot java ...
struts2.3.4+spring3.2.0+hibernate4+hibernate_generic_dao struts hibernate spring最大化使用注释 基于spring的远程调用
给予spring的框架。 封装了xfire、rmi、hessian、httpinvoker 客户端可以统一调用,省略了远程调用的编码。 服务通过服务ID和服务接口来调用。
Spring 远程调用 -- C# 访问java WEB 服务,之前写的Demo,希望对大家有所帮帮助!
上文我们利用Spring rmi实现了Spring的远程访问(Spring 实现远程访问详解——rmi),本文主要讲解利用HttpInvoke实现远程访问。 Spring httpInvoker使用标准java序列化机制,通过Http暴露业务服务。如果你的参数和...
Spring Cloud OpenFeign 可以做到 让我们在使用 HTTP 请求远程服务时,就像调用本地方法一样。OpenFeign 和 Dubbo一样是一个RPC远程调用框架,...在调用远程接口时,会先根据@FeignClient中name属性指定的服务名来ch
三种方式实现java远程调用(rmi) 方式一:原始方式 方式二:spring 方式三:jndi 解压,放到myeclipse上可用
基于springboot的两个项目之间的远程调用,有问题请提出
Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,...
SpringCloud Alibaba Nacos集群+ Feign 实现远程调用案例
Spring集成Cxf调用WebServices
主要介绍了使用Spring Cloud Feign远程调用的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
实现Springcloud向dubbo项目的接口调用。 FeignToDubbo-starter模块负责利用Feign将底层的Http协议转化为dubbo协议,供SpringCloud项目使用。引入FeignToDubbo-starter后会引入dubbo的依赖,使用注解DubboRefence...