尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Envoy Mobile Hello World 示例全解析:Java / Kotlin / Objective-C / Swift 四语言上手指南
Envoy Mobile Hello World 示例全解析Java / Kotlin / Objective-C / Swift 四语言上手指南【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoyEnvoy 不仅是服务端的高性能边车代理它还被编译成移动端库Envoy Mobile直接嵌入 Android 与 iOS 应用让 App 内的网络请求统一流经 Envoy 的 HTTP 引擎。本文围绕 mobile/docs/root/start/examples/hello_world.rst 这一官方入门文档展开从四个 hello world 示例工程入手逐步讲解如何在 Android 模拟器与 iOS 模拟器上构建、安装、运行示例并深入源码剖析示例背后的Engine、StreamClient、PulseClient等核心 API让读者既看得懂怎么跑也看得懂为什么这么写。示例概览1 秒定时器驱动的请求列表hello_world.rst中描述的示例工程其核心行为完全一致启动 Envoy Mobile 引擎后用一个 1 秒定时器周期性地发起网络请求并把每次请求的响应状态码与关键响应头以列表形式展示在界面上。四个示例覆盖了移动端主流的四种开发语言JavaAndroid 平台工程位于 mobile/examples/java/hello_worldKotlinAndroid 平台工程位于 mobile/examples/kotlin/hello_worldObjective-CiOS 平台工程位于 mobile/examples/objective-c/hello_worldSwiftiOS 平台工程位于 mobile/examples/swift/hello_world。从仓库目录结构看四个示例工程同属 mobile/examples 下另有 C 与 Python 的fetch_client示例它们共享同一套响应展示逻辑Android 侧复用了 mobile/examples/kotlin/shared 中的共享 UI 组件iOS 侧则各自实现了简单的UITableView渲染。前置准备构建移动端产物在运行任何示例之前都需要先构建 Envoy Mobile 的发行产物。根据平台不同分为两个目标Android 需要android_aar产物它是一个 AARAndroid Archive封装了 Envoy 的 native 引擎与 Java/Kotlin API供android_binary依赖iOS 需要ios_framework产物它是一个动态框架封装了 Envoy 的 native 引擎与 Objective-C/Swift API供 iOS App 链接。在示例工程的 BUILD 文件中可以看到这一依赖关系。以 mobile/examples/java/hello_world/BUILD 为例hello_envoy_java_lib直接依赖了//:envoy_mobile_android即仓库根 BUILD 暴露的移动端 Android 产物以及共享库//examples/kotlin/shared:hello_envoy_shared_lib。Kotlin 示例的 mobile/examples/kotlin/hello_world/BUILD 结构相同。构建好对应产物后再启动一个模拟器即可进入各语言的运行步骤。Java 示例Android 上的 Hello Envoy运行步骤按官方文档的指引Java 示例分三步走构建android_aar产物确保有一个正在运行的 Android 模拟器使用 Bazel 的mobile-install规则将示例 App 装入模拟器bazel mobile-install //examples/java/hello_world:hello_envoy --fat_apk_cpuarch1,arch2--fat_apk_cpu用于指定目标 CPU 架构可传一个或多个如arm64-v8a,x86_64使 APK 同时包含多种 ABI 的 native 库。安装成功后模拟器上会出现名为Hello Envoy的 App打开即可看到请求源源不断地产生。除了上述命令仓库还提供了两个辅助脚本在mobile目录下依次执行即可完成起模拟器 装 App$ examples/java/hello_world/start_emulator.sh # 等待模拟器完全启动 $ examples/java/hello_world/start_app.sh其中 start_emulator.sh 会通过sdkmanager安装 Android 30 (API 30) 的 Google APIs x86_64 系统镜像、用avdmanager创建名为test_android_emulator的 Pixel 4 模拟器并启动它start_app.sh 则执行bazel build --configmobile-android-release //examples/java/hello_world:hello_envoy再通过adb install安装 APK最后用adb shell am start直接拉起MainActivity。注意这两个脚本都要求设置ANDROID_HOME环境变量。源码剖析引擎、请求循环与统计上报Java 示例的主逻辑位于 mobile/examples/java/hello_world/MainActivity.java。它演示了 Envoy Mobile 三个核心 API 的典型用法1. 构建引擎Engine。AndroidEngineBuilder链式配置并build()出一个全局Engine实例示例中开启了平台证书校验、将日志级别设为DEBUG、注册了日志回调与引擎异步初始化完成回调engine new AndroidEngineBuilder(getApplication()) .setUseV2NetworkMonitor(true) .setUseQuicPlatformPacketWriter(true) .setLogLevel(LogLevel.DEBUG) .setLogger((level, message) - { Log.d(TAG, message); return null; }) .setOnEngineRunning(() - { Log.d(TAG, Envoy async internal setup completed); return null; }) .enablePlatformCertificatesValidation(true) .build();2. 1 秒请求循环。代码启动了一个专用的HandlerThread并postDelayed一个Runnable在makeRequest()与recordStats()之后再次以 1 秒为周期重排自身形成持续请求handler.postDelayed(new Runnable() { public void run() { makeRequest(); recordStats(); handler.postDelayed(this, TimeUnit.SECONDS.toMillis(1)); } }, TimeUnit.SECONDS.toMillis(1));makeRequest()通过engine.streamClient().newStreamPrototype()创建流注册setOnResponseHeaders与setOnError回调后sendHeaders发起 GET 请求。示例请求的目标是api.lyft.com/ping并且刻意在明文 HTTP 与 HTTPS 之间交替切换服务器对 HTTP 请求返回 301、对 HTTPS 请求返回 200示例据此判断成功与否同时展示 Envoy 对 http/1.1明文与 h2TLS两条链路的处理能力——这一点在注释中明确说明是为了在 CI 端到端测试中同时覆盖两条路径。3. 统计上报Pulse。recordStats()演示了engine.pulseClient()的计数器用法按foo.bar.counter三个Element维度定位一个计数器先自增 1 再自增 5final Counter counter engine.pulseClient().counter( new Element(foo), new Element(bar), new Element(counter)); counter.increment(1); counter.increment(5);请求与统计结果通过ResponseRecyclerViewAdapter更新到RecyclerView列表。值得一提的细节是Java 示例只注册了流回调而 Kotlin/Swift 示例还额外注册了多个平台过滤器platform filter与 native 过滤器来演示 Envoy Mobile 的过滤器链能力这正体现了四个示例同骨架、各侧重的设计。Kotlin 示例Android 上的过滤器链演示运行步骤Kotlin 示例的运行方式与 Java 完全一致只是 Bazel 目标名不同bazel mobile-install //examples/kotlin/hello_world:hello_envoy_kt --fat_apk_cpuarch1,arch2安装成功后模拟器上的 App 名为Hello Envoy Kotlin。同样在mobile目录下可借助 mobile/examples/kotlin/hello_world/start_emulator.sh 与 mobile/examples/kotlin/hello_world/start_app.sh 完成一键起模拟器与安装。源码剖析平台过滤器与原生过滤器Kotlin 示例的主逻辑位于 mobile/examples/kotlin/hello_world/MainActivity.kt。它的Engine配置比 Java 版丰富得多集中展示了 Envoy Mobile 的过滤器链filter chainengine AndroidEngineBuilder(application) .setLogLevel(LogLevel.DEBUG) .setLogger { _, msg - Log.d(TAG, msg) } .enableProxying(true) .addPlatformFilter(::DemoFilter) .addPlatformFilter(::BufferDemoFilter) .addPlatformFilter(::AsyncDemoFilter) .addNativeFilter( envoy.filters.http.buffer, Any.newBuilder() .setTypeUrl(type.googleapis.com/envoy.extensions.filters.http.buffer.v3.Buffer) .setValue(ByteString.empty()) .build() .toByteArray() .toString(Charsets.UTF_8) ) .addStringAccessor(demo-accessor, { PlatformString }) .setOnEngineRunning { Log.d(TAG, Envoy async internal setup completed) } .setEventTracker({ for (entry in it.entries) { Log.d(TAG, Event emitted: ${entry.key}, ${entry.value}) } }) .build()这里的三个平台过滤器DemoFilter、BufferDemoFilter、AsyncDemoFilter分别在工程目录下独立成文件用于演示同步改写响应头、缓冲响应体、异步处理等典型场景addNativeFilter则把服务端 Envoy 的 HTTP buffer 过滤器envoy.filters.http.buffer以原生方式挂进链中。请求流程与 Java 版一致1 秒定时器驱动makeRequest()与recordStats()请求目标是api.lyft.com/ping固定 HTTPS因此上游走 h2响应状态码为 200 即视为成功。相比 Java 版Kotlin 版还会在日志中打印filter-demo响应头直观展示过滤器链的效果。Objective-C 示例iOS 上的 Hello Envoy运行步骤iOS 侧不需要模拟器预启动Bazel 会直接拉起模拟器并运行 Appbazel run //examples/objective-c/hello_world:app --configios命令执行后会自动启动一个 iOS 模拟器并打开新 App随后就能看到请求开始流动。示例源码位于 mobile/examples/objective-c/hello_world。源码剖析Builder 配置与 NSTimer 循环Objective-C 示例的主逻辑位于 mobile/examples/objective-c/hello_world/ViewController.m。它的EngineBuilder配置展示了 iOS 平台特有的能力包括 DNS 缓存与键值存储EngineBuilder *builder [[EngineBuilder alloc] init]; [builder setLogLevel:LogLevelDebug]; [builder enableDNSCache:YES saveInterval:1]; [builder addKeyValueStoreWithName:reserved.platform_store keyValueStore:NSUserDefaults.standardUserDefaults]; [builder setOnEngineRunningWithClosure:^{ NSLog(Envoy async internal setup completed); }]; idEngine engine [builder build];随后用NSTimer每 1 秒触发一次timerFired其中依次调用performRequest与recordStats。请求通过RequestHeadersBuilder构造经[engine streamClient]创建StreamPrototype、注册响应头/错误回调、startWithQueue:后在主队列上sendHeaders发出。示例请求目标是localhost:10000/ping明文 HTTP上游走 http/1.1与 Swift 示例的 HTTPS/h2 形成对照——正如注释所言这种差异是为了在 CI 端到端测试中同时验证两条路径。统计部分通过[self.pulseClient counterWithElements:]创建计数器并incrementWithCount:累加。列表渲染上成功条目以白底黑字展示消息与响应头失败条目以红底白字展示错误信息。Swift 示例SwiftUI 时代前的经典 UITableView 版本运行步骤Swift 示例的运行命令与 Objective-C 完全相同只是目标工程不同bazel run //examples/swift/hello_world:app --configios执行后同样会启动模拟器并打开 App请求随即开始流动。示例源码位于 mobile/examples/swift/hello_world。仓库中还包含一个基于 Swift Package Manager 的变体 mobile/examples/swift/swiftpm含Package.swift与EnvoySwiftPMExample适合不通过 Bazel 集成的工程参考。源码剖析Swift 版 Engine 配置Swift 示例的主逻辑位于 mobile/examples/swift/hello_world/ViewController.swift。它的引擎配置在 Kotlin 版基础上换用了 Swift 语法同样演示了平台过滤器、原生过滤器与事件追踪let engine EngineBuilder() .setLogLevel(.debug) .addPlatformFilter(DemoFilter.init) .addPlatformFilter(BufferDemoFilter.init) .addPlatformFilter(AsyncDemoFilter.init) .respectSystemProxySettings(true) .addNativeFilter( name: envoy.filters.http.buffer, typedConfig: [type.googleapis.com/envoy.extensions.filters.http.buffer.v3.Buffer] { max_request_bytes: { value: 5242880 } } ) .setOnEngineRunning { NSLog(Envoy async internal setup completed) } .addStringAccessor(name: demo-accessor, accessor: { return PlatformString }) .setEventTracker { NSLog(Envoy event emitted: \($0)) } .build()请求循环改用Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true)每次触发performRequest()与recordStats()。请求目标是localhost:10000/pingHTTPS上游走 h2 over TLS响应头过滤集合中额外包含async-filter-demo与异步平台过滤器的演示相对应。sendHeaders(_:endStream:)发起请求后成功/失败结果插入列表头部并刷新UITableView。四个示例的异同对照维度JavaKotlinObjective-CSwift平台AndroidAndroidiOSiOSBazel 目标//examples/java/hello_world:hello_envoy//examples/kotlin/hello_world:hello_envoy_kt//examples/objective-c/hello_world:app//examples/swift/hello_world:app运行命令bazel mobile-install ... --fat_apk_cpuarch1,arch2同左bazel run ... --configios同左App 名称Hello EnvoyHello Envoy Kotlin——请求目标api.lyft.com/pingapi.lyft.com/pinglocalhost:10000/pinglocalhost:10000/ping请求协议HTTP/HTTPS 交替http/1.1 与 h2HTTPSh2HTTPhttp/1.1HTTPSh2 over TLS过滤器链演示无仅流回调3 个平台过滤器 1 个原生过滤器无3 个平台过滤器 1 个原生过滤器统计上报pulseClient计数器pulseClient计数器pulseClient计数器pulseClient计数器从源码看四个示例刻意保持了协议路径的互补Java 与 Objective-C 走明文 HTTPhttp/1.1Kotlin 与 Swift 走 TLSh2这样 CI 的端到端测试可同时覆盖 Envoy Mobile 的两种主要上游协议路径。从示例到生产Envoy Mobile 的核心心智模型透过四个 hello world 示例可以提炼出 Envoy Mobile 的固定使用模式这也是迁移到真实项目时的骨架引擎生命周期Engine是全局单例式的对象通过 Builder 一次性配置日志、证书校验、过滤器、回调生命周期与 App 对齐流式请求 APIstreamClient().newStreamPrototype()返回可复用的流模板注册setOnResponseHeaders/setOnError回调后start并sendHeaders天然支持非阻塞异步模型过滤器链平台过滤器addPlatformFilterKotlin/Swift 编写与原生过滤器addNativeFilter复用服务端 Envoy 的 C 过滤器可叠加组合实现请求/响应改写统计与可观测性pulseClient提供基于Element维度的计数器等指标接口setEventTracker可把引擎内部事件上报到自有埋点体系辅助工具仓库中的start_emulator.sh/start_app.sh脚本Java/Kotlin 工程内封装了创建模拟器 → 构建 → 安装 → 启动的完整链路可作为 CI 或本地开发脚本的参考模板。总结hello_world.rst篇幅虽短但它是进入 Envoy Mobile 世界的第一个入口四条命令、四个 App、四组最小可运行的代码串起了引擎构建、定时请求、流式回调与统计上报这条完整的主线。配合 mobile/examples 下的真实源码逐行研读即可快速建立起对 Envoy Mobile 编程模型的认识为后续接入真实业务请求、自定义过滤器与埋点体系打下基础。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

PTA天梯赛L3-027:Java与C++的算法复杂度优化实战

PTA天梯赛L3-027:Java与C++的算法复杂度优化实战

1. 题目背景与竞赛解析 PTA团体程序设计天梯赛是国内高校程序设计领域的重量级赛事,由全国高等学校计算机教育研究会主办。比赛分为"珠峰争鼎"、"华山论剑"、"沧海竞舟"三个组别,分别对应不同难度层级。L3级别的题目属于竞…

📅 2026/9/14 16:23:03
从 20GB 重复文件到只剩一份:Czkawka 磁盘清理与重复文件查找实测

从 20GB 重复文件到只剩一份:Czkawka 磁盘清理与重复文件查找实测

从 20GB 重复文件到只剩一份:Czkawka 磁盘清理与重复文件查找实测 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 你往 Downloads 里翻…

📅 2026/9/14 16:23:03
LangChain SequentialChain构建智能意图识别系统

LangChain SequentialChain构建智能意图识别系统

1. 项目概述:SequentialChain构建智能意图识别系统 在AI Agent开发领域,LangChain作为当前最流行的开发框架之一,其SequentialChain功能模块为构建复杂任务处理流程提供了标准化解决方案。本次要实现的智能意图识别系统,正是利用S…

📅 2026/9/14 16:23:03
MORE NEWS

更多资讯

📰

Envoy Mobile Hello World 示例全解析:Java / Kotlin / Objective-C / Swift 四语言上手指南

Envoy Mobile Hello World 示例全解析:Java / Kotlin / Objective-C / Swift 四语言上手指南 【免费下载链接】envoy Cloud-native high-performance edge/middle/service proxy 项目地址: https://gitcode.com/GitHub_Trending/en/envoy Envoy 不仅是服务端…

📰

PTA天梯赛L3-027:Java与C++的算法复杂度优化实战

1. 题目背景与竞赛解析 PTA团体程序设计天梯赛是国内高校程序设计领域的重量级赛事,由全国高等学校计算机教育研究会主办。比赛分为"珠峰争鼎"、"华山论剑"、"沧海竞舟"三个组别,分别对应不同难度层级。L3级别的题目属于竞…

📰

从 20GB 重复文件到只剩一份:Czkawka 磁盘清理与重复文件查找实测

从 20GB 重复文件到只剩一份:Czkawka 磁盘清理与重复文件查找实测 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 你往 Downloads 里翻…

📰

LangChain SequentialChain构建智能意图识别系统

1. 项目概述:SequentialChain构建智能意图识别系统 在AI Agent开发领域,LangChain作为当前最流行的开发框架之一,其SequentialChain功能模块为构建复杂任务处理流程提供了标准化解决方案。本次要实现的智能意图识别系统,正是利用S…

📰

Telegraf DiskIO 输入插件完全指南:磁盘 I/O 流量与延迟指标采集

Telegraf DiskIO 输入插件完全指南:磁盘 I/O 流量与延迟指标采集 【免费下载链接】telegraf Agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. 项目地址: https://gitcode.com/GitHub_Trending/te/telegraf…

📰

Hindsight MCP Server 深度解析:每银行隔离端点、双模式路由与 Agent 记忆工具集

Hindsight MCP Server 深度解析:每银行隔离端点、双模式路由与 Agent 记忆工具集 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight(Agent Memory…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬