Grails中实现远程rpc
> Grails中会不可避免的遇到跨平台/域远程调用,远程rpc是最方便的选择 > > Grails的Remoting 插件 http://grails.org/plugin/remoting 是最好的选择了,它支持 RMI、Hessian, Burlap, HttpInvoker, XFire协议。
安装
grails install-plugin remoting
服务端实现
我们打算用hessian协议做示例。
- 定义rpc接口
在 Grails 工程的
src/java
目录下写好rpc接口,如,我们定一个接口
java:
public interface ISynchronizeService {
/**
* 获得分类
* @param 客户端版本
* @return
*/
Series getSeries(long client_version);
/**
* 获得元素
* @param 客户端版本
* @return
*/
Item getItems(long client_version);
}
这个接口提供了两个方法,分别获取不同的数据。
然后再在 src/java
目录下建好所涉及的POJO类。
Series.java
java:
/**
* POJO 分类
*/
public class Series implements Serializable {
private static final long serialVersionUID = -1666133446403499930L;
/**
* 分类名称
*/
private String name;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
public Series() { }
}
Item.java 略过,同Series.java
这些需要远程传输的POJO必须可以序列化,所以所涉及到的POJO必须实现Serializable接口。
- 实现rpc services 新建一个Grails services,名字可以随便取,但必须实现上面定义的接口:
java:
class SynchronizeService implements ISynchronizeService {
//暴露为hessian协议的webservice
static expose = ['hessian']
/**
* 同步分类
* @param 客户端版本
* @return
*/
@Override
public Series getSeries(long client_version) {
//从数据库查询
def sSeries = StoreSeries.findById(1)
//组装pojo
def series = new Series()
series.setName(sSeries.name)
return series;
}
/**
* 同步元素
* @param 客户端版本
* @return
*/
@Override
public Item getItems(long client_version) {
//从数据库查询
def sItem = StoreItem.findById(1)
//组装pojo
def item = new Item()
item.setName(sItem.name)
return item;
}
}
静态属性expose用来指定service所暴露的rpc协议,这里我们指定为hessian,当然也可以同时指定多个协议,expose是个List。
客户端实现
客户端只要支持hessiani协议,都可以进行远程调用我们上面的grails服务。 这里我们还是用grails来调用。
导入接口 可以将服务端的
src/java
目录下与rpc相关的java类全部拷贝过来,也可以在服务端生成这几个java类的jar包,然后再导入过来。总之,这些接口必须保证服务端与客户端是一样的(类名、方法相同)。设置远程rpc service 新建一个grails service,service名必须与服务端的grails service名一致:
java:
class SynchronizeService {
/**
* 远程调用参数
*/
static remote = [
protocol: 'hessian', //rpc协议
iface: ISynchronizeService, //接口class名
// 服务端的url地址为 http://localhost:8081/rpcserver
host: 'localhost', //远端地址
port: '8081', //远端端口
webcontext: 'rpcserver' //webapp的context名称,即url中的名称
]
}
这个service只要包含这些东西就行了,其中重要的是设置好protocol
,还有host
与webcontext
这些值。iface
是接口的类名,要包含报名,如 foo.bar.ISynchronizeService,类加载器必须能找到的。这个service会在grails启动时自动注入接口相关的代码。
- 访问远程服务 新建一个controller,并写一个action:
atcion
java:
def testRpc() {
def series = SynchronizeService.syncSeries(1L)
render series.getName()
}
注意到了没,接口的方法会被自动注入进service当中,插件会根据协议来在接口中实现相应的代码。很省事。
当然,客户端可以是任何支持remoting中支持协议的语言、平台。如android、ios。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述