亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

跨平臺

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

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

具體 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.b3f21.cn
 * @document http://www.b3f21.cn
 * @contact http://www.b3f21.cn/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'], // 需要傳遞的參數
];

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

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

$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 為服務端返回給客戶端的調用狀態碼 (具體可查看服務端:http://www.b3f21.cn/Microservices/Rpc/server.html)
 * result 為服務端返回給客戶端的調用結果
 * msg    為服務端返回給客戶端的調用狀態信息
 * 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"
}

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

Go RPC 客戶端示例代碼

/**
 * This file is part of EasySwoole.
 *
 * @link http://www.b3f21.cn
 * @document http://www.b3f21.cn
 * @contact http://www.b3f21.cn/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)
    // 大端字節序(網絡字節序)大端就是將高位字節放到內存的低地址端,低位字節放到高地址端。
    // 網絡傳輸中(比如TCP/IP)低地址端(高位字節)放在流的開始,對于2個字節的字符串(AB),傳輸順序為:A(0-7bit)、B(8-15bit)。
    sendData = int32ToBytes8(int32(len(data)))
    // 將數據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.b3f21.cn
 * @document http://www.b3f21.cn
 * @contact http://www.b3f21.cn/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);

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

        // 讀取服務器返回的數據,使用 socket 套接字對象中的字節輸入流
        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"}

其他語言只需要實現對應的應用層協議即可

亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    亚洲欧美国产精品桃花| 国产传媒一区二区| 国产欧美一区二区三区国产幕精品| 亚洲人成免费| 亚洲在线网站| 欧美xxxx黑人又粗又长精品| 色视频一区二区三区| 亚洲图色在线| 一本一生久久a久久精品综合蜜 | 久久成人国产| 最新成人av网站| 国产精品一区在线观看| 久久久777| 免费看国产精品一二区视频| 午夜视频一区| 51蜜桃传媒精品一区二区| 欧美一区二区在线| 亚洲高清资源| 伊人久久成人| 亚洲精品欧美精品| 国产欧美精品| 91九色视频在线观看| 国产日韩欧美亚洲一区| 免费在线观看一区二区| 中文字幕一区二区三区最新 | 欧美日本免费| 一区二区欧美日韩| av成人在线电影| 日本在线成人一区二区| 欧美另类专区| 午夜亚洲性色福利视频| 国产视频一区二区三区四区| 亚洲美女网站18| 在线欧美一区| 成人黄动漫网站免费| 欧美亚洲另类久久综合| 欧美视频一区| 久久久久在线| 视频一区二区在线| 99精品欧美一区二区三区| 99在线首页视频| 亚洲精品在线免费看| 亚洲国产日韩综合一区| 91成人在线看| 亚洲国产精品久久久久婷婷老年 | 一区二区不卡视频| 日韩视频在线观看国产| 在线不卡视频| 国产日韩亚洲欧美精品| 国产视频一区二区三区四区| 永久久久久久| 男女精品网站| 亚洲国产精品123| 国产欧美一区二区三区国产幕精品| 国产三级精品在线不卡| 欧美区国产区| 国产不卡一区二区三区在线观看| 自拍偷拍一区二区三区| 久久国产福利| 亚洲午夜精品久久| 蜜乳av另类精品一区二区| 午夜精品福利一区二区| 国产精品久久久免费| 欧美久久综合性欧美| 国产欧美二区| 视频一区亚洲| 久久久久久婷| 午夜精品视频在线观看一区二区| 91久久精品www人人做人人爽 | 国内一区二区三区在线视频| 国产精品加勒比| 伊人久久亚洲美女图片| 久久国产精品免费一区| 亚洲欧洲一区| 国产精品久久国产三级国电话系列 | 国产综合欧美在线看| 91亚色免费| 欧美日韩国产色综合一二三四| 成人在线视频网址| 黄色精品免费| 国产伦精品一区二区三区| 蜜桃av久久久亚洲精品| 亚洲久久视频| 青青草国产精品| 久久精品一区二区三区中文字幕| 亚洲毛片aa| 国产精品日本一区二区| 亚洲一二区在线| 欧美伦理一区二区| 国产美女诱惑一区二区| 日韩欧美一区二区三区四区五区 | 老鸭窝毛片一区二区三区| 欧美在线观看天堂一区二区三区| 国产精品日本一区二区| 国产私拍一区| 一区二区不卡在线视频 午夜欧美不卡'| 粉嫩av四季av绯色av第一区| 亚洲美女啪啪| 欧美久久九九| 国产伦精品一区二区| 日韩高清av电影| 国产精品18毛片一区二区| 一本久道综合久久精品| 中文字幕日韩一区二区三区| 国产另类自拍| 久久久久中文| 99亚洲精品| 欧美日韩免费高清| 天堂va久久久噜噜噜久久va| 国产精品麻豆免费版| 先锋影音久久久| 亚洲欧洲另类| 欧美日韩久久| 一级做a爰片久久| 欧美日韩一区综合| 国产精品一区视频| 久久亚洲精选| 国产精品日韩精品欧美精品| 国产在线成人| 在线免费观看成人| 亚洲不卡一卡2卡三卡4卡5卡精品| 国产一区在线观| 成人永久免费| av蓝导航精品导航| 久久福利一区| 国产精品五区| 一区二区三区四区国产| 亚洲国产一区二区三区a毛片| 欧美成人69av| 在线国产99| 亚洲欧美精品在线观看| 日本不卡一二三区| 亚洲免费精品视频| 精品91免费| 国产一区精品视频| 国产亚洲欧美一区二区三区| 91视频免费在线观看| 免费亚洲一区二区| 亚洲欧美久久久| 亚洲视频导航| 国产精品人人爽人人做我的可爱| 亚洲午夜电影| 亚洲国产第一| 日韩视频免费| 国产精品毛片一区二区三区| 在线视频一区观看| 亚洲影音先锋| 久久久久久一区二区| 久久久一本精品99久久精品66| 99久久无色码| 六月婷婷久久| 91免费版网站在线观看| 玖玖在线精品| 国产精品一 二 三| 久久国产一区二区| 欧美日韩精品免费在线观看视频| 欧美在线视频二区| 亚洲精品在线观看免费| 你懂的网址国产 欧美| 欧美一区二区三区免费看| 欧美日本亚洲韩国国产| 伊人成人网在线看| 国产精品日韩欧美一区| 新狼窝色av性久久久久久| 欧美一级久久| 波多野结衣一区二区三区在线观看| 99精品99久久久久久宅男| 99在线影院| 久久久久综合一区二区三区| 日韩电影大全在线观看| 欧美一区综合| 亚洲国产高清一区二区三区| 99在线观看免费视频精品观看| 国产精品一区视频| 翡翠波斯猫1977年美国| 久久精精品视频| 亚洲高清资源综合久久精品| 一区二区三区久久网| 亚洲日本精品国产第一区| 久久大逼视频| 国内精品国语自产拍在线观看| 欧美一区二区影视| 欧美精品七区| 在线视频日韩| 国产精品初高中精品久久| 日韩av电影免费在线观看| 国产一区高清视频| 亚洲欧美日韩综合国产aⅴ| 国产精品福利视频| 日本一区二区三区视频在线观看 | 成人av免费电影| 青青草国产精品| 在线播放豆国产99亚洲| 97se在线视频| 亚洲高清资源综合久久精品| 亚洲性色视频| 成人av免费电影| 一区二区成人国产精品| 国产免费成人| 欧美日韩国产高清视频|