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
相关文章:
grpc代理服务的实现(一)
最近公司需要无感知基于服务代号来实现通信, 并监控和管理通信连接,目前公司使用的是如下的逻辑(当然逻辑简化了,但是思想不变) 目录 简单的原理图代理服务的实现创建 tls tcp 服务, 用于grpc client 和 grpc service 通信保存 与 代理服务建立的 grpc …...
FastAPI系列 4 -路由管理APIRouter
FastAPI系列 -路由管理APIRouter 文章目录 FastAPI系列 -路由管理APIRouter一、前言二、APIRouter使用示例1、功能拆分2、users、books模块开发3、FastAPI主体 三、运行结果 一、前言 未来的py开发者请上座,在使用python做为后端开发一个应用程序或 Web API&#x…...
数据驱动制造:EMQX ECP 指标监测功能增强生产透明度
迈向未来的工业生产,需要的不仅是自动化,更是智能化。如果工业企业的管理者能够实时监测每一生产环节的设备运行状态,每一数据点位情况,洞察和优化每一步生产流程,他们将能够做出更精准的决策,提高生产效率…...
一行代码实现鼠标横向滚动
🧑💻 写在开头 点赞 收藏 学会🤣🤣🤣 在项目中我们可能会遇到当鼠标在某个区域内,我们希望滚动鼠标里面的内容可以横向滚动; 比如我们一些常见的后台状态栏: 那这种该怎么写&…...
Flink集群架构
在上一章节我们对flink有了一个基本的了解。从它的应用的场景以及它的一些基本的一些核心的一些概念。从本章节开始,我们对flink从它的一个集群的一个架构以及它的一个部署模式着手,去了解flink如何去部署在不同的这样的一个集群的一些资源管理器上面&am…...
计算机网络(6) UDP协议
一.UDP数据报格式 UDP(User Datagram Protocol,用户数据报协议)是一种简单的传输层协议,与TCP(Transmission Control Protocol,传输控制协议)相比,UDP提供一种无连接、不可靠的数据传…...
单片机(STM32)与上位机传输浮点数
目录 单片机(STM32)与上位机传输数据的方法1. 传输整形数据2. 传输浮点数据3. 如何打包与解包 单片机(STM32)与上位机传输数据的方法 在进行单片机程序的开发时,常常需要与其他设备进行通信。一种情况是与其他电路板通信,比如STM32主机与STM32从机通信&…...
50etf期权交易规则杠杆怎么计算?
今天带你了解50etf期权交易规则杠杆怎么计算?近年来,期权交易在股票市场中变得愈发流行,其中50ETF期权备受关注。作为一种金融衍生品,50ETF期权为投资者提供了更灵活的投资方式和更多的策略选择。 50etf期权交易规则杠杆怎么计算&…...
鸿蒙: 基础认证
先贴鸿蒙认证 官网10个类别总结如下 https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 10节课学习完考试 考试 90分合格 3次机会 1个小时 不能切屏 运行hello world hvigorfile.ts是工程级编译构建任务脚本 build-profile.json5是工程…...
2024年最佳插电式混合动力电动汽车
对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车,他们可以找到一个折衷方案,即插电式混合动力车。 在过去的16年里,我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车,跟踪汽车行业的新闻…...
上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源
上海交通大学 Linux 用户组发布公告: 即时起中止对 Docker Hub 仓库的镜像。Docker 相关工具默认会自动处理失效镜像的回退,如果对官方源有访问困难问题,建议尝试使用其他仍在服务的镜像源。 源加速地址 有网友表示百度的 Docker Hub 加速器…...
【Linux】shell——条件判断test,各种运算符,expr
条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与,前面为真后面才会执行 || -->逻辑或,前面为假后面才…...
中介子方程二十二
X$XFX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$…...
你还不会选ProfiNET和EtherCAT网线?
在现代工业自动化领域,ProfiNET和EtherCAT是两种非常流行的通信协议。选择合适的网线对于确保通信的稳定性和效率至关重要。 ProfiNET是什么? ProfiNET是一种基于以太网的通信协议,由德国西门子公司开发。它支持实时通信,广泛应用…...
醉美酒话:承载着深厚文化底蕴的敬酒词
这些敬酒词凝聚了中华酒文化的精髓,每一句都体现了对美好愿景的深深祝愿,同时也展示了中文语言的丰富与魅力。 一、“步步高升”酒: 第一杯,酒至三分,象征着龙洒点滴、财运将至。我衷心祝愿您财富如江水般滚滚而来&a…...
vue3-sfc-loader动态加载一个异步vue组件生成cesium画面
在 Vue.js 3 中,使用 vue3-sfc-loader 可以动态加载异步的 Vue 单文件组件(.vue 文件)。这个工具允许你在运行时根据需要加载和解析 .vue 文件,使得组件的加载变得更加灵活和动态。 下面是一个简单的示例,演示如何使用…...
flink学习-状态管理
状态管理 在flink中,算子可以分为无状态和有状态两种情况。 无状态的算子只需要观察每个独立事件,根据当前输入的数据直接输出结果。像:filter、flatMap、map都属于无状态的算子。 有状态的算子则是除当前数据之外,还需要一些其他…...
OpenCV图像算术位运算
一 图像相加 import cv2 import numpy as npgirlcv2.imread(./2037548.jpg)#图像的加法运算就是矩阵的加法运算 #因此加法运算的两张图必须是相等的print(girl.shape)imgnp.ones((1920,1080,3),np.uint8)*50 cv2.imshow(girl,girl) resultcv2.add(girl,img) cv2.imshow(result…...
【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】
调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统:Windows 10 专业版调试环境调试目标 二、调…...
ssm宠物网站系统-计算机毕业设计源码07183
摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布,为此,本人开发了一个基于B/S(浏览器/服务器)模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…...
Go语言极简Web框架Meridian:依赖注入与清晰架构实践
1. 项目概述:一个“极简”的现代Web应用框架最近在GitHub上闲逛,又看到了一个名为rynfar/meridian的项目。点进去一看,简介写着“A modern web framework for building APIs and web applications in Go”。说实话,现在Go语言的We…...
Cursor AI 编程助手配置优化:一键安装与自定义指南
1. 项目概述:为什么需要一套现成的 Cursor 配置?如果你和我一样,是 Cursor 的重度用户,那么你肯定经历过这样的阶段:刚上手时,觉得这个 AI 驱动的 IDE 简直是神器,但随着项目越来越复杂…...
量子机器学习在网络安全中的应用与性能分析
1. 量子机器学习在网络安全中的应用现状量子机器学习(Quantum Machine Learning, QML)近年来在网络安全领域引起了广泛关注。作为一名长期从事网络安全与量子计算交叉研究的从业者,我见证了这项技术从理论探讨到实际验证的发展历程。量子计算…...
KMS_VL_ALL_AIO架构解析:Windows与Office智能激活的技术方案
KMS_VL_ALL_AIO架构解析:Windows与Office智能激活的技术方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款基于KMS协议实现的Windows和Office智能激活解决方案…...
CQDs-PEG/Biotin/@SiO2/Polymer,PEG修饰碳量子点的特性
中英文名称: CQDs-PEG,PEG修饰碳量子点 CQDs-Biotin,生物素偶联碳量子点 CQDsSiO2,二氧化硅包覆碳量子点 CQDsPolymer,聚合物包覆碳量子点 碳量子点(Carbon Quantum Dots, CQDs)作为一类新型零维…...
Adams驱动函数里那个神秘的‘d’到底怎么用?手把手教你避开单位换算的坑
Adams驱动函数中‘d’符号的终极指南:从原理到实战避坑 刚接触Adams的工程师们,你们是否曾在深夜盯着屏幕上那个诡异的机械臂运动轨迹百思不得其解?明明输入的是90度,为什么模型转得像陀螺一样疯狂?这一切的罪魁祸首很…...
告别理论!在Spartan-6上玩转DDR3:从MIG IP核配置到UCF约束文件修改的完整避坑指南
Spartan-6 FPGA DDR3实战:从MIG配置到硬件调试的全链路解析 当你在ISE中点击"Generate"按钮完成MIG IP核配置时,真正的挑战才刚刚开始。这份指南将带你穿越从IP核生成到稳定运行的完整链路,特别聚焦那些官方文档语焉不详、网络教程…...
突破音频平台限制:基于Go+Qt5的喜马拉雅下载器技术解析
突破音频平台限制:基于GoQt5的喜马拉雅下载器技术解析 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 在数字化学习与娱…...
Midjourney Anthotype印相工作流全拆解(含v6.1专属--style raw+自定义光照映射公式)
更多请点击: https://intelliparadigm.com 第一章:Anthotype印相工艺的历史溯源与数字转译本质 Anthotype(植物感光印相)是一种诞生于1839年的前摄影术实践,由英国科学家Sir John Herschel首次系统记录。它利用植物汁…...
电子设备散热风扇控制技术详解与应用
1. 电子设备散热风扇控制技术概述现代电子设备正朝着小型化、高性能方向发展,随之而来的散热问题日益突出。以笔记本电脑为例,其厚度从十年前的30mm缩减到如今的15mm以下,但CPU功耗却从15W提升到45W甚至更高。这种"体积缩小、功耗增加&q…...
