当前位置: 首页 > news >正文

祖庙高明网站建设无锡市住房和城乡建设部网站

祖庙高明网站建设,无锡市住房和城乡建设部网站,郑州锐旗网站公司,平面设计提升班最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接,目前公司使用的是如下的逻辑(当然逻辑简化了,但是思想不变) 目录 简单的原理图代理服务的实现创建 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 通信
      • 代码地址

简单的原理图

schematic diagram

代理服务的实现

创建 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

http://www.yayakq.cn/news/629551/

相关文章:

  • 中国住房和城乡建设部网站官网可以做产品宣传的网站
  • 我做的网站怎么打开很慢阀门专业网站建设
  • 做网站设计挣钱吗广州建站工作室
  • 青海省建设厅建管处网站wordpress撰写
  • 营销型网站制作价格小白如何做网站
  • 做网站联系怎么制作二维码并自己编辑内容
  • 公司网站建设应注意什么ui设计的发展趋势
  • asp网站空间安卓app软件制作工具
  • 自己电脑做网站 路由器网站建设优化汕头
  • 怎样换网站关键词新公司网站建设分录
  • 做网站时需要FTP工具吗做网站上饶
  • 南宁门户网站学校建设网站前的市场分析
  • 网站建设数据库软件射阳建设局网站
  • 荆门城乡建设局网站2022年一建考试最新消息
  • 做外贸需要到外汇管理网站惠州最专业的网站建设公司
  • 济南泰安网站建设公司自助式网站
  • 信息技术做网站wordpress 3.6
  • 西安网站代维护最新网站建设合同
  • 个人建网站允许吗wordpress 知识库主题
  • 制作网站得多少钱vps 网站异常
  • 网站界面设计和ios移动界面设计的区别开网店的流程和步骤
  • 网站广告位设计无法使用wordpress
  • 木门行业网站该怎么做网站免费广告
  • 网站开发工作好找吗企业网站建设工作总结
  • 遂宁网站建设哪家好做视频的网站那几个盈利了
  • 网站快速上排名方法网站备案名称必须是公司名
  • 资金盘网站开发多少钱设计公司取名字大全集
  • 沈阳网站建设搜q479185700外包网有哪些
  • php 网站缩略图建立网站线上营销
  • 爱网站关键词查询工具wordpress+grace+破解