针对spring(boot)环境hessian远程调用,采用注解模式
版本hessian-4.0.63;springBoot2.2.0
1、项目结构
因为客户端要使用服务端的接口,包括参数和返回值,所以用maven多module结构,把接口、参数和返回值放到一个module中,我们一般命名xx-rpc-common;package命名规则:
com.bm.xx(项目).xx(模块).rpc.service;
com.bm.xx(项目).xx(模块).rpc.dt
对应服务
com.bm.xx(项目).xx(模块).rpc.service.impl
2、服务端
2.1、实现接口
@HessianService(path="xx/xx",description="xx")
//path是服务对外暴露的路径,建议用模块名+类名,这样容易区分。
public class HelloServiceImpl implements IHelloService {
2.2、暴露服务---已经用注解自动处理了
写一个Bean,com.bm.xx(项目).rpc.exporter
XX(模块)ServiceExporter
@Resource
@Qualifier(value="helloService")
private IHelloService helloService;
@Bean(name = "/helloService")---是对外暴露的url
public HessianServiceExporter helloService() {
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(helloService);
exporter.setServiceInterface(IHelloService.class);
return exporter;
}
这种做法有点傻。
通过注解自动暴露就显得比较优雅了。等下,昨天被一个自动扫描弄疯了。--终于ok了。
3、客户端
注册客户端,当然也可以每次实例化,建议写一个统一的clients。这个考虑和服务端一样处理,但是感觉意义不大。至少没有发现捷径,网上的方案有一个,但是不认同。
com.bm.xx(项目).rpc.proxy
XX(模块ServiceProxyBean
@Bean
public HessianProxyFactoryBean helloService() {
@Value("turbo.rpc.url")
//turbo是我们自己定义的属性;url后要有/
String url ;
HessianProxyFactoryBean factory = new HessianProxyFactoryBean();
factory.setServiceUrl(url+"helloService");
factory.setServiceInterface(IHelloService.class);
return factory;
}
helloService就是我们要用的客户端端引用,然后调用接口的方法就可以。例如
public String sayHello(String name){
return helloService.sayHello(name);
}
网友评论