grpc进程间调用和tcp调用对比

简介: 通过对比grpc进程间调用和tcp调用对比测试,发现进程间调用速度更快,
  1. 进程间源码

greeter_client.go
// Package main implements a client for Greeter service.
package main

import (
"context"
"log"
"math/rand"
"net"
"os"
"strconv"
"time"

"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)

const (
defaultName = "world"
client_file = "/tmp/client_unix"
server_file = "/tmp/server_unix"
)

func UnixConnect(addr string, t time.Duration) (net.Conn, error) {
unix_addr, err := net.ResolveUnixAddr("unix", server_file)
conn, err := net.DialUnix("unix", nil, unix_addr)
return conn, err
}

func main() {

os.Remove(client_file)

// Set up a connection to the server.
conn, err := grpc.Dial(server_file, grpc.WithInsecure(), grpc.WithDialer(UnixConnect))

if err != nil {
log.Fatal("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)

log.Println("start gprc client say hello circle 100 times")
// Contact the server and print out its response.

time1 := time.Now().UnixNano()

for i := 0; i < 1000000; i++ {

name := defaultName
num := rand.Int()
name += strconv.Itoa(num)
_, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatal("could not greet: ", err)
}
//log.Println(r)
//log.Printf("the num Greeting:%d, %s", i, r.Message)

}
time2 := time.Now().UnixNano()
time3 := time2 - time1
time4 := time3 / int64(time.Millisecond)
log.Printf("gRPC test \n start time1: %d \n end time2: %d \n nm time3: %d \n ms time4: %d ms", time1, time2, time3, time4)

greeter_server.go

package main

import (
"context"
"log"
"net"
"os"

"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)

const (
//port = ":50051"
server_file = "/tmp/server_unix"
)

// server is used to implement helloworld.GreeterServer.
type server struct {
pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s server) SayHello(ctx context.Context, in pb.HelloRequest) (*pb.HelloReply, error) {
//log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
//lis, err := net.Listen("tcp", port)
//if err != nil {
// log.Fatalf("failed to listen: %v", err)
//}
//s := grpc.NewServer()
//pb.RegisterGreeterServer(s, &server{})
//log.Printf("server listening at %v", lis.Addr())
//if err := s.Serve(lis); err != nil {
// log.Fatalf("failed to serve: %v", err)
//}
//log.Println("main is end")

log.Println("start grpc server")
os.Remove(server_file)
//lis, err := net.Listen("tcp", port)
server_addr, err := net.ResolveUnixAddr("unix", server_file)
if err != nil {
log.Fatal("fialed to resolve unix addr")
}

lis, err := net.ListenUnix("unix", server_addr)
if err != nil {
log.Fatal("failed to listen: %v", err)
}

s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("start grpc server server_addr %v \n",server_addr)
s.Serve(lis)
log.Println("grpc server end")
}

//type server struct{
// pb.UnimplementedGreeterServer
//}

//func (s server) SayHello(ctx context.Context, in pb.HelloRequest) (*pb.HelloReply, error) {
// return &pb.HelloReply{Message: "Hello " + in.Name}, nil
//}

func GrpcServer() {
log.Println("start grpc server")
os.Remove(server_file)
//lis, err := net.Listen("tcp", port)
server_addr, err := net.ResolveUnixAddr("unix", server_file)
if err != nil {
log.Fatal("fialed to resolve unix addr")
}

lis, err := net.ListenUnix("unix", server_addr)
if err != nil {
log.Fatal("failed to listen: %v", err)
}

s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("start grpc server server_addr %v \n",server_addr)
s.Serve(lis)
log.Println("grpc server end")
2.grpc TCP 调用
greeter_client.go
package main

import (
"context"
"log"
"math/rand"
"strconv"
"time"

"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)

const (
address = "localhost:50051"
defaultName = "world"
)

func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)

// Contact the server and print out its response.
//name := defaultName
//if len(os.Args) > 1 {
// name = os.Args[1]
//}
//ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//defer cancel()

time1 := time.Now().UnixNano()
//timeStart := time.Now().Unix()
for i := 0; i < 1000000; i++ {
name := defaultName
num := rand.Int()
name += strconv.Itoa(num)
_, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
//log.Printf("the num Greeting:%d, %s", i, r.GetMessage())
//time.Sleep(100*time.Millisecond)
}
time2 := time.Now().UnixNano()
time3 := time2 - time1
time4 := time3 / int64(time.Millisecond)
log.Printf("gRPC TCP/IP test\n start time1: %d \n end time2: %d \n nm time3: %d \n ms time4: %d ms", time1, time2, time3, time4)
}
greeter_server.go
package main

import (
"context"
"log"
"net"

"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)

const (
port = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct {
pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s server) SayHello(ctx context.Context, in pb.HelloRequest) (*pb.HelloReply, error) {
//log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}

相关文章
|
4月前
|
负载均衡 网络协议 Linux
探索服务端进程的TCP连接极限,一个服务端进程最多能支持多少条 TCP 连接?
探索服务端进程的TCP连接极限,一个服务端进程最多能支持多少条 TCP 连接?
158 4
|
11月前
|
网络协议 API
TCP并发服务器(多进程与多线程)
TCP并发服务器(多进程与多线程)
114 0
|
17天前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
2月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
169 1
|
网络协议 搜索推荐 Java
利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程(二)
利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程(二)
75 0
|
网络协议 Java 数据处理
利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程(一)
利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程(一)
325 0
|
网络协议 Unix Linux
Linux - lsof显示 tcp,udp 的端口和进程
lsof显示 tcp,udp 的端口和进程
324 0
Linux - lsof显示 tcp,udp 的端口和进程
|
网络协议 Java C++
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
TCP网络编程模型从入门到实战中等篇,单服务器多个用户的简单并发版本, 从多进程 到多线程 到 线程池 版本服务器实现...直到最终解决面试经典C10k高并发服务器设计
|
网络协议 Unix Linux
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
327 0
linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
|
网络协议 Linux
面试官:如何在不杀掉进程前提,关闭一个 TCP 连接?
如何在不杀掉进程前提,关闭一个 TCP 连接?
面试官:如何在不杀掉进程前提,关闭一个 TCP 连接?

相关实验场景

更多