easyswoole - 基于swoole扩展实现的一款高性能php框架

跨平臺

Rpc 的請求響應是通過 tcp 作為傳輸層協(xié)議實現(xiàn),服務廣播使用 udp 協(xié)議,所以當我們使用其他語言作為 Rpc 客戶端時,只需要實現(xiàn)對應的應用層網(wǎng)絡協(xié)議即可。

下面客戶端使用的服務端是 微服務 - 服務端章節(jié) 基于自定義節(jié)點管理器 Redis 節(jié)點管理器 實現(xiàn)的。

具體 RPC 服務端 demo 代碼可查看 Github RPC 5.x Demo Github 或者 Gitee RPC 5.x Demo Gitee

PHP RPC 客戶端示例代碼

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

$data = [
    'service' => 'Goods', // 需要調用的服務名稱
    'module'  => 'GoodsModule', // 需要調用的服務下的子模塊名稱
    'action'  => 'list',  // 需要調用的服務下的子模塊的方法名稱
    'arg'     => ['a', 'b', 'c'], // 需要傳遞的參數(shù)
];

$raw = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// tcp://127.0.0.1:9600(示例請求地址) 是 rpc 服務端的地址,這里是本地,所以使用 127.0.0.1
// 開發(fā)者需要根據(jù)實際情況調整進行調用
$fp = stream_socket_client('tcp://127.0.0.1:9600');
fwrite($fp, pack('N', strlen($raw)) . $raw); // pack 數(shù)據(jù)校驗

$try = 3;
$data = fread($fp, 4);
if (strlen($data) < 4 && $try > 0) {
    $data .= fread($fp, 4);
    $try--;
    usleep(1);
}

// 做長度頭部校驗
$len = unpack('N', $data);
$data = '';
$try = 3;
if (strlen($data) < $len[1] && $try > 0) {
    $data .= fread($fp, $len[1]);
    $try--;
    usleep(1);
}

if (strlen($data) != $len[1]) {
    echo 'data error';
} else {
    $data = json_decode($data, true);
    // 這就是服務端返回的結果
    var_dump($data);
}

fclose($fp);

/**
 * 調用結果如下:
 * 其中 
 * statue 為服務端返回給客戶端的調用狀態(tài)碼 (具體可查看服務端:http://www.zbjtqy.com/Microservices/Rpc/server.html)
 * result 為服務端返回給客戶端的調用結果
 * msg    為服務端返回給客戶端的調用狀態(tài)信息
 * responseUUID 為服務端響應客戶端的唯一標識
 */
array(4) {
  ["status"]=>
  int(0)
  ["result"]=>
  array(2) {
    [0]=>
    array(3) {
      ["goodsId"]=>
      string(6) "100001"
      ["goodsName"]=>
      string(7) "商品1"
      ["prices"]=>
      int(1124)
    }
    [1]=>
    array(3) {
      ["goodsId"]=>
      string(6) "100002"
            ["goodsName"]=>
      string(7) "商品2"
            ["prices"]=>
      int(599)
    }
  }
  ["msg"]=>
  string(22) "get goods list success"
  ["responseUUID"]=>
  string(36) "3897f7ea-12a0-39c1-8948-ee9b9bc37274"
}

注意:可能由于網(wǎng)絡問題,并不是一次就能 recv 獲取到調用結果。

Go RPC 客戶端示例代碼

/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

package main

import (
    "encoding/binary"
    "net"
)

func main() {
    var tcpAddr *net.TCPAddr
    tcpAddr, _ = net.ResolveTCPAddr("tcp","192.168.1.107:9600")
    conn, _ := net.DialTCP("tcp", nil, tcpAddr)
    defer conn.Close()
    sendEasyswooleMsg(conn)
}

func sendEasyswooleMsg(conn *net.TCPConn) {
    var sendData []byte
    data := `{"service":"Goods","module":"GoodsModule","action":"list","arg":["a","b","c"]}`
    b := []byte(data)
    // 大端字節(jié)序(網(wǎng)絡字節(jié)序)大端就是將高位字節(jié)放到內存的低地址端,低位字節(jié)放到高地址端。
    // 網(wǎng)絡傳輸中(比如TCP/IP)低地址端(高位字節(jié))放在流的開始,對于2個字節(jié)的字符串(AB),傳輸順序為:A(0-7bit)、B(8-15bit)。
    sendData = int32ToBytes8(int32(len(data)))
    // 將數(shù)據(jù)byte拼裝到sendData的后面
    for _, value := range b {
        sendData = append(sendData, value)
    }
    conn.Write(sendData)
}

func int32ToBytes8(n int32) []byte {
    var buf = make([]byte, 4)
    binary.BigEndian.PutUint32(buf, uint32(n))
    return buf
}

Java RPC 客戶端示例代碼

/**
 * This file is part of EasySwoole.
 *
 * @link http://www.zbjtqy.com
 * @document http://www.zbjtqy.com
 * @contact http://www.zbjtqy.com/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Main {
    public static void main(String[] args) throws IOException {
        byte[] msg = "{\"service\":\"Goods\",\"module\":\"GoodsModule\",\"action\":\"list\",\"arg\":[\"a\",\"b\",\"c\"]}".getBytes();
        byte[] head = Main.toLH(msg.length);
        byte[] data = Main.mergeByteArr(head, msg);

        // 創(chuàng)建 Socket 對象,連接  rpc 服務器
        Socket socket = new Socket("127.0.0.1",9600);
        // 通過客戶端的套接字對象 Socket 方法,獲取字節(jié)輸出流,將數(shù)據(jù)寫向服務器
        OutputStream out = socket.getOutputStream();
        out.write(data);

        // 讀取服務器返回的數(shù)據(jù),使用 socket 套接字對象中的字節(jié)輸入流
        InputStream in = socket.getInputStream();
        byte[] response = new byte[1024];
        int len = in.read(response);
        // 這里是 rpc 服務端返回的結果為 json 字符串
        System.out.println(new String(response, 4, len-4));
        socket.close();
    }

    public static byte[] toLH(int n) {
        byte[] b = new byte[4];
        b[3] = (byte) (n & 0xff);
        b[2] = (byte) (n >> 8 & 0xff);
        b[1] = (byte) (n >> 16 & 0xff);
        b[0] = (byte) (n >> 24 & 0xff);
        return b;
    }

    public static byte[] mergeByteArr(byte[] a, byte[] b) {
        byte[] c = new byte[a.length + b.length];
        System.arraycopy(a, 0, c, 0, a.length);
        System.arraycopy(b, 0, c, a.length, b.length);
        return c;
    }
}

/**
 * 服務端返回結果如下:
 */
{"status":0,"result":[{"goodsId":"100001","goodsName":"商品1","prices":1124},{"goodsId":"100002","goodsName":"商品2","prices":599}],"msg":"get goods list success","responseUUID":"66b81f45-10f7-1a3e-fecd-9b57b021e31e"}

其他語言只需要實現(xiàn)對應的應用層協(xié)議即可

主站蜘蛛池模板: 金相切割机-金相磨抛机-显微/维氏/布氏/洛氏硬度计-自准直仪-金相显微镜-万能材料试验机-清洁度检测仪-淋雨试验机-上海中研精密仪器制造有限公司 | 气动球阀-气动蝶阀-电动蝶阀「厂家」-恒信流体控制有限公司 | 长沙广告设计公司|长沙广告制作|湖南户外广告制作|商业美陈就找湖南盛翔文化传媒有限公司老品牌高品质 | 宁波明驰同步带有限公司 | 印刷包装网_印刷包装_机械设备_行业动态_展会信息 | 万通汽车学校,汽车学校,汽修学校,汽修培训学校,汽车美容学校,汽车维修学校,学汽修-武汉万通汽车学校官方网站 | 制砂机_鹅卵石制砂机_河卵石制砂机_制砂机价格-上海山卓重工机械有限公司 | 深圳人才网_深圳招聘网_【官方网站】 | 磨粉设备_雷蒙磨粉机_雷蒙超细磨 | 全自动高速点胶机,锡膏喷印机系列,点胶阀核心配件厂家-博宁 | 泰州光明会计师事务所有限公司-财务业务审计,会计服务业务及资产评估业务的专业服务机构 | 京建鹏达_商用无烟烧烤设备多少钱|开店商用自助旋转烧烤炉价格|无烟电烧烤炉批发厂家|无烟烧烤桌定做厂商-京建鹏达烧烤设备网 | 铝压铸件_铝合金压铸件_铝合金压铸件厂家-安平县长虹压铸厂 | 拉布机_全自动拉布机_全自动拉布机厂家-江苏拉布机械科技有限公司 | 膜结构车棚厂家-张拉膜景观棚-汽车充电桩停车棚-嘉兴铭邦膜结构公司 | 宁波雷豹机电科技有限公司|雷豹冷风机|雷豹工业大风扇|MFC18000|MFC16000|MFC6000|EF3622|EF4222|EF4822|移动工业蒸发式冷风机空气冷却器|大型工业空调扇|雷豹移动式工业大风扇|雷豹大风扇|生产厂家|公司官网 | 球形钢支座,粘滞阻尼器,抗震球型钢支座,盆式橡胶支座,调谐质量阻尼器,屈曲约束支撑-衡水路泽科技 | 深圳潜水培训-潜水考证-公共安全潜水-救援潜水【深圳超潜潜水】 深圳汽车贴膜_深圳全车车身改色贴膜|UPPF隐形车衣官网 | 云南破碎机-制砂机-洗砂机-振动筛-昆明昆重机械厂家 | 新密耐火材料厂家价格-河南郑州荣盛窑炉耐火材料有限公司 | 喜来顺财经-专注于财经领域的综合性网站 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 山东岱新起重机械有限公司,单梁桥式起重机,双梁桥式起重机,通用式门式起重机,欧式起重机系列 | 世界地图,卫星地图,99地图网,微笑如歌 - www.99ditu.com | 铅板,防辐射铅板,医用铅板,保定美伦有色金属有限公司 | 消防水电施工,消防水电安装,消防水电施工公司,消防水电改造-亿杰北京消防工程公司 | 金属网帘|金属帘|装饰网帘|金属环网|金属幕墙网|金属垂帘|金属扣帘-安平县名图金属丝网制品有限公司 | 危废处理_危废处置_危废处理公司-江苏绿瑞特环境科技股份有限公司 | 名片印刷,名片制作,名片设计,印刷彩色名片,数码快印名片-北京瑞思凯信息咨询公司 | 南京申信智能科技有限公司| 直流电机调速器,直流电机控制器,直流电机调速电源-淄博诚铖创惠电子有限公司 | 金酱酒_金酱酒代理加盟招商_OEM贴牌企业定制! – 金酱酒代理加盟!茅台镇较早的酿酒烧坊,年产优质酱香白酒5000余吨,仁怀市十强白酒企业,主营主品:金酱酒、金酱陈香酒、酱香老酒等系列品牌产品 | 聊城市城乡规划设计研究院官方网站 | 深圳市翔洲宏科技有限公司| 猪粪烘干机|小型鸡粪烘干机|猪粪烘干机价格|小型鸡粪烘干机价格 - 河南宏科重工干燥机设备生产厂家 | 智能档案柜,回转柜,密集架,密集柜厂家-北京及尚智能家具 | 三七/灵芝超微粉碎机,小型超细粉碎机价格-北京燕山正德机械设备有限公司 | 专注全球电机测试-电机测试系统-AIP艾普【官网】 | 山东亮化工程_亮化公司_亮化资质-山东星汇照明工程有限公司 | 鑫金牛建设工程(苏州)有限公司 | 江苏宇力医疗器械有限公司|