V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tanszhe
V2EX  ›  PHP

你真的了解 RPC 吗?

  •  
  •   tanszhe · 2018-12-24 11:04:35 +08:00 · 4003 次点击
    这是一个创建于 2166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现微服务盛行,服务之间通信大概就两种方式ApiRpc。 下面两个列子来让你了解ApiRpc的区别。

    列子一 文章的增删改查。

    Api 实现:

    
    Router::get('/article/{id}','ArticleController@get');
    Router::post('/article','ArticleController@create');
    Router::put('/article/{id}','ArticleController@edit');
    Router::delete('/article/{id}','ArticleController@delete');
    
    
    
    

    然后在控制器Article调用模型

    
    return Article::find($id)->toArray();
    
    

    Rpc 实现

    
    RpcServer::add('Article');
    
    

    没错就一行代码

    列子二 计算器

    假如机器 A 上面一个计算器 Counter,以 Rpc 的方式提供给其他机器使用.

    计算器Counter代码

    
    class Counter
    {
    
        private $i = 0;
    
        public function __construct($i = 0)
        {
            $this->i = $i;
        }
    
        // 加法
        public function add($v)
        {
            $this->i += $v;
            return $this;
        }
    
        // 减法
        public function sub($v)
        {
            $this->i -= $v;
            return $this;
        }
    
        // 乘法
        public function mul($v)
        {
            $this->i *= $v;
            return $this;
        }
    
        // 除法
        public function div($v)
        {
            $this->i /= $v;
            return $this;
        }
    
        // 获取结果
        public function get()
        {
            return $this->i;
        }
    }
    
    

    Rpc 实现

    
    RpcServer::add('Counter');
    
    

    Rpc 客户端调用

    
    $c = new ClientCounter(10);
    echo $c->add(3)->mul(2)->sub(10)->div(5)->get();
    
    

    Api 实现:

    你觉得 Api 应该怎么实现?

    以上代码是我在设计 one框架的一些思考?

    如你喜欢请 star https://github.com/lizhichao/one

    如其他观点,欢迎留言讨论.

    7 条回复    2019-01-04 13:09:48 +08:00
    OMGZui
        1
    OMGZui  
       2018-12-24 11:11:55 +08:00
    各有优劣吧,目前 API 更热门

    https://www.zhihu.com/question/28570307
    tanszhe
        2
    tanszhe  
    OP
       2018-12-24 11:17:20 +08:00
    @OMGZui 看很多文章总喜欢把 tpc http 传输协议扯进来,api 和 rpc 都可以利用这些协程传输。
    还有打包方式 文本格式二进制格式 api 和 rpc 都可以使用。和传输协议 打包方式无关。
    zarte
        3
    zarte  
       2018-12-24 11:56:07 +08:00
    不了解 rpc,但是第一个的 rpc 栗子你省略了其他代码吧要不然怎么区分不同方法。
    tanszhe
        4
    tanszhe  
    OP
       2018-12-24 12:35:29 +08:00
    @zarte 没有省略,服务器端确实就拿一行就好了。把·article·模型提供出来就可以。客户端就可以直接使用这个模型
    realpg
        5
    realpg  
       2018-12-24 12:37:26 +08:00
    不说 RPC 协议实现 消息报文格式 就教一个高级语言怎么调用?

    网络层出了问题怎么调试?
    tanszhe
        6
    tanszhe  
    OP
       2018-12-24 12:41:49 +08:00
    @realpg 你可去看 one 框架文档,任何语言均可调用。
    hubqin
        7
    hubqin  
       2019-01-04 13:09:48 +08:00 via Android
    最近也正要搞 rpc,微服务架构,用 thrift 来写通讯接口语言(IDL),还没入门。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:03 · PVG 22:03 · LAX 06:03 · JFK 09:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.