/ucorf

An universal coroutine rpc framework implemented with c++11.

Primary LanguageC++

Ucorf概述

使用C++11编写的通用协程RPC框架,尤其适合做微服务架构的服务底层框架。 在服务发现、通信协议包头、通信协议包体、底层通信通道、负载均衡算法等维度上均可扩展。 ####服务发现: 默认支持IP直连和Zookeeper服务发现 ####通信协议: 默认使用protobuf,提供protoc插件,自动生成相关代码 ####底层通信通道: 默认支持tcp、udp协议 ####负载均衡: 默认提供robin、一致性hash两种算法

Linux上编译与安装

ucorf使用CMake作为构建工具, 在git代码库中执行以下命令:

$ git submodule update --init
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
$ sudo make install

至此, 安装完成. 如果要编译debug模式的库,将

$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE

命令换成

$ cmake ..

安装依赖的库

DEBIAN系Linux:

$ sudo apt-get install libzookeeper-mt-dev -y
$ sudo apt-get install libprotobuf-dev -y
$ sudo apt-get install python-protobuf -y
$ sudo apt-get install protobuf-compiler -y
$ sudo apt-get install libboost-all-dev -y

基础用法

一.URL

ucorf使用url来表示地址信息, 格式如下:

<protocol>://<ip>:<port>

例如:

tcp://127.0.0.1:8080
udp://127.0.0.1:8081

目前仅支持tcp和udp两种协议。

二.协程

ucorf是基于协程框架实现的,关于协程的好处及相关知识参见: https://github.com/yyzybb537/cpp_features

三.协议定义与代码生成

ucorf默认使用protobuf作为通信协议.(如果不满足需求, 请自行扩展)

protobuf的IDL语法在此不再赘述, 一个简单例子在test/echo.proto中。

生成代码命令如下:

    $ protoc --cpp_out=. echo.proto
    $ protoc --rpc_out=. echo.proto

第一行命令是protobuf自带的生成CPP代码的命令,会生成echo.pb.h和echo.pb.cc两个文件。

第二行命令是使用ucorf扩展插件的命令,会生成echo.rpc.h和echo.rpc.cc两个文件。

使用时只需#include "echo.rpc.h"即可,ucorf中自带的测试代码均依赖echo.proto生成的代码。

四.示例

一个简单的server:

#include <ucorf/ucorf.h>
#include "echo.rpc.h"
#include <iostream>
using namespace Echo;

// 1.继承代码生成器生成的类,并重写定义的rpc接口
struct MyEcho : public ::Echo::UcorfEchoService
{
  virtual bool Echo(EchoRequest & request, EchoResponse & response)
  {
      // 处理请求
      response.set_code(request.code());
      return true;
  }
};

int main()
{
  // 2.创建server对象
  ucorf::Server server;

  // 3.注册MyEcho服务
  server.RegisterService(boost::shared_ptr<IService>(new MyEcho));

  // 4.启动监听端口
  ucorf::boost_ec ec = server.Listen("tcp://127.0.0.1:8080");     // 监听本机8080端口

  // 5.启动协程框架主循环
  co_sched.RunLoop();     

  return 0;
}

一个简单的client:

#include <ucorf/ucorf.h>
#include "echo.rpc.h"
#include <iostream>
using namespace Echo;

int main(int argc, char **argv)
{
  // 1.创建Client对象
  ucorf::Client client;

  // 2.设置服务端地址
  client.SetUrl("tcp://127.0.0.1:8080");

  // 3.创建Stub对象,并绑定Client
  UcorfEchoServiceStub stub(&client);

  // 4.启动一个协程
  go [&]{
      // 5.构造RPC调用参数
      EchoRequest request;
      request.set_code(1);

      // 6.调用RPC接口
      std::shared_ptr<EchoResponse> rsp = stub.Echo(request);

      // 7.获取返回值
      std::cout << "Response: " << rsp->code() << endl;
  };

  // 8.启动协程框架主循环
  co_sched.RunLoop();
  return 0;
}

高级用法

ucorf的高级用法请参见samples目录下的一些示例.