golang工程— grpc-gateway健康检查和跨域配置
grpc健康检查网关跨域配置
grpc健康检查
grpc健康检查使用
服务端配置
import ("google.golang.org/grpc/health""google.golang.org/grpc/health/grpc_health_v1"
)//添加健康检查服务,多路复用
grpc_health_v1.RegisterHealthServer(s, health.NewServer())
网关配置
gateway.go
package gatewayimport ("context""flag""fmt""google.golang.org/grpc/health/grpc_health_v1""net/http""user/user-server/gateway/middleware""github.com/grpc-ecosystem/grpc-gateway/v2/runtime""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"_ "google.golang.org/grpc/grpclog"gw "user/proto" // Update
)var (// command-line options:// gRPC server endpointgrpcServerEndpoint = flag.String("grpc-server-endpoint", "localhost:50051", "gRPC server endpoint")
)func Run() error {ctx := context.Background()ctx, cancel := context.WithCancel(ctx)defer cancel()// 请求时,将http header中某些字段转发到grpc上下文inComingOpt := runtime.WithIncomingHeaderMatcher(func(s string) (string, bool) {fmt.Println("header:" + s)switch s {case "Service-Authorization":fmt.Println("Service-Authorization hit")return "Service-Authorization", truedefault:return "", false}})// 响应后,grpc上下文转发到http头部outGoingOpt := runtime.WithOutgoingHeaderMatcher(func(s string) (string, bool) {return "", false})//创建连接,用于健康检查conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {return err}// Register gRPC server endpoint// Note: Make sure the gRPC server is running properly and accessible// runtime.WithHealthEndpointAt() 指定路径, 转发Header到grpc上下文在这是不生效的inCommingOpt 是不生效的,因为我们在这弄了个客户端,需要手动转发操作。或者排除掉,我们这选择排除掉mux := runtime.NewServeMux(inComingOpt, outGoingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))//添加文件上传处理函数mux.HandlePath("POST", "/upload", uploadHandler)handler := middleware.Cors(mux)opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}err = gw.RegisterUserHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)if err != nil {return err}// Start HTTP server (and proxy calls to gRPC server endpoint)return http.ListenAndServe(":8081", handler)
}
如果网关中设置了拦截器之类的进行鉴权判断,可以通过FullName="/grpc.health.v1.Health/Check"去忽略鉴权
监控检查默认请求 http://localhost:8081/healthz
grpc网关跨域配置
采用中间件的形式封装httphandler
package middlewareimport "net/http"func Cors(handler http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {method := r.Methodorigin := r.Header.Get("Origin")if origin != "" {// 允许来源配置w.Header().Set("Access-Control-Allow-Origin", "*") // 可将将 * 替换为指定的域名w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE, PATCH")w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")w.Header().Set("Access-Control-Allow-Credentials", "true")}if method == "OPTIONS" {w.WriteHeader(http.StatusNoContent)return}handler.ServeHTTP(w, r)})
}
然后修改gateway
gateway.go
package gatewayimport ("context""flag""fmt""google.golang.org/grpc/health/grpc_health_v1""net/http""user/user-server/gateway/middleware""github.com/grpc-ecosystem/grpc-gateway/v2/runtime""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"_ "google.golang.org/grpc/grpclog"gw "user/proto" // Update
)var (// command-line options:// gRPC server endpointgrpcServerEndpoint = flag.String("grpc-server-endpoint", "localhost:50051", "gRPC server endpoint")
)func Run() error {ctx := context.Background()ctx, cancel := context.WithCancel(ctx)defer cancel()// 请求时,将http header中某些字段转发到grpc上下文inComingOpt := runtime.WithIncomingHeaderMatcher(func(s string) (string, bool) {fmt.Println("header:" + s)switch s {case "Service-Authorization":fmt.Println("Service-Authorization hit")return "Service-Authorization", truedefault:return "", false}})// 响应后,grpc上下文转发到http头部outGoingOpt := runtime.WithOutgoingHeaderMatcher(func(s string) (string, bool) {return "", false})//创建连接,用于健康检查conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {return err}// Register gRPC server endpoint// Note: Make sure the gRPC server is running properly and accessible// runtime.WithHealthEndpointAt() 指定路径, 转发Header到grpc上下文在这是不生效的inCommingOpt 是不生效的,因为我们在这弄了个客户端,需要手动转发操作。或者排除掉,我们这选择排除掉mux := runtime.NewServeMux(inComingOpt, outGoingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))//添加文件上传处理函数mux.HandlePath("POST", "/upload", uploadHandler)handler := middleware.Cors(mux)opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}err = gw.RegisterUserHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)if err != nil {return err}// Start HTTP server (and proxy calls to gRPC server endpoint)return http.ListenAndServe(":8081", handler)
}
更多grpc跨域配置的内容见
[gin中间件编程与跨域配置](
相关文章:
golang工程— grpc-gateway健康检查和跨域配置
grpc健康检查网关跨域配置 grpc健康检查 grpc健康检查使用 服务端配置 import ("google.golang.org/grpc/health""google.golang.org/grpc/health/grpc_health_v1" )//添加健康检查服务,多路复用 grpc_health_v1.RegisterHealthServer(s, health.NewSe…...
怎么样把握单片机的实际应用?说几句大实话
关注我们 你听说小米的大动作了吗? 没错,小米终于揭开了新操作系统的面纱。 小米澎湃OS暨小米14系列新品发布会于10月26日19:00举行,小米14手机系列、小米首款血压手表、小米Watch S3...... 今天主要讲的是自研7年的小米澎湃系统 没…...
PostgreSQL在云端:部署、管理和扩展你的数据库
随着云计算技术的迅猛发展,将数据库迁移到云端已经成为许多企业的首选。而在众多数据库管理系统中,PostgreSQL因其稳定性、灵活性和可扩展性而成为了不少企业的首选之一。 部署PostgreSQL在云端 将PostgreSQL部署在云端是一个相对简单的过程。云服务提供…...
Maven进阶系列-继承和聚合
Maven进阶系列-继承和聚合 文章目录 Maven进阶系列-继承和聚合1. 继承2. 继承的作用2.1 在父工程中配置依赖的统一管理2.2 在父工程中声明自定义属性2.3 父工程中必须要继承的配置 3. 聚合4. 聚合的作用 1. 继承 Maven工程之间存在继承关系,例如工程B继承工程A&…...
Lintcode 3715 · Lowest Common Ancestor V (最小祖先好题)
3715 Lowest Common Ancestor VPRE Algorithms Medium This topic is a pre-release topic. If you encounter any problems, please contact us via “Problem Correction”, and we will upgrade your account to VIP as a thank you. Description Given a binary tree wit…...
SQL LIKE 运算符
SQL LIKE 运算符 在WHERE子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与LIKE运算符一起使用: % - 百分号表示零个,一个或多个字符_ - 下划线表示单个字符 注意: MS Access使用问号(?)而不是…...
AR眼镜定制开发-智能眼镜的主板硬件、软件
AR眼镜定制开发是一项复杂而又重要的工作,它需要准备相关的硬件设备和软件。这些设备包括多个传感器、显示装置和处理器等。传感器用于捕捉用户的动作和环境信息,如摄像头、陀螺仪、加速度计等;显示装置则用于将虚拟信息呈现给用户;处理器用于处理和协调…...
[双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和
[双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和 文章目录 [双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和查找总价格为目标值的两个商品题目分析解题思路代码实现总结 三数之和题目分析解题思路代码实现总结 …...
左移测试,如何确保安全合规还能实现高度自动化?
「云原生安全既是一种全新安全理念,也是实现云战略的前提。 基于蚂蚁集团内部多年实践,云原生PaaS平台SOFAStack发布完整的软件供应链安全产品及解决方案,包括静态代码扫描Pinpoint,软件成分分析SCA,交互式安全测试IA…...
mysql 增删改查基础命令
数据库是企业的重要信息资产,在使用数据库时,要注意(查和增,无所谓,但是删和改,要谨慎! ) 数据库管理系统(DBMS) :实现对数据的有效组织,管理和存取的系统软件 mysgl 数据库是一个系统, 是一个人机系统,硬件, gs,数据库…...
C# 使用 AES 加解密文件
[作者:张赐荣] 对称加密是一种加密技术,它使用相同的密钥来加密和解密数据。换句话说,加密者和解密者需要共享同一个密钥,才能进行通信。 对称加密的优点是速度快,效率高,适合大量数据的加密。对称加密的缺点是密钥的管…...
SSM培训报名管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
一、源码特点 SSM 培训报名管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主 要采用B/S模式开…...
锁表后引发的几种删除方式与不同的扩展
在开发过程可能会遇到一些特殊场景,诸如我想删除某表,但是无法删除,去找原因发现是发生了锁表, 锁表指的是在执行一个事务时,该事务获取了一个锁并保持其锁定状态,直到事务完成或手动释放锁,导…...
20.2 OpenSSL 非对称RSA加解密算法
RSA算法是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用…...
MySQL安装『适用于 CentOS 7』
✨个人主页: 北 海 🎉所属专栏: MySQL 学习 🎃操作环境: CentOS 7.6 腾讯云远程服务器 🎁软件版本: MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…...
国家数据局成立,公共数据如何掘金?
国家数据局揭牌:引领新时代数据要素管理和开发的重大举措 筹建7个多月后,10月25日,国家数据局正式揭牌。根据《党和国家机构改革方案》,国家数据局负责协调推进数据基础制度建设,统筹数据资源整合共享和开发利用&…...
PostgreSQL基于Patroni方案的高可用启动流程分析
什么是Patroni 在很多生产环境中,分布式数据库以高可用性、数据分布性、负载均衡等特性,被用户广泛应用。而作为高可用数据库的解决方案——Patroni,是专门为PostgreSQL数据库设计的,一款以Python语言实现的高可用架构模板。该架…...
opencv+yolov8实现监控画面报警功能
项目背景 最近停在门前的车被人开走了,虽然有监控,但是看监控太麻烦了,于是想着框选一个区域用yolov8直接检测闯入到这个区域的所有目标,这样1ms一帧,很快就可以跑完一天的视频 用到的技术 COpenCVYolov8 OnnxRunt…...
基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号
摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…...
C++递归实现验证⼆叉搜索树
C递归实现验证⼆叉搜索树 文章目录 C递归实现验证⼆叉搜索树题目链接题目描述解题思路C算法代码: 题目链接 98. 验证二叉搜索树 - 力扣(LeetCode) 题目描述 给你⼀个⼆叉树的根节点root,判断其是否是⼀个有效的⼆叉搜索树。 有效⼆…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
