Skip to content
/ xrpc Public

xrpc is a concise and lightweight RPC framework based on message queues

License

Notifications You must be signed in to change notification settings

yc90s/xrpc

Repository files navigation

XRPC

English | 中文

License

XRPC是一个基于消息队列的简洁, 轻量的RPC框架

Overview

XRPC设计的原则是为了实现一套基于消息队列的、易于拓展和易于使用的轻量级RPC框架.

它的核心非常精简, 并且提供了消息队列的接口、序列化的接口, 使其可以非常方便地定制化拓展.

Features

  • 使用消息队列作为RPC的通道
  • 支持任意参数数量的远程调用
  • 支持CallCast两种远程调用方式, Cast适用于不需要获取返回值的情况
  • 代码生成, 实现了一套IDL, 最大程度贴近go语法, 用来定义rpc服务的接口信息, 并自动生成相关代码
  • 容易使用, 核心代码非常精简
  • 易拓展, 可以非常容易地支持各种消息队列和各种序列化方式

Getting Started

安装消息队列

安装并启动nats, 参考安装Nats

安装代码生成工具

go install github.com/yc90s/xrpc/cmd/xrpc@latest

安装成功后执行xrpc -version可以看到具体版本号输出

定义服务接口

进入自己的项目目录, 然后编写下面的服务接口文件hello.service, 它定义了HelloService服务, 包含一个Hello方法

package main 

service HelloService {
    Hello(string) (string, error)
}

运行如下命令后, xrpc将根据hello.service文件内容在当前目录生成hello.service.go文件, 里面存放了rpc接口信息

xrpc hello.service

实现代码

接下来实现上面定义的HelloService服务接口, 并通过RPC调用Hello方法

package main

import (
	"fmt"

	"github.com/yc90s/xrpc"
	natsmq "github.com/yc90s/xrpc/mq/nats"

	"github.com/nats-io/nats.go"
)

type HelloRPCService struct {
	*xrpc.RPCServer
}

func newHelloService(nc *nats.Conn) *HelloRPCService {
	s := &HelloRPCService{
		RPCServer: xrpc.NewRPCServer(
			xrpc.SetMQ(natsmq.NewMQueen(nc)),
			xrpc.SetSubj("hello_server"),
		),
	}
	RegisterHelloServiceServer(s.RPCServer, s)
	return s
}

func (s *HelloRPCService) Hello(request string) (string, error) {
	reply := "hello:" + request
	return reply, nil
}

func newHelloRPCServiceClient(nc *nats.Conn) *HelloServiceClient {
	return NewHelloServiceClient(xrpc.NewRPCClient(
		xrpc.SetMQ(natsmq.NewMQueen(nc)),
		xrpc.SetSubj("hello_client"),
	))
}

func main() {
	nc, err := nats.Connect("nats://127.0.0.1:4222", nats.MaxReconnects(1000))
	if err != nil {
		panic(err)
	}
	defer nc.Close()

	s := newHelloService(nc)
	err = s.Start()
	if err != nil {
		panic(err)
	}
	defer s.Stop()

	c := newHelloRPCServiceClient(nc)
	defer c.Close()

	reply, err := c.Hello("hello_server", "yc90s")
	if err != nil {
		panic(err)
	}
	fmt.Println(reply)
}
  • HelloRPCService 实现了我们定义的RPC接口, 它有一个Hello方法
  • newHelloService 函数用来创建并注册RPC服务, 采用nats消息队列, 指定订阅hello_server主题
  • newHelloRPCServiceClient 函数创建RPC客户端
  • main函数里面, 首先通过Start启动RPC服务, 然后RPC调用Hello方法, 最后输出结果hello:yc90s

更多的例子可以参考examples

License

XRPC is Apache 2.0 licensed.

社区

技术交流群: 384132929

About

xrpc is a concise and lightweight RPC framework based on message queues

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages