JAVA SDK通过proxy对接google: GCS/FCM

前言:因为国内调用google相关api需要通过代理访问(不想设置全局代理),所以在代理这里经常遇到问题,先说一下结论 GCS 需要设置全局代理或自定义代理选择器, FCM sdk admin 在初始化firebaseApp时是支持设置的。

GCS: 开始时尝试在使用sdk时传入代理的配置,但没有实际效果。

参考如下资料:

https://stackoverflow.com/questions/49980303/how-to-set-proxy-for-storage-service-in-gcp-using-java

最终选择如下资料中的方案使用自定义代理选择器解决了问题:

Java Networking and Proxies

@Slf4j
public class CustomProxySelector extends ProxySelector {private final ProxySelector defaultSelector;private final Proxy proxy;private final Set<String> targetDomains;public CustomProxySelector(ProxySelector defaultSelector, Proxy proxy, Set<String> targetDomains) {this.defaultSelector = defaultSelector;this.proxy = proxy;this.targetDomains = targetDomains;}// 根据 URL 选择代理@Overridepublic List<Proxy> select(URI uri) {if (uri != null && uri.getHost() != null) {log.info("uri:{}", uri.getHost());for (String domain : targetDomains) {if (uri.getHost().endsWith(domain)) {log.info("uri google:{} proxy:{}", uri.getHost(), proxy.toString());return List.of(proxy);}}}return defaultSelector.select(uri);}@Overridepublic void connectFailed(URI uri, SocketAddress sa, IOException ioe) {defaultSelector.connectFailed(uri, sa, ioe);}}@Slf4j
@Component
public class ProxyConfigurer {@Value("${gateway.google.map-proxy.enable:false}")private boolean proxyEnabled;@Value("${gateway.google.map-proxy.host:}")private String proxyHost;@Value("${gateway.google.map-proxy.port:}")private int proxyPort;@PostConstructpublic void configureProxy() {if (!proxyEnabled) {return;}log.info("proxyHost:{} port:{}", proxyHost, proxyPort);ProxySelector defaultSelector = ProxySelector.getDefault();Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));Set<String> targetDomains = new HashSet<>(List.of(".googleapis.com"));CustomProxySelector customSelector = new CustomProxySelector(defaultSelector, proxy, targetDomains);ProxySelector.setDefault(customSelector);log.info("Proxy selector configured successfully.");}}

FCM:

这个因为是后面我才开始对接我直接就选择了代理选择器方式发现本地好用,但服务器上就不好用,报错如下:

Caused by: java.io.IOException: Unknown exception in request
    at com.google.firebase.internal.ApacheHttp2Request.execute(ApacheHttp2Request.java:134)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)
    at com.google.firebase.internal.ErrorHandlingHttpClient.send(ErrorHandlingHttpClient.java:97)
    ... 38 more
Caused by: java.util.concurrent.ExecutionException: java.net.SocketException: Network is unreachable
    at org.apache.hc.core5.concurrent.BasicFuture.getResult(BasicFuture.java:72)
    at org.apache.hc.core5.concurrent.BasicFuture.get(BasicFuture.java:85)
    at com.google.firebase.internal.ApacheHttp2Request.execute(ApacheHttp2Request.java:123)
    ... 40 more
Caused by: java.net.SocketException: Network is unreachable

开始怀疑是proxy有问题,这时候一般选择用curl测试proxy是否连通

curl -I --proxy xxx:3128 "https://oauth2.googleapis.com/token"

返回404 代表网络上是通的,后来查询文档Firebase: Accessing Firestore and Firebase through a proxy server | by Hiranya Jayathilaka | FAUN — Developer Community 🐾

其实SDK是支持动态设置的,但文档中与我的实现有出入所以参照源码加了一个动态的令牌鉴权改造代码如下:

@PostConstructprivate void initializeFirebase() {try {InputStream inputStream = fileServiceUtil.downloadFile(fcmPath);if (inputStream == null) {log.error("fcm file download fail");throw new GeneraliPluginException("fcm file download fail");}InetSocketAddress address = new InetSocketAddress(proxyHost, proxyPort);final HttpTransport transport = new NetHttpTransport.Builder().setProxy(new Proxy(Proxy.Type.HTTP, address)).build();HttpTransportFactory transportFactory = () -> transport;FirebaseOptions options =FirebaseOptions.builder().setCredentials(GoogleCredentials.fromStream(inputStream, transportFactory)).setHttpTransport(transport).build();FirebaseApp.initializeApp(options);} catch (IOException e) {Log.error("PushNotificationServiceAndroidImpl.initializeFirebase", e);}}

解决问题。 

思考:还是要以官网文档和各种社区讨论来编写代码,经常查询各种社区是非常有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NLP】24. spaCy 教程:自然语言处理核心操作指南(进阶)

spaCy 中文教程&#xff1a;自然语言处理核心操作指南&#xff08;进阶&#xff09; 1. 识别文本中带有“百分号”的数字 import spacy# 创建一个空的英文语言模型 nlp spacy.blank("en")# 处理输入文本 doc nlp("In 1990, more than 60% of people in East…

关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android

我下载了它资料中的开源Android13 系统SDK&#xff0c; 这个SDK连个git 都没有&#xff0c;把这种代码释放能称为开源吗&#xff1f;&#xff1f; 并且也就是说你买了这个板子&#xff0c;里面是没有任何关于RK3588的开发文档&#xff0c;如果你没玩过其他RK平台&#xff0c;估…

WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点

文章目录 适合场景基本语法示例&#xff1a;Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal&#xff1f;TypeScript 中 Portal 类型定义&#xff1f; 适合场景 React Portal 是 React 提供的一种机制&#xff0c;让你可以将子组件渲染到 DOM 的指定…

数据结构---跳表

目录 一、跳表的概念 为什么要使用随机值来确定层高 二、跳表的分析 &#xff08;1&#xff09;查找过程 &#xff08;2&#xff09;性能分析 三、跳表的实现 四、与红黑树哈希表的对比 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c…

PCDN通过个人路由器,用更靠近用户的节点来分发内容,从而达到更快地网络反应速度

PCDN&#xff08;P2P CDN&#xff09;的核心思想正是利用个人路由器、家庭宽带设备等分布式边缘节点&#xff0c;通过就近分发内容来降低延迟、提升网络响应速度&#xff0c;同时降低传统CDN的带宽成本。以下是其技术原理和优势的详细分析&#xff1a; 1. 为什么PCDN能更快&…

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 详解 1. HttpServletRequest&#xff08;HTTP 请求对象&#xff09; HttpServletRequest 是 Java Servlet API 提供的接口&#xff0c;用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest&#xff0c;并增加了 HTTP 协议相…

HAL TIM PWM产生 蓝桥杯

目录 0.原理 0.1 CNT和CCR关系 0.2 PWM模式1模式2 1. cubemx配置 需求(将PA1输出1Khz的 50&#xff05;占空比的方波) 1.0 PWM的频率计算: 2.代码 0.原理 0.1 CNT和CCR关系 CNT计数器和CCR比较器进行比较,如果是向上计数,CNT逐渐增加,CCR是虚线位置,也是用户自定义的…

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是&#xff0c;你可以在命令行中从任何位置直…

CMD命令行笔记

CMD命令行笔记&#xff0c;涵盖常用命令及实用技巧&#xff0c;适合快速查阅&#xff1a; 一、基础操作 打开CMD Win R → 输入 cmd → 回车管理员模式&#xff1a;右键开始菜单 → 选择“命令提示符&#xff08;管理员&#xff09;” 常用命令 help&#xff1a;查看所有命令…

android中dp和px的关系

关于android的dp和px的关系是我刚开始学习android的第一个知识点&#xff0c;不知不觉学安卓也有一年了&#xff0c;但是偶然间我发现我理解的dp和px的关系一直是错的&#xff0c;真的是有一点搞笑&#xff0c;今天特意写一篇博客纪念一下这个我理解错一年的知识点。 dp和px之间…

(四)机器学习---逻辑回归及其Python实现

之前我们提到了常见的任务和算法&#xff0c;本篇我们使用逻辑回归来进行分类 分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高…

【汽车产品开发项目管理——端到端的汽车产品诞生流程】

MPU&#xff1a;集成运算器、寄存器和控制器的中央处理器芯片 MCU&#xff1a;微控制单元&#xff0c;将中央处理器CPU、存储器ROM/RAM、计数器、IO接口及多种外设模块集成在单一芯片上的微型计算机系统。 汽车产品开发项目属性&#xff1a;临时性、独特性、渐进明细性、以目标…

Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组------元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的&#xff0c;这对处理网站的用户列表或游戏中的角色列表至关重要。然而&#xff0c;有时候你需要创建一系列不可修改的元素&#xff0c;元组可以满足这种需求。Python将不能修改的值称为不可变的&#xf…

智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南

本文面向医院信息化团队技术负责人及医疗IoT解决方案开发者&#xff0c;聚焦解决大规模院区导航系统的扩展性、多源数据融合及实时路径规划等技术难点&#xff0c;提供从架构到落地的完整技术路线图。 如需获取智慧医院导航导诊系统解决方案请前往文章最下方获取&#xff0c;如…

医药采购系统平台第4天03:实现根据用户的角色显示不同用户的权限菜单编写拦截器实现权限拦截模块的开发流程和测试流程小节

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!! 四 权限管理(用户授权)的应用:根据用户的角色显示不同用户的权限菜单 经过上面的与第三方系统的成功的接入,而且在“角色管理”菜单中也对需要授权的角色进行了授权--->给一级…

#2 物联网组成要素

从下至上&#xff0c;则包括了5个要素&#xff0c;包括 设备 / 传感器 / 网络 / 物联网服务 / 数据分析 这五个要素。为了便于理解&#xff0c;我们用思维导图展示 物联网构成架构 设备 能够感测和反馈并连到网络进行物联网服务的装置 传感器 传感器和网关的融合实现了物…

< 自用文 Project-30.6 Crawl4AI > 为AI模型优化的网络爬虫工具 帮助收集和处理网络数据的工具

官方链接&#xff1a; Github &#xff1a;https://github.com/unclecode/crawl4ai 文档主页&#xff1a;https://docs.crawl4ai.com/ 当前版本&#xff1a;Crawl4AI v0.5.0 主要新功能&#xff1a; 可配置策略&#xff08;广度优先、深度优先、最佳优先&#xff09;探索整…

【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为

1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明&#xff1a; retention…