成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Thrift-簡(jiǎn)單實(shí)用

codergarden / 3016人閱讀

摘要:安裝作用跨語(yǔ)言調(diào)用,打破不同語(yǔ)言之間的隔閡。跨項(xiàng)目調(diào)用,微服務(wù)的么么噠。示例前提版本的版本版本版本說(shuō)明該示例包含三種語(yǔ)言。

簡(jiǎn)介
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.

Apache Thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展跨語(yǔ)言的服務(wù)開(kāi)發(fā),結(jié)合了軟件堆棧和代碼生成引擎,用來(lái)構(gòu)建C++,Java,Python...等語(yǔ)言,使之它們之間無(wú)縫結(jié)合、高效服務(wù)。

安裝
brew install thrift
作用
跨語(yǔ)言調(diào)用,打破不同語(yǔ)言之間的隔閡。
跨項(xiàng)目調(diào)用,微服務(wù)的么么噠。
示例 前提

thrift版本:

Go的版本、Php版本、Python版本:

說(shuō)明

該示例包含python,php,go三種語(yǔ)言。(java暫無(wú))

新建HelloThrift.thrift

進(jìn)入目錄

cd /Users/birjemin/Developer/Php/study-php

編寫(xiě)HelloThrift.thrift

vim HelloThrift.thrift

內(nèi)容如下:

namespace php HelloThrift {
  string SayHello(1:string username)
}
Php測(cè)試

加載thrift-php庫(kù)

composer require apache/thrift

生成php版本的thrift相關(guān)文件

cd /Users/birjemin/Developer/Php/study-php
thrift -r --gen php:server HelloThrift.thrift

這時(shí)目錄中生成了一個(gè)叫做gen-php的目錄。

建立Server.php文件

registerDefinition("HelloThrift",$GEN_DIR);
$loader->register();

class HelloHandler implements HelloThriftHelloServiceIf
{
    public function SayHello($username)
    {
        return "Php-Server: " . $username;
    }
}

$handler   = new HelloHandler();
$processor = new HelloThriftHelloServiceProcessor($handler);
$transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W));
$protocol  = new TBinaryProtocol($transport,true,true);
$transport->open();
$processor->process($protocol,$protocol);
$transport->close();

建立Client.php文件

registerDefinition("HelloThrift", $GEN_DIR);
$loader->register();

if (array_search("--http",$argv)) {
    $socket = new THttpClient("local.study-php.com", 80,"/Server.php");
} else {
    $host = explode(":", $argv[1]);
    $socket = new TSocket($host[0], $host[1]);
}
$transport = new TBufferedTransport($socket,1024,1024);
$protocol  = new TBinaryProtocol($transport);
$client    = new HelloThriftHelloServiceClient($protocol);
$transport->open();
echo $client->SayHello("Php-Client");
$transport->close();

測(cè)試

php Client.php --http

Python測(cè)試

加載thrift-python3模塊(只測(cè)試python3,python2就不測(cè)試了)

pip3 install thrift

生成python3版本的thrift相關(guān)文件

thrift -r --gen py HelloThrift.thrift

這時(shí)目錄中生成了一個(gè)叫做gen-py的目錄。

建立Server.py文件

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import sys
sys.path.append("./gen-py")

from HelloThrift import HelloService
from HelloThrift.ttypes import *
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

class HelloWorldHandler:
    def __init__(self):
        self.log = {}

    def SayHello(self, user_name = ""):
        return "Python-Server: " + user_name

handler = HelloWorldHandler()
processor = HelloService.Processor(handler)
transport = TSocket.TServerSocket("localhost", 9091)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
server.serve()

建立Client.py文件

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import sys
sys.path.append("./gen-py")

from HelloThrift import HelloService
from HelloThrift.ttypes import *
from HelloThrift.constants import *

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

host = sys.argv[1].split(":")
transport = TSocket.TSocket(host[0], host[1])
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = HelloService.Client(protocol)
transport.open()

msg = client.SayHello("Python-Client")
print(msg)
transport.close()

測(cè)試

開(kāi)一個(gè)新窗口,運(yùn)行下面命令:

python3 Server.php

Go測(cè)試

加載go的thrift模塊

go get git.apache.org/thrift.git/lib/go/thrift

生成go版本的thrift相關(guān)文件

thrift -r --gen go HelloThrift.thrift

生成Server.go文件

package main

import (
    "./gen-go/hellothrift"
    "git.apache.org/thrift.git/lib/go/thrift"
    "context"
)

const (
    NET_WORK_ADDR = "localhost:9092"
)

type HelloServiceTmpl struct {
}

func (this *HelloServiceTmpl) SayHello(ctx context.Context, str string) (s string, err error) {
    return "Go-Server:" + str, nil
}

func main() {
    transportFactory := thrift.NewTTransportFactory()
    protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
    transportFactory = thrift.NewTBufferedTransportFactory(8192)
    transport, _ := thrift.NewTServerSocket(NET_WORK_ADDR)
    handler := &HelloServiceTmpl{}
    processor := hellothrift.NewHelloServiceProcessor(handler)
    server := thrift.NewTSimpleServer4(processor, transport, transportFactory, protocolFactory)
    server.Serve()
}

生成Client.go文件

package main

import (
    "./gen-go/hellothrift"
    "git.apache.org/thrift.git/lib/go/thrift"
    "fmt"
    "context"
    "os"
)

func main() {
    var transport thrift.TTransport
    args := os.Args
    protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
    transport, _ = thrift.NewTSocket(args[1])
    transportFactory := thrift.NewTBufferedTransportFactory(8192)
    transport, _ = transportFactory.GetTransport(transport)
    //defer transport.Close()
    transport.Open()
    client := hellothrift.NewHelloServiceClientFactory(transport, protocolFactory)
    str, _ := client.SayHello(context.Background(), "Go-Client")
    fmt.Println(str)
}

測(cè)試

開(kāi)一個(gè)新窗口,運(yùn)行下面命令:

go run Server.go

綜合測(cè)試

開(kāi)啟兩個(gè)窗口,保證server開(kāi)啟

go run Server.go # localhost:9092
python3 Server.py # localhost:9091

php調(diào)用go-server、py-server

php Client.php localhost:9091
php Client.php localhost:9092

python3調(diào)用go-server、py-server

python3 Client.py localhost:9091
python3 Client.py localhost:9092

go調(diào)用go-server、py-server

go run Client.go localhost:9091
go run Client.go localhost:9092
備注

沒(méi)有測(cè)試php的socket,go、python3的http,可以花時(shí)間做一下

代碼純屬組裝,沒(méi)有深刻了解其中原理,后期打算寫(xiě)一篇理論篇和封裝類庫(kù)篇

參考

https://studygolang.com/articles/1120

https://www.cnblogs.com/qufo/p/5607653.html

https://www.cnblogs.com/lovemdx/archive/2012/11/22/2782180.html

https://github.com/yuxel/thrift-examples

http://thrift.apache.org/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28276.html

相關(guān)文章

  • Spring Boot 中使用 thrift 入門

    摘要:簡(jiǎn)介是什么是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。的功能允許定義一個(gè)簡(jiǎn)單的定義文件中的數(shù)據(jù)類型和服務(wù)接口,以作為輸入文件,編譯器生成代碼用來(lái)方便地生成客戶端和服務(wù)器通信的無(wú)縫跨編程語(yǔ)言。 Thrift 簡(jiǎn)介 Thrift 是什么 Thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Go,P...

    cnio 評(píng)論0 收藏0
  • thrift調(diào)用流程分析

    摘要:由于工作需要使用,并且需要根據(jù)需求修改源碼,因此必須熟悉執(zhí)行的流程。目前支持的模型包括使用阻塞的單線程服務(wù)器,主要用于調(diào)試。 由于工作需要使用thrift,并且需要根據(jù)需求修改thrift源碼,因此必須熟悉thrift執(zhí)行的流程。以下是根據(jù)thrift源碼閱讀而得出流程分析。 thrift協(xié)議棧概述 thrift是一個(gè)rpc框架,開(kāi)發(fā)者可以通過(guò)thrift自帶的接口定義語(yǔ)言(IDL)來(lái)...

    nidaye 評(píng)論0 收藏0
  • Thrift 簡(jiǎn)易入門與實(shí)戰(zhàn)

    摘要:簡(jiǎn)介是一個(gè)軟件框架用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎以構(gòu)建在這些編程語(yǔ)言間無(wú)縫結(jié)合的高效的服務(wù)官網(wǎng)地址安裝的安裝比較簡(jiǎn)單在下可以直接使用快速安裝或可以通過(guò)官網(wǎng)下載這里就不再多說(shuō)了當(dāng)下載安裝完畢后我們就 簡(jiǎn)介 thrift是一個(gè)軟件框架, 用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā). 它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎, 以構(gòu)建在 C++, Java...

    iliyaku 評(píng)論0 收藏0
  • Thrift

    摘要:遠(yuǎn)程調(diào)用服務(wù)調(diào)用遠(yuǎn)端的服務(wù)的就像直接在本地調(diào)用本質(zhì)上來(lái)說(shuō)是一種服務(wù)的是一種服務(wù)但它只限于與語(yǔ)言之間的調(diào)用提供了跨語(yǔ)言的服務(wù)調(diào)用服務(wù)的組成部件服務(wù)本質(zhì)上是一種架構(gòu)服務(wù)所以在編寫(xiě)一個(gè)組件時(shí)需要編寫(xiě)端端還要編寫(xiě)傳輸?shù)膮f(xié)議框架主要是實(shí)現(xiàn)這三種部件的 thrift rpc(遠(yuǎn)程調(diào)用)服務(wù):調(diào)用遠(yuǎn)端的服務(wù)的就像直接在本地調(diào)用.本質(zhì)上來(lái)說(shuō)是一種c/s服務(wù). Java的RMI是一種rpc服務(wù),但它只限...

    JerryC 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<