最近跟朋友聊天,聊到他们现在项目的架构都是把数据层跟应用层分离开来,中间可以加memcached等的缓存系统,感觉挺好的,很大程度上的降低耦合,然后还明确分配了数据层跟应用层任务。也方便定位、找到问题。(我们都用最简单的架构,就没搞过分布式部署,小公司没办法o(︶︿︶)o),就找时间学习了,说不定以后就好应用上。这里用了 HTTP invoker方式,别的rmi或者jms等也大同小异。

这里我使用的是spring3.2.2,jar包就不列了,少哪个加哪个就可以了。

spring官方文档一共提供三种方式:通过Spring Web MVC,通过一个servlet指向跟不依赖web容器使用Sun's Java 6构建。我这里用的是第二种方式,别的官方文档讲解还是很清晰的,根据那个操作即可。

首先server端:

Model

model是需要序列化的才能remote传输

  1. public class ServiceReso implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. private String id;
  4. private String serviceName;
  5. private String serviceAddress;
  6.  
  7. public ServiceReso() {
  8. super();
  9. }
  10.  
  11. public ServiceReso(String id, String serviceName, String serviceAddress) {
  12. super();
  13. this.id = id;
  14. this.serviceName = serviceName;
  15. this.serviceAddress = serviceAddress;
  16. }
  17.  
  18. public final String getId() {
  19. return id;
  20. }
  21.  
  22. public final void setId(String id) {
  23. this.id = id;
  24. }
  25.  
  26. public final String getServiceName() {
  27. return serviceName;
  28. }
  29.  
  30. public final void setServiceName(String serviceName) {
  31. this.serviceName = serviceName;
  32. }
  33.  
  34. public final String getServiceAddress() {
  35. return serviceAddress;
  36. }
  37.  
  38. public final void setServiceAddress(String serviceAddress) {
  39. this.serviceAddress = serviceAddress;
  40. }
  41.  
  42. @Override
  43. public String toString() {
  44. return "{\"id\":\"" + this.id + "\",\"serviceName\":\""
  45. + this.serviceName + "\",\"serviceAddress\":\""
  46. + this.serviceAddress + "\"}";
  47. }
  48. }

Dao

  1. public interface ServiceResoDao {
  2. /**
  3. * 根据传入的id值返回ServiceReso对象
  4. *
  5. * @param id
  6. * 需要查询的ServiceReso对象id
  7. * @return ServiceReso
  8. */
  9. public ServiceReso find(String id);
  10. }

DaoImp

jdbc没有做持久化,采用了spring自带的JdbcTemplate,感觉还是挺好用的。

  1. @Repository("serviceResoDao")
  2. public class ServiceResoDaoImp implements ServiceResoDao {
  3. @Autowired
  4. private JdbcTemplate jdbcTemplate;
  5.  
  6. public ServiceReso find(String id) {
  7. String sql = "select SERVERID,REALSERVERNAME,DSIPADDR from COSH_SERVICE_REGISTER where SERVERID=?";
  8. ServiceReso serviceReso = jdbcTemplate.queryForObject(sql,
  9. new Object[] { id }, new RowMapper<ServiceReso>() {
  10. public ServiceReso mapRow(ResultSet rs, int rowNum)
  11. throws SQLException {
  12. ServiceReso serviceReso = new ServiceReso(rs
  13. .getString("SERVERID"), rs
  14. .getString("REALSERVERNAME"), rs
  15. .getString("DSIPADDR"));
  16. return serviceReso;
  17. }
  18. });
  19. return serviceReso;
  20. }
  21. }

beans.xml:

这里的urlMapping是用来分发不同的请求,免得在servlet中对应每个bean。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  9. ">
  10. <context:component-scan base-package="com.blackbread" />
  11. <bean
  12. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  13. <property name="locations">
  14. <value>classpath:jdbc.properties</value>
  15. </property>
  16. </bean>
  17. <bean id="springDSN"
  18. class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  19. <property name="driverClassName"
  20. value="${jdbc.driverClassName}">
  21. </property>
  22. <property name="url" value="${jdbc.url}"></property>
  23. <property name="username" value="${jdbc.username}"></property>
  24. <property name="password" value="${jdbc.password}"></property>
  25. </bean>
  26. <bean id="jdbcTemplate"
  27. class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"
  28. lazy-init="false" autowire="default">
  29. <property name="dataSource">
  30. <ref bean="springDSN" />
  31. </property>
  32. </bean>
  33. <bean name="serviceResoDaoRemoting"
  34. class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
  35. <property name="service" ref="serviceResoDao" />
  36. <property name="serviceInterface"
  37. value="com.blackbread.dao.ServiceResoDao" />
  38. </bean>
  39. <bean name="urlMapping"
  40. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  41. <property name="mappings">
  42. <props>
  43. <prop key="/serviceResoDaoRemoting">
  44. serviceResoDaoRemoting
  45. </prop>
  46. </props>
  47. </property>
  48. </bean>
  49. </beans>

web.xml

这里有个问题:servlet-mapping中的url-pattern如果不是这样写,而是改成/remoting/*之类的就会请求不到资源,望知道的兄弟告知下,不胜感激。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <servlet>
  7. <servlet-name>dispatcherServlet</servlet-name>
  8. <servlet-class>
  9. org.springframework.web.servlet.DispatcherServlet
  10. </servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath*:beans.xml</param-value>
  14. </init-param>
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>dispatcherServlet</servlet-name>
  19. <url-pattern>/*</url-pattern>
  20. </servlet-mapping>
  21. </web-app>

 client端:

client需要将server端的接口类跟实体类打包成jar,加以引用。

service

  1. public interface ServiceResoService {
  2. void getServiceReso(String id);
  3. }

serviceImp

  1. @Controller("serviceResoService")
  2. public class ServiceResoServiceImp implements ServiceResoService {
  3. @Resource(name = "serviceResoDaoReomting")
  4. ServiceResoDao serviceResoDao;
  5.  
  6. public void getServiceReso(String id) {
  7. ServiceReso serviceReso;
  8. try {
  9. serviceReso = serviceResoDao.find(id);
  10. System.out.println(serviceReso.toString());
  11. } catch (RuntimeException e) {
  12. System.out.println("未找到结果!");
  13. }
  14.  
  15. }
  16.  
  17. }

beans.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  9. ">
  10. <context:component-scan base-package="com.blackbread" />
  11. <bean id="serviceResoDaoReomting"
  12. class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
  13. <property name="serviceUrl"
  14. value="http://localhost:8080/HttpInvokerDAO/serviceResoDaoRemoting" />
  15. <property name="serviceInterface"
  16. value="com.blackbread.dao.ServiceResoDao" />
  17. </bean>
  18. </beans>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>index.jsp</welcome-file>
  8. </welcome-file-list>
  9. <listener>
  10. <listener-class>
  11. org.springframework.web.context.ContextLoaderListener
  12. </listener-class>
  13. </listener>
  14. <!-- 设置Spring容器加载配置文件路径 -->
  15. <context-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <param-value>classpath*:beans.xml</param-value>
  18. </context-param>
  19. </web-app>

spring3.2.2 remoting HTTP invoker 实现方式的更多相关文章

  1. 【Spring3.0系列】---Bean不同配置方式比较 和适用场合

    Bean不同配置方式比较1.基于XML配置定义:在XML文件中通过<bean>元素定义Bean,例如<bean class="com.bbt.UserDao"/& ...

  2. Spring3.0 入门进阶(三):基于XML方式的AOP使用

    AOP是一个比较通用的概念,主要关注的内容用一句话来说就是"如何使用一个对象代理另外一个对象",不同的框架会有不同的实现,Aspectj 是在编译期就绑定了代理对象与被代理对象的关 ...

  3. Spring Remoting: HTTP Invoker--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-http-invoker.jsp Concept Overview ...

  4. 一步一步学Remoting系列文章

    转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...

  5. 【Spring】web开发 javaConfig方式 图解

    spring3.2之后开始支持java配置方式开发web项目,不使用web.xml,但需要在servlet3.0环境,一般tomcat7会支持,6不行 下图中:MyAppInitializer和Spr ...

  6. Microsoft .Net Remoting系列专题之二

    Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

  7. .NET高级代码审计(第五课) .NET Remoting反序列化漏洞

    0x00 前言 最近几天国外安全研究员Soroush Dalili (@irsdl)公布了.NET Remoting应用程序可能存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerF ...

  8. 【转】Microsoft .Net Remoting之Marshal、Disconnect与生命周期以及跟踪服务

    Marshal.Disconnect与生命周期以及跟踪服务 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...

  9. Remoting在多IP多网卡内外网环境下的问题

    Remoting服务器端如果服务器有多块网卡,多个IP地址的情况下会出现客户端callback失败的问题,debug以后发现客户端会callback到服务器端另外一个IP地址(例如外网地址,而不是内网 ...

随机推荐

  1. go 实现用户特权判断的例子

    需求:实现用户特权,可以满足下面1个或多个条件 红名 达人 vip会员 vip超级会员 蓝钻用户 红钻用户 1.实现方法一:可以根据数据库字段,每个特权用一个字段,进行判断缺点:每增加一个特权,要进行 ...

  2. Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现!

    Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现! 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集群启动顺序 1>. ...

  3. JAVA核心技术I---JAVA基础知识(数据类型)

    一:基本类型 –boolean 布尔 –byte 字节 –short/int/long 短整数/整数/长整数 –float/double 浮点数 –char 字符 (一)boolean 只有true, ...

  4. entityManager分页

    十分操蛋. 需要两步. 第一步,查询一共需要多少条. 第二步   分页得到数据 Query query = this.entityManager.createNativeQuery(sb2.toStr ...

  5. canvas绘图history妙用

    function palette(canvas,ctx){ //初始化画布内部元素默认样式 this.strokeColor = 'red'; //默认选中红色触发颜色 this.fillColor ...

  6. HDU 1034(传递糖果 模拟)

    题意是一群孩子围成一个圈,每个人把手中的糖果分一半给右边的人,若分过之后手中的糖果数是奇数,则由老师提供一颗糖果给他,问这样传递多少圈所有人的糖果数都能相等,最终每人手里的糖果数是多少. 由于题中已经 ...

  7. asp.net mvc cshtml (VIEWS)中怎么提供URL参数:

    其实,没有必要,只要在view中这样获取就可以: <%=Html.ViewContext.RouteData.Values["id"]%> 就算没有id的参数也不会报错 ...

  8. 启用SQL Server 2014 中的OLE 自动化功能

    企业中很多架构都在快走向Service概念,尽量采用平台服务方式提供给各个Application使用.因此,个系统都会去呼叫像是Web Service,WCF或ODATA…等等各种类型的服务.一般来说 ...

  9. MySQL忘记root密码的解决办法

    # 1.停掉MySQL进程 [root@standby ~]# /etc/init.d/mysqld stop Shutting down MySQL... SUCCESS! [root@standb ...

  10. 对空间数据(Shape)重新排序

    打开ArcToolBox,数据管理工具->常规(General)->排序