grpc代理服务的实现(二)

目录

grpc service 的实现

假设 grpc service 的服务名是 Bar

grpc服务通过unix域监听请求

复制代码
```go
svr := grpc.NewServer()
messages.RegisterBarServer(svr, bar.New())
reflection.Register(svr)
os.Remove(sockPath)
lis, err := net.Listen("unix", sockPath)
if err != nil {
    log.Fatalf("failed to listen: %v", err)
}
go func() {
    if err := svr.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}()
```

建立与代理服务的tcp连接

go 复制代码
   // 与代理服务器建立连接
    conn, err := tls.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", tcp_server.Port), &tls.Config{InsecureSkipVerify: true})
    if err != nil {
        log.Printf("dial tcp failed: %v\n", err)
        return err
    }
    // 与代理服务器通信,告诉它 是提供服务者
    firstWrite := &tcp_server.Device{ID: deviceID, Type: tcp_server.DeviceTypeServer}
    writeData, err := json.Marshal(firstWrite)
    if err != nil {
        log.Printf("marshal first write failed: %v\n", err)
        return err
    }
    _, err = conn.Write(append(writeData, tcp_server.MessageEnd))
    if err != nil {
        log.Printf("write first write failed: %v\n", err)
        return err
    }

    bufBytes, err := tcp_server.ReadData(conn)
    if err != nil {
        log.Printf("read first write failed: %v\n", err)
        return err
    }
    recvData := &tcp_server.OK{}
    err = json.Unmarshal(bufBytes, recvData)
    if err != nil {
        log.Printf("unmarshal first write failed: %v\n", err)
        return err
    }
    if recvData.Code < 0 {
        log.Printf("first write failed: %v\n", recvData.Code)
        return errors.New("first write failed")
    }

请求转发到 unix 上

go 复制代码
   // 与本地的 unix 建立连接
   unixConn, err := net.Dial("unix", sockPath)
	if err != nil {
		log.Fatalf("failed to dial unix: %v", err)
	}
    go func() {
        defer wg.Done()
        _, err = io.Copy(conn, unixConn)
        if err != nil {
            log.Printf("io.Copy failed: %v\n", err)
            return
        }
        fmt.Println("copy conn end")
    }()
    go func() {
        defer wg.Done()
        _, err = io.Copy(unixConn, conn)
        if err != nil {
            log.Printf("io.Copy failed unixConn: %v\n", err)
            return
        }
        fmt.Println("copy unixConn end")
    }()
    return nil

代码地址

https://github.com/wanmei002/websocket-reverse-proxy

相关推荐
仲夏月二十八7 小时前
关于golang中何时使用值对象和指针对象的描述
开发语言·后端·golang
天远数科8 小时前
Go语言金融风控:天远 全能小微企业报告组合接口的 AES 加密与异构 JSON 解析
大数据·golang·json
wodet8 小时前
golang实现的批量审核文本服务
微服务·golang
朝花不迟暮9 小时前
go的文件操作
开发语言·后端·golang
喵了几个咪10 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:分层设计的取舍之道(从 “简单粗暴” 到依赖倒置)
微服务·golang
小徐Chao努力11 小时前
Go语言核心知识点底层原理教程【Slice的底层实现】
开发语言·算法·golang
Rookie_explorers11 小时前
go私有仓库athens搭建
开发语言·后端·golang
小徐Chao努力14 小时前
Go语言核心知识点底层原理教程【Map的底层原理】
java·golang·哈希算法
未来之窗软件服务14 小时前
幽冥大陆(六十二) 多数据库交叉链接系统Go语言—东方仙盟筑基期
数据库·人工智能·oracle·golang·数据库集群·仙盟创梦ide·东方仙盟
码luffyliu14 小时前
Go 语言并发编程:为何它能甩开 Java 等传统后端语言?
java·后端·golang·go