设为首页 收藏本站
查看: 1148|回复: 0

[经验分享] golang与java间的json-rpc跨语言调用

[复制链接]

尚未签到

发表于 2018-9-20 10:13:16 | 显示全部楼层 |阅读模式
  关于如何使用golang进行json-rpc的调用,网上虽然有很多的帖子,但都仅仅是golang程序间通信,没有牵涉到跨语言调用的问题。在使用golang开发服务端程序的时候,不可避免的要与其他语言的程序进行交互,特别是json-rpc这的协议,本身就应该是用在不同的平台间的调用上的(因为golang程序间的交流已经有了封闭的用gob编码解码的rpc包了,我们自然而言的会想到用json-rpc来提供对其他语言的支持)。本文就来详细探究一下如何实现golang与java之间的json-rpc调用。转载请注明出处:http://www.cnblogs.com/geomantic/p/4751859.html


  • 首先,实现一个基于socket的java调用golang的样例(这个方法不需要第三方golang库,因为golang本身就有jsonrpc的支持库,但是仅能通过tcp协议通信,并且有一些格式上的局限,直接与其他的语言交互会有些障碍。如果要通过http协议通信的话,必须自己写一个或者用第三方的库,后面会有介绍)
  

package rpcz  

  

// first we create a simple golang rpc server based on socket  
import (
  
"fmt"
  
"net"
  
"net/rpc"
  
"net/rpc/jsonrpc"
  
)
  

  
type Counter struct {
  
Sum int
  
}
  

  
func (this *Counter) Add(i int, r *int) error {
  
this.Sum += i
  
*r = this.Sum
  
fmt.Printf("i: %v", i)
  
return nil
  
}
  

  
func NewJsonRpcSocketServer() {
  

  
rpc.Register(new(Counter))
  

  
l, err := net.Listen("tcp", ":3333")
  
if err != nil {
  
fmt.Printf("Listener tcp err: %s", err)
  
return
  
}
  

  
for {
  
fmt.Println("wating...")
  
conn, err := l.Accept()
  
if err != nil {
  
fmt.Sprintf("accept connection err: %s\n", conn)
  
}
  
go jsonrpc.ServeConn(conn)
  
}
  

  
}
  

  
func NewJsonRpcSocketClient() {
  
conn, err := net.DialTimeout("tcp", "127.0.0.1:3333", 1000*1000*1000*30)
  
if err != nil {
  
fmt.Printf("create client err:%s\n", err)
  
return
  
}
  
defer conn.Close()
  

  
client := jsonrpc.NewClient(conn)
  
var reply int
  
err = client.Call("Counter.Add", 10, &reply)
  

  
fmt.Printf("reply: %s, err: %s\n", reply, err)
  

  
}
  

  上面的NewJsonRpcSocketServer()方法创建了一个基于tcp协议的json-rpc服务器,NewJsonRpcSocketClient()方法示范了golang端的简单调用(注意是基于tcp,而不是http协议!稍后会给出调用"github.com/gorilla/rpc/json"实现的基于http协议的调用方法)。但这不是重点,下面看一下Java客户端的调用,可以看出来,这也是一个基于socket的通信:
  

package cn;  

  

import com.googlecode.jsonrpc4j.JsonRpcClient;  

  

import java.io.IOException;  

import java.io.InputStream;  

import java.io.OutputStream;  

import java.net.*;  

  

/**  
* Created by geomantic on 15/8/21.
  

*/
  
public>  

  
public static void main(String[] args) {
  
try {
  
Socket socket = new Socket("127.0.0.1", 3333);
  
JsonRpcClient client = new JsonRpcClient();
  

  
InputStream ips = socket.getInputStream();
  
OutputStream ops = socket.getOutputStream();
  

  
int reply = client.invokeAndReadResponse("Counter.Add", new Object[]{1001}, int.class, ops, ips);
  

  
System.out.println("reply: " + reply);
  
} catch (IOException e) {
  
e.printStackTrace();
  
} catch (Throwable throwable) {
  
throwable.printStackTrace();
  
}
  

  
}
  
}
  

  上面的java代码初步示范了如何异步调用golang服务端的两个很重要的约束:
  1.  golang服务端的方法名注册和调用保持一致,格式为: 结构体名.方法名, 如上面的Counter.Add。
  2. 能够注册的方法必须满足指定的函数签名:
  func (t *T) MethodName(argType T1, replyType *T2) error 。
  入参有且只有两个,第一个是被调用函数的输入参数,第二个是被调用函数的输出参数。 返回值只有一个error类型。这三个参数一个都不能变。
  但是基于tcp的调用,对于用惯了http协议的人会感觉写起来很蛋疼,可能更多的人还是习惯用http来解析。但是由于解决的方法有比较琐碎的细节处理,而且牵涉到一些第三方库的代码修改,考虑到篇幅问题准备另起一篇,在下一篇中示范一下用http协议通信实现的rpc实现。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598714-1-1.html 上篇帖子: Golang几个常用记录日志对比 下篇帖子: golang中使用消息名称创建protobuf消息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表