微服务的作用是多个项目连接方便快捷,不需要用http访问请求直接用tcp请求
优点:访问不会存在超时http访问时间过长会存在超时500
tcp连接特别快
http相当于应用层tcp是网络层,少了很多加密处理逻辑所以很快
func main() {
// 注册服务
err := rpc.RegisterName("名称", new(包.类))//可以直接注册类下面的所有方法
if err != nil {
fmt.Println(err.Error())
return
}
// 监听端口
listen, errs := net.Listen("tcp", “0.0.0.0:8089“)
if errs != nil {
fmt.Println(errs.Error())
return
}
defer listen.Close()
for {
conn, err1 := listen.Accept()
if err1 != nil {
fmt.Println(err1.Error())
continue
}
// 绑定服务
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
php原生
/**
* 微服务调用客户端
* @param string $method 微服务方法
* @param string $data 发送的数据
* @param string $err 错误信息
* @param string $id 请求的唯一id【不需要可以取默认值就行】
* @return boolean
*/
public static function rPCClient(string $method, string $data, &$err = '', $id = 0)
{
$send_data = json_encode([
'method' => $method,
'params' => [$data],
'id' => $id
], JSON_UNESCAPED_UNICODE);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
$err = socket_strerror(socket_last_error());
return false;
}
$result = socket_connect($socket,"127.0.0.1", “8089”);
if ($result === false) {
$err = socket_strerror(socket_last_error($socket));
return false;
}
socket_write($socket, $send_data, strlen($send_data));
$response = socket_read($socket, 1024);
socket_close($socket);
return $response;
}
php+swoole调用微服务
/**
* 微服务调用客户端
* @param string $method 微服务方法
* @param string $data 发送的数据
* @param string $id 请求的唯一id【不需要可以取默认值就行】
* @return boolean
*/
public static function rPCClient(string $method, string $data, $id = 0)
{
$sdata = [
'method' => $method,
'params' => [$data],
'id' => $id
];
$send_data = json_encode($sdata, JSON_UNESCAPED_UNICODE);
$res = self::sendData2Socket("127.0.0.1", 8089, $send_data);
return $res;
}
/**
* 发送数据到socket接口
* @param type $address
* @param type $port
* @param array|string $send_data
* @return boolean
*/
public static function sendData2Socket($address, $port, $send_data)
{
$client = new Client(SWOOLE_SOCK_TCP);
$connect = $client->connect($address, $port, -1);
if (!$connect) {
$client->close();
return false;
}
if (is_array($send_data)) {
$send_data = json_encode($send_data, JSON_UNESCAPED_UNICODE);
}
$client->send($send_data . "\n");
$data = $client->recv();
$client->close();
if (!$data) {
return false;
}
return $data;
}