阿里云服务器做电影网站,wordpress手机菜单分行,做什么网站比较简单,wordpress 图片响应式最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接#xff0c;目前公司使用的是如下的逻辑(当然逻辑简化了#xff0c;但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc …最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接目前公司使用的是如下的逻辑(当然逻辑简化了但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc service 的连接保存 grpc client dial 的连接client 连接上了的时候告诉 tcp server, 要连接哪个 grpc service从 保存的conn 中查询是否有 相关的连接如果有则 通过 io.Copy 来让grpc client 与 grpc service 通信 代码地址 简单的原理图 代理服务的实现
创建 tls tcp 服务, 用于grpc client 和 grpc service 通信
func Run() error {// 创建 CA证书 用于 tls 连接ca, err : private_keys.NewCA(127.0.0.1)if err ! nil {log.Fatal(err)}serverCA, err : tls.X509KeyPair(ca.CertPem(), ca.KeyPem())if err ! nil {log.Fatal(err)}tlsServerConfig : tls.Config{Certificates: []tls.Certificate{serverCA},}// 创建 带 tls 的tcp服务listener, err : tls.Listen(tcp, fmt.Sprintf(:%d, Port), tlsServerConfig)if err ! nil {log.Printf(Error tcp listening on port %d: %v\n, Port, err)return err}fmt.Println(TCP Listening on port , Port, ; successfully)for {conn, err : listener.Accept()if err ! nil {log.Printf(Error accepting connection: %v\n, err)return err}fmt.Println(tcp new connection)// 处理请求go forwardCommunication(conn)}return nil
}func forwardCommunication(conn net.Conn) error {// 首次连接上的时候通信告诉 tcp server 是客户端连接还是服务端连接bufBytes, err : ReadData(conn)if err ! nil {return err}device : Device{}err json.Unmarshal(bufBytes, device)if err ! nil {log.Printf(Error unmarshalling json: %v\n, err)return err}
}保存 与 代理服务建立的 grpc service 的连接
func server(deviceID string, conn net.Conn) error {sendData, err : json.Marshal(OK{Code: 1})if err ! nil {log.Printf(Error marshalling json: %v\n, err)return err}sendData append(sendData, )_, err conn.Write(sendData)if err ! nil {log.Printf(Error writing to connection: %v\n, err)return err}// 保存 grpc 服务的 dial connectsetConnMap(deviceID, conn)return nil
}保存 grpc client dial 的连接
client 连接上了的时候告诉 tcp server, 要连接哪个 grpc service
从 保存的conn 中查询是否有 相关的连接
如果有则 通过 io.Copy 来让grpc client 与 grpc service 通信
func client(deviceID string, conn net.Conn) error {toConn : GetConn(deviceID)successCode : 0if toConn nil {successCode -1}sendData, _ : json.Marshal(OK{Code: successCode})_, err : conn.Write(append(sendData, MessageEnd))if err ! nil {log.Printf(Error writing to connection: %v\n, err)}if successCode 0 {conn.Close()return err}go func() {_, err : io.Copy(toConn, conn)if err ! nil {log.Printf(client toConn error reading from connection: %v\n, err)}log.Printf(toConn conn closed.\n)return}()go func() {_, err : io.Copy(conn, toConn)if err ! nil {log.Printf(client conn error reading from connection: %v\n, err)}log.Printf(conn toConn closed.\n)}()fmt.Println(Client connected to device, deviceID)return nil
}代码地址
https://github.com/wanmei002/websocket-reverse-proxy