thrift php 订单,基于Thrift RPC协议 的订单中心

PHALCON框架结构

68747470733a2f2f706f7365722e707567782e6f72672f6c696d696e6778696e6c656f2f7068616c636f6e2d70726f6a6563742f646f776e6c6f61647368747470733a2f2f706f7365722e707567782e6f72672f6c696d696e6778696e6c656f2f7068616c636f6e2d70726f6a6563742f762f737461626c6568747470733a2f2f706f7365722e707567782e6f72672f6c696d696e6778696e6c656f2f7068616c636f6e2d70726f6a6563742f762f756e737461626c6568747470733a2f2f706f7365722e707567782e6f72672f6c696d696e6778696e6c656f2f7068616c636f6e2d70726f6a6563742f6c6963656e7365

安装

安装项目

composer create-project limingxinleo/thrift-go-phalcon-project

使用Composer安装Thrift扩展后,把go的扩展包拷贝到GOPATH中(或建立软连接)。

ln -s /your/path/to/thrift-go-phalcon-project/vendor/apache/thrift/lib/go/thrift thrift

编译服务

Go 使用 thrift -r --gen go:thrift_import=thrift App.thrift

Php 使用 thrift -r --gen php:server,psr4 App.thrift

Go服务安装

从GO官网下载编译好的压缩包 例如 go1.8.3.linux-amd64.tar.gz

$ tar -xzf go1.8.3.linux-amd64.tar.gz

$ mv go /usr/local/go/1.8.3

$ vim /etc/profile

export GOROOT='/usr/local/go/1.8.3' # 没有文件夹则新建

export GOPATH='/usr/local/go/libs/' # 没有文件夹则新建

export PATH=$GOROOT/bin:$PATH

$ go get -u github.com/kardianos/govendor

$ cd /usr/local/go/libs/src/github.com/kardianos/govendor/

$ go build

$ cd /usr/local/bin

$ ln -s /usr/local/go/libs/src/github.com/kardianos/govendor/govendor govendor

Go&Swoole RPC 服务

Go thrift/gen-go/main.go

# RPC服务注册方法

server.RegisterProcessor("app", service.NewAppProcessor(&impl.App{}));

Swoole app/tasks/Thrift/Service.php

$handler = new AppHandler();

$processor->registerProcessor('app', new AppProcessor($handler));

服务实现

Swoole app/thrift/Services/AppHandle.php

namespace App\Thrift\Services;

use MicroService\AppIf;

class AppHandler extends Handler implements AppIf

{

public function version()

{

return $this->config->version;

}

}

负载均衡

Nginx Stream负载均衡已经十分强大了,自带健康检查。TCP负载均衡

服务发现

项目本人已内置基于Thrift的注册中心功能

已实现Swoole服务注册中心

已实现Go服务注册中心

或者配合注册中心一起使用 app/tasks/Thrift/ServiceTask.php

protected function beforeServerStart(swoole_server $server)

{

parent::beforeServerStart($server); // TODO: Change the autogenerated stub

// 增加服务注册心跳进程

$worker = new swoole_process(function (swoole_process $worker) {

$client = new swoole_client(SWOOLE_SOCK_TCP);

if (!$client->connect(env('REGISTRY_IP'), env('REGISTRY_PORT'), -1)) {

exit("connect failed. Error: {$client->errCode}\n");

}

swoole_timer_tick(5000, function () use ($client) {

$service = env('REGISTRY_SERVICE', 'github');

$data = [

'service' => $service,

'ip' => env('SERVICE_IP'),

'port' => env('SERVICE_PORT'),

'nonce' => time(),

'register' => true,

'sign' => 'xxx',

];

$client->send(json_encode($data));

$result = $client->recv();

$result = json_decode($result, true);

if ($result['success']) {

foreach ($result['services'] as $key => $item) {

Redis::hset($service, $key, json_encode($item));

}

}

});

});

$server->addProcess($worker);

}

Thrift 数据类型

基本类型(括号内为对应的Java类型):

bool(boolean): 布尔类型(TRUE or FALSE)

byte(byte): 8位带符号整数

i16(short): 16位带符号整数

i32(int): 32位带符号整数

i64(long): 64位带符号整数

double(double): 64位浮点数

string(String): 采用UTF-8编码的字符串

特殊类型(括号内为对应的Java类型)

binary(ByteBuffer):未经过编码的字节流

Structs(结构):

struct UserProfile {

1: i32 uid,

2: string name,

3: string blurb

}

struct UserProfile {

1: i32 uid = 1,

2: string name = "User1",

3: string blurb

}

容器,除了上面提到的基本数据类型,Thrift还支持以下容器类型:

list(java.util.ArrayList) set(java.util.HashSet) map(java.util.HashMap)

struct Node {

1: i32 id,

2: string name,

3: list subNodeList,

4: map subNodeMap,

5: set subNodeSet

}

struct SubNode {

1: i32 uid,

2: string name,

3: i32 pid

}

struct Node {

1: i32 uid,

2: string name,

3: list subNodes

}

服务

service UserStorage {

void store(1: UserProfile user),

UserProfile retrieve(1: i32 uid)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值