hessian 和 spring结合,url动态替换

Recall 发布于 2014/06/22 15:16
阅读 5K+
收藏 1

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

Hessian做远程服务,大家都知道的。 如何跟spring结合,网上有很多例子,这里就不写,主要是写一下,我遇到的一个问题,不知道大家解决的办法。

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<!-- 客户端Hessian代理工厂Bean -->
	<bean id="clientSpring" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<!-- 请求代理Servlet路径 -->		
		<property name="serviceUrl">
<value>http://localhost:8080/HessianSpring/remote/helloSpring</value>
		</property>
		<!-- 接口定义 -->
		<property name="serviceInterface">
			<value>com.wtang.isay.Isay</value>
		</property>
	</bean>
</beans>



大家看上课,使用spring Hessian的代理工厂,创建一个 单例的对象,大家看属性,serviceUrl属性值是写死的。

也就是说,客户端(也就是消费者),获取服务的地址已经写死了,那么服务端做集群的时候,多个url,

比如:

http://localhost:8080/HessianSpring/remote/helloSpring

http://localhost:8081/HessianSpring/remote/helloSpring
这样的话,集群就无法做了。 大家是怎么解决这个问题的?



加载中
1
子达
子达

以上都是思路,我说说具体实现中的一种方法:

重写HessianClientInterceptor和HessianProxyFactoryBean,用map缓存每个url对应的HessianProxy, 调用的时候动态去拿服务地址,如果map中有HessianProxy就直接用,否则就创建一个再用。

子达
子达
回复 @wongloong : 我的实现和上面描述的思路差不多
wongloong
wongloong
这块你做过么?请问现在有实现么?
0
大萌王朝首席槽点师
大萌王朝首席槽点师

这个可以用域名的方式做智能dns。你把example.com域名解析到你两个主机上host1,host2。 你在客户端访问的时候,dns可以帮你智能的解析到各个host上。

以上

0
Recall
Recall

引用来自“兮风古道”的评论

这个可以用域名的方式做智能dns。你把example.com域名解析到你两个主机上host1,host2。 你在客户端访问的时候,dns可以帮你智能的解析到各个host上。

以上

谢谢回答。

这个方案我们做过,是可以用软负载,负载均衡到不同的服务器上,但这种方式毕竟存在缺陷,注册中心扩展不好做, 还有其它方案吗?

0
温佐镜
温佐镜
能否做个扩展实现服务发现,自动路由呢?或者使用其他服务框架,如dubbo、hsf,这些都支持注册中心
0
Recall
Recall

引用来自“温佐镜”的评论

能否做个扩展实现服务发现,自动路由呢?或者使用其他服务框架,如dubbo、hsf,这些都支持注册中心

谢谢你的回答。

我也想过这个问题,spring的远程,接口都是两个属性serviceUrl 和 serviceInterface ,接口地址和接口,在客户端启动的时候呢,就创建spring hessian的代理类。 在访问的时候,会从里面拿出地址进行访问后,返回结果。不是hessian的原因,是spring的扩展类的原因。 rmi集成spring也是如此。

我想过使用两种方法

1.不管是那种RPC技术,本身创建一个代理类,而创建一个代理类,需要基本的属性就是接口地址和接口,每次寻址之后再进行创建一个代理类,然后进行访问,但是每次都创建一个类,不可取。

2.在hessian访问的时候,动态获取地址后,使用地址进行连接服务端进行访问。

只是不知道,大家有没有这方面的经验。

0
温佐镜
温佐镜

引用来自“温佐镜”的评论

能否做个扩展实现服务发现,自动路由呢?或者使用其他服务框架,如dubbo、hsf,这些都支持注册中心

引用来自“Recall”的评论

谢谢你的回答。

我也想过这个问题,spring的远程,接口都是两个属性serviceUrl 和 serviceInterface ,接口地址和接口,在客户端启动的时候呢,就创建spring hessian的代理类。 在访问的时候,会从里面拿出地址进行访问后,返回结果。不是hessian的原因,是spring的扩展类的原因。 rmi集成spring也是如此。

我想过使用两种方法

1.不管是那种RPC技术,本身创建一个代理类,而创建一个代理类,需要基本的属性就是接口地址和接口,每次寻址之后再进行创建一个代理类,然后进行访问,但是每次都创建一个类,不可取。

2.在hessian访问的时候,动态获取地址后,使用地址进行连接服务端进行访问。

只是不知道,大家有没有这方面的经验。

每次寻址之后再进行创建一个代理类 ? 就一个代理类就可以啦,代理类负责从注册中心服务地址,拿到地址就可发起rpc请求到服务端啦
0
Recall
Recall

引用来自“温佐镜”的评论

能否做个扩展实现服务发现,自动路由呢?或者使用其他服务框架,如dubbo、hsf,这些都支持注册中心

引用来自“Recall”的评论

谢谢你的回答。

我也想过这个问题,spring的远程,接口都是两个属性serviceUrl 和 serviceInterface ,接口地址和接口,在客户端启动的时候呢,就创建spring hessian的代理类。 在访问的时候,会从里面拿出地址进行访问后,返回结果。不是hessian的原因,是spring的扩展类的原因。 rmi集成spring也是如此。

我想过使用两种方法

1.不管是那种RPC技术,本身创建一个代理类,而创建一个代理类,需要基本的属性就是接口地址和接口,每次寻址之后再进行创建一个代理类,然后进行访问,但是每次都创建一个类,不可取。

2.在hessian访问的时候,动态获取地址后,使用地址进行连接服务端进行访问。

只是不知道,大家有没有这方面的经验。

引用来自“温佐镜”的评论

每次寻址之后再进行创建一个代理类 ? 就一个代理类就可以啦,代理类负责从注册中心服务地址,拿到地址就可发起rpc请求到服务端啦

说的不错,创建一个代理类就可以了。 而要代理的服务调用方法,需要改变一下,从注册中心拿地址然后rpc请求。 

只是要跟spring结合,需要重写类的几个方法,只是我看hessian的 没有找到,url的地址,很是郁闷呐。

0
温佐镜
温佐镜

我没看过这部分的源码,大概也有个思路

扩展两个类

org.springframework.remoting.caucho.HessianServiceExporter  初始化完后把自己的服务向注册中心注册
org.springframework.remoting.caucho.HessianProxyFactoryBean  把静态的地址改成向向注册中心获取

不需要改动hessian,hessian只是底层的rpc实现,spring应该也是在上层封装而已


0
Li_Js
Li_Js
HessianProxyFactoryBean类的setServiceUrl方法
0
看-野生程序猿
看-野生程序猿
将多个服务注册到zookeeper下 . 存储节点为node1 , node2 , 分别对应 service1的服务 和 service2的服务 . 容器中添加计数器 , 对服务及节点的访问进行计数  . 这样既能实现服务集群 . 也能实现负载均衡 . dubbo的思路 
返回顶部
顶部