Salesforce 与 Heroku 集成(Salesforce & Heroku Integration)

现代企业用微服务架构拆分系统,Heroku 是运行这些应用的理想场所。本文覆盖 Salesforce 与 Heroku 集成的四大理由(数据复制、数据代理、自定义界面、外部流程)与四种方法:Heroku Connect 同步 Postgres、Salesforce Connect 代理外部数据、REST APIs(OAuth 单用户/命名用户)、Apex callouts 与 outbound messages,助你按场景选对集成方式。...

📅 2026/10/14 ✍️ ponybai 🏷️ salesforce, headless

01 开始了解 Salesforce 与 Heroku 集成(Get Started)

slide_2
slide_3

本单元探讨现代企业为何把系统拆成微服务并在 Heroku 上运行,梳理集成 Salesforce 与 Heroku 的四个理由,并预告后面单元会详细讲解的四种集成方法。

学完本单元,你将能够:

  • 解释集成 Salesforce 与 Heroku 的不同理由;
  • 描述集成 Salesforce 与 Heroku 的方法。

集成 Salesforce 与 Heroku 的原因

slide_4

现代企业系统由许多部分组成,每部分都有不同的接口、服务不同类型的用户,这些接口常从多种数据源汇总数据。微服务架构应运而生,它把系统拆成更易维护、可独立部署的服务,通过端点把不同系统连接起来。Heroku 正是运行这类应用和微服务的理想场所。将 Heroku 上的应用与 Salesforce 集成,通常出于四个原因:

  • 数据复制(Data replication);
  • 数据代理(Data proxies);
  • 自定义用户界面(Custom user interfaces);
  • 外部流程(External processes)。

下面逐一深入讲解。

通过数据复制集成(一):它是什么

slide_5

数据复制就是在 Salesforce 和另一个系统之间复制或同步数据,而不是实时获取。公司用它来做数据仓库,让报表能跨多个数据源做分析;也用它来连接那些需要从 Salesforce 取数、或向 Salesforce 供数的遗留系统。对 Heroku + Salesforce 而言,最常见的用例是:为用开源技术构建的、面向客户的应用提供高吞吐、低延迟的数据。

通过数据复制集成(二):独角兽帽演示

slide_6

举个例子:假设你在卖充气独角兽派对帽。Salesforce 是产品信息(定价、库存)的记录系统,公开网站用 Node.js、Rails、Java 等构建。网站要用这些数据展示库存并提供下单功能。把公开 Web 应用跑在 Heroku 上时,把产品信息复制到 Heroku 的数据存储里,就能以低延迟应对海量请求。反过来也可以:如果公开网站的用户能给产品"点赞",你可以用数据复制把这些点赞数传回 Salesforce 给营销团队用。

通过数据代理集成(一):它是什么

slide_7

数据代理聚合不同的数据存储,但和数据复制不同——数据不会被复制,只在需要时读取。这种方式让数据科学、商业智能、报表和仪表盘工具能跨多个数据存储整理数据,而不必担心数据同步带来的存储和过期问题。你既可以通过数据代理把遗留系统、外部系统的数据提供给 Salesforce,也可以让 Salesforce 把数据提供给其他外部系统。

通过数据代理集成(二):示例

slide_8

举例如下:如果 Salesforce 用户需要运行库存报表,把 Salesforce 里的产品数据与外部系统的仓库数据关联起来,数据代理就能在报表运行时按需从外部系统取数,而无需存储,比 ETL(抽取-转换-加载)这类更慢的方法快得多。反方向同样成立——跑在 Heroku 上的应用可以作为 Salesforce 到另一个系统的数据代理,提供安全和转换层。

通过自定义用户界面集成(一):模式

slide_9

你可以用多种技术为 Salesforce 创建自定义用户界面,比如 Visualforce 和 Lightning Components。当界面用 Java、Node.js、PHP 等开源技术构建时,它们可以跑在 Heroku 上,嵌入 Salesforce UI 或直接对接 Salesforce 数据。有时遗留系统或外部系统已提供用户界面,最简单的集成方式就是把那个界面在 Salesforce UI 里展示出来。

通过自定义用户界面集成(二):示例

slide_10

举个真实场景:你的公司用 Salesforce 做 CRM,收购了另一家用 Java 构建自定义系统的公司。最简单的初步集成方式,就是把这个 Java 系统跑在 Heroku 上、在 Salesforce 里渲染。把它迁到 Heroku 能减轻扩展和运维负担,并统一自定义系统的部署架构。跑在 Heroku 上的独立界面既能作为 Salesforce 的后台扩展,也能作为面向客户的 Web 和移动应用。团队选择开源,有时只是因为它的库、功能或已有开发技能。

通过外部流程集成(一):模式

slide_11

外部流程可以把批处理和事件处理卸载到 Heroku 上的应用。这种方法是否合适,取决于任务类型和工作量。数据科学、机器学习、图像和视频处理、与遗留或外部系统的集成,都可能是把外部流程卸载到 Heroku 的理由。当一个应用只负责一件小事时,它其实就是可以独立部署、不依赖其他系统的微服务。

通过外部流程集成(二):照片缩放演示

slide_12

举个具体例子:一家房地产公司为每套挂牌房源上传照片,这些照片很大,需要缩放以缩短加载时间、降低存储成本。你可以轻松地把这个任务卸载到 Heroku 上的外部流程。每次照片上传到 Salesforce 后,就发给 Heroku 上的应用处理,缩放后的图片再存回 Salesforce。这个应用只负责这一件事,是一个典型的、可独立部署的微服务。

集成方法概览

slide_13

现在你知道了数据复制、数据代理、自定义用户界面、外部流程都是结合 Heroku 和 Salesforce 的好理由。但具体怎么做?有几种方法可用:

  • Heroku Connect
  • Salesforce Connect
  • Salesforce REST APIs
  • Callouts

接下来先做个快速概览,后面每个方法都会有完整单元深入讲解。

Heroku Connect

slide_14

Heroku Connect 同时提供数据复制和数据代理。数据复制把数据在 Salesforce 和一个 Heroku Postgres 数据库之间同步,根据配置可以是单向或双向。Heroku Connect 还通过 OData 协议、借助 Heroku External Objects 为 Salesforce 提供数据代理——它给 Heroku Connect 维护连接的 Postgres 数据库包了一层 OData,让其他 Web 服务能用 RESTful 端点取数。

上图展示了数据从 Salesforce 到中间组件再到 Heroku、并在插入联系人后返回 Salesforce 的流向。用 Heroku Connect 做数据复制的最大好处之一,是 Salesforce 数据子集能被 Heroku 应用快速、简单地访问——你只要照常写标准 SQL 查询,就能获得低延迟、高吞吐的 Salesforce 数据访问。

Salesforce Connect

slide_15

你可以用 Salesforce Connect(旧称 Lightning Connect)作为数据代理,按需把 OData 或其他数据源拉进 Salesforce,数据不会复制到 Salesforce 数据库。你可以在 Heroku 上运行暴露 OData 2.0 的端点,或由外部系统提供。如前所述,Heroku Connect 可以把 Heroku Postgres 数据库暴露成 OData 供 Salesforce Connect 消费。此外,Salesforce Connect 自定义适配器让 Salesforce 能代理任何 Apex 能访问的数据源,包括 REST(XML/JSON)和 SOAP。

上图展示了外部对象如何连接 SAP、Oracle、Workday 或 Heroku 等外部数据。Salesforce Connect 的主要好处是:把外部数据带进 Salesforce UI,让它们看起来就像在 Salesforce 里一样,尽管只是按需从外部数据源代理而来。

Salesforce REST APIs

slide_16

Salesforce REST APIs 通过简单的 JSON 格式 HTTP 请求,让 Heroku 上的应用访问 Salesforce 数据。你可以用它做数据代理和自定义用户界面。用开源技术构建、跑在 Heroku 上的应用,可以用 OAuth 在自定义界面里授权用户,再代表他们与 Salesforce 数据交互。没有界面的集成用例则可以在 Salesforce 和外部系统之间中转数据。

上图展示了通过 REST 接口连接 Salesforce 对象和 Heroku。

Callouts

slide_17

你可以用 callouts 从 Salesforce 调用 Heroku 上的外部流程。你可以用 Apex 编写 callout,或用 outbound message action 让 Salesforce 上的事件触发 Heroku 上的流程执行。这个流程通常再用前面提到的某一种集成方法把结果写回 Salesforce。

上图展示了 Salesforce 中的数据事件通过 outbound message 触发 Heroku 上应用的过程。

比较集成方法(一):一览

slide_18

每种 Salesforce 与 Heroku 集成方法都有其适用场景,取决于开发者技能和用例。基本差异如下:

  • 安全模型:Heroku Connect 用集成用户;Salesforce Connect 用集成用户或命名主体;REST APIs 用 OAuth;Callouts 用应用用户。
  • 数据策略:Heroku Connect 是实时双向同步或 OData;Salesforce Connect 是 OData 或代理;REST APIs 是读取和复制;Callouts 是负载(payload)。
  • 限制:Heroku Connect 不受 API 限制;Salesforce Connect 有源、对象、字段数量上限;REST APIs 和 Callouts 受 API 限制。

比较集成方法(二):建议

slide_19

一些集成选型的通用建议:

  • 在 Salesforce 和 Heroku 之间复制数据 → 用 Heroku Connect;
  • 把 Heroku Postgres 数据库暴露给 Salesforce → 用 Heroku Connect External Object;
  • 把 OData、SOAP、XML 或 JSON 数据源代理进 Salesforce → 用 Salesforce Connect;
  • Heroku Connect 不合适(比如 Heroku 上有自定义 UI、用户通过 Salesforce 登录)→ 用 Salesforce REST APIs;
  • 卸载或扩展 Salesforce 数据事件的处理 → 用从 Salesforce 到 Heroku 的 callouts。

02 用 Heroku Connect 集成 Salesforce 与 Heroku

slide_20
slide_21

本单元聚焦 Heroku Connect:它如何把 Salesforce 数据复制到 Heroku Postgres(或双向同步)、如何配置这个 add-on,以及典型应用架构中各个部分如何配合。

学完本单元,你将能够:

  • 描述 Heroku Connect 架构;
  • 解释如何用 Heroku Connect 集成 Salesforce 与 Heroku。

Heroku Connect(一):数据复制与代理

slide_22

Heroku Connect 与 Heroku Postgres 数据库配合使用。它可以把 Salesforce 数据复制到这个 SQL 数据库(单向或双向),也可以通过 Salesforce Connect(下一单元讲)把 Postgres 数据代理回 Salesforce。

数据复制可以是单向(Salesforce → Postgres)或双向。从 Postgres 复制回 Salesforce 可以以极低延迟执行(虽非实时)——你可以通过设定轮询间隔来控制延迟,或根据 Salesforce Streaming API 的变化按需轮询。因为 Heroku Connect 用的是 Heroku Postgres,复制的数据拥有所有标准数据库功能,比如用 Dataclips 轻松查询数据并以 CSV 或在网页上分享结果。

Heroku Connect(二):产品目录演示

slide_23

Heroku Connect 的一个常见用途是 B2C 应用——使用并可能修改存储在 Salesforce 里的数据。假设你把充气独角兽派对帽的产品目录存在 Salesforce,想用一个公开网站展示它。Heroku Connect 把产品数据复制到 Heroku Postgres,公开网站就能轻松访问。网站可用 Node.js、Java、PHP 等开源技术构建,访问数据的接口就是标准 SQL。这种只读用例很常见,但写回 Salesforce 也很容易——比如用户给产品"点赞",这个信息可以存回 Salesforce,供后台销售和营销使用。

开始使用 Heroku Connect

slide_24

Heroku Connect 是一个 Heroku add-on,可以通过 Heroku 仪表盘轻松配置和供给。配置时,你用 OAuth 认证到 Salesforce 实例,并允许 Heroku Connect 代表你调用 API。Heroku Connect 用这个 API 连接在 Salesforce 和 Heroku Postgres 之间同步数据。为 Heroku 应用配置好 Heroku Connect 后,配置同步什么数据、如何同步;完成 Salesforce 到数据库的映射后,应用就能连接 Heroku Postgres 数据库并用标准 SQL 访问数据。

Heroku Connect 应用架构(一):映射

slide_25

用 Heroku Connect 做数据复制时,Salesforce 拥有数据 schema。要添加字段,先在 Salesforce 里自定义对象,再更新 Heroku Connect 的映射。你可以映射多个对象,也可以映射对象间的关系,从而在 Salesforce 里创建与标准对象关联的自定义对象。例如,一个 Product Likes 对象可以关联一个 Contact 和一个 Product——只有 Heroku 应用写入它,Salesforce 里的后台用户则可读取它来做报表和营销活动。

Heroku Connect 应用架构(二):如何运行

slide_26

架构上,Heroku Connect 遵循清晰的模式:开发者在本地维护一个镜像 Heroku 环境的 Postgres 数据库,便于复现 schema;Heroku 上的集成测试应用通常连接一个 Salesforce 实例,在同步后的数据库上验证改动。性能方面,查询同步后的 Postgres 和查询任何其他 Postgres 数据库没有区别——你可以反复查询,而 Salesforce 只在数据变化或轮询间隔触发时被读取一次。因为 Heroku Postgres 离你的应用很近,读取速度极快、延迟很低。插入和更新都是标准 SQL 语句,按映射的设置和计划同步回 Salesforce。

03 用 Salesforce Connect 集成 Salesforce 与 Heroku

slide_27
slide_28

本单元讲 Salesforce Connect——如何在不复制数据的情况下把外部数据代理进 Salesforce,重点是暴露 REST 服务的 Heroku 应用,以及自定义适配器和它的高级功能。

学完本单元,你将能够:

  • 讨论 Salesforce Connect 架构;
  • 开发 Salesforce Connect 自定义适配器;
  • 描述何时以及如何把 Salesforce Connect 用于 Heroku。

Salesforce Connect 与 Heroku(一):代理而非复制

slide_29

Salesforce Connect 把外部数据代理进 Salesforce,不复制到数据库,这样你就能把数据拉进 Salesforce 并与其他对象关联。它支持多种数据源:任何 OData 2.0 数据源、通过 Heroku Connect 暴露的 Heroku Postgres 数据库、以及任何提供可消费端点的 Heroku 应用。

本单元聚焦第三种:Heroku 应用可以给 Web/移动应用和 REST 服务提供端点,而 REST 服务很容易用 Apex 在 Salesforce 里消费,所以写一个代理这些 REST 数据的 Salesforce Connect 自定义适配器很简单。

Salesforce Connect 与 Heroku(二):为什么胜过 ETL

slide_30

Salesforce Connect 自定义适配器的主要用例是:外部系统(比如你的 Heroku 应用)提供了对标准 Salesforce UI 有用的数据。例如,一个面向客户的房地产应用在 Heroku 上把 REST 数据暴露给 JavaScript 和移动 UI,后台一些流程和报表也想用这些数据——你只需写一个从 Heroku REST 服务到 Salesforce Connect 结构的适配器。相比传统 ETL,Salesforce Connect 的数据始终同步,因为它近实时地获取、且从不复制。

开始使用 Salesforce Connect 与 Heroku(一):自定义适配器基础

slide_31

写一段 Apex 代码在 Salesforce Connect 和你的服务之间架桥。适配器继承 DataSource.Connection 类,并实现 sync()、query()、search() 三个方法。sync() 告诉 Salesforce 外部对象的数据结构——比如一个带几列的表,其中 ExternalId、DisplayUrl、Name 三个字段是必需的。

开始使用 Salesforce Connect 与 Heroku(二):数据如何流动

slide_32

query() 方法是关键:当 Salesforce 用户访问外部对象的记录列表时,query() 会调用 getProperties() 去请求 Heroku 上的房地产 REST API,再把数据解析成外部对象的结构。因为 Salesforce Connect 代理数据而非存储,每次请求都会重新通过适配器获取。数据看起来、用起来都和 Salesforce 原生数据一样——只是它其实来自 Heroku 上的应用。

Salesforce Connect 高级功能

slide_33

Salesforce Connect 自定义适配器远不止简单的表。你可以用外部对象引用在不同数据集之间定义关系。一个专业提示:示例代码往往访问匿名数据,但生产环境里应该对外部数据存储做某种形式的认证。如果你的 REST 服务暴露大量记录,还应该实现数据分页(paging),让 Salesforce 能高效地分页获取结果。

04 用 Salesforce REST APIs 与 Heroku 集成

slide_34
slide_35

本单元讲 Salesforce REST APIs:Heroku 上的应用如何通过 HTTP + JSON 调用 Salesforce,OAuth 和 connected app 如何保护这些调用,以及单一集成用户和命名用户两种认证方式的区别。

学完本单元,你将能够:

  • 列出 Salesforce REST APIs 的用例;
  • 描述不同类型的认证;
  • 解释如何在 Heroku 应用中使用 REST APIs。

Salesforce REST APIs 与 Heroku(一):概览与库

slide_36

Salesforce REST APIs 用简单的 HTTP + JSON 请求暴露 Salesforce 上几乎一切——数据、流程、元数据。认证用 OAuth(REST 认证的标准方式)。虽然可以直接调用 API,但有很多包装库让它在 Node.js(nforce、JSForce)、Python、Ruby(restforce)、Java 等里更易用。这些库处理认证、请求/响应等底层任务。

上图展示了通过 REST 接口连接 Salesforce 对象和 Heroku。

Salesforce REST APIs 与 Heroku(二):jsforce 示例

slide_37

与其手工构造 HTTP 请求,不如用 Node.js 的开源 JSForce 库,几行调用就能完成同样的事——库在底层做的工作和你手动做的完全一样,但用起来方便得多。在 REST APIs 之上你可以构建两类应用:应用到应用的集成和自定义用户界面。二者最大的区别在于认证方式。

REST API 的 OAuth 认证(一):Connected Apps

slide_38

认证是使用 REST APIs 的关键,因为每个请求都必须带认证 token。无论哪种模式,你都要在 Salesforce 里注册一个 connected app,让 Salesforce 识别是哪个应用在发请求、让管理员管理其访问权限。然后二选一:应用到应用用单一集成用户;自定义界面用命名用户走 OAuth。这个选择影响安全性和审计。

单一用户(Single User)

slide_39

应用到应用的集成没有人在环路里:应用知道一个单一集成用户的凭据,通过 REST 登录端点换取认证 token,然后以该用户身份发起所有 API 调用。典型例子是一个面向客户的订单管理应用(跑在 Heroku 上)需要从 Salesforce 获取客户信息——它可以作为一个集成用户抓取所有信息。Heroku 部署这两种应用都很方便。

命名用户(Named Users)

slide_40

自定义用户界面中,应用永远拿不到真实凭据。用户走 OAuth 流程:访问需要认证的页面 → Heroku 应用重定向到 Salesforce OAuth 页 → 用户授权应用 → Salesforce 带一个 code 重定向回来 → 应用用 code 换取 access token 和 refresh token → 用 access token 以命名用户身份调用 REST API。

通常 access/refresh token 会加密后存在会话或数据库里,避免用户每次请求都重走授权流程。记住:这些 token 很敏感,必须极其谨慎地处理!

05 用 Apex Callouts 和 Outbound Messages 与 Heroku 集成

slide_41
slide_42

最后一单元反转发方向,从 Salesforce 向 Heroku 发送事件。你会看到如何用 Apex HTTP callouts、outbound messages 和 Flow 里的 HTTP action 触发 Heroku 应用,以及各自适用的场景。

学完本单元,你将能够:

  • 向 Heroku 发送 Apex callouts 和 outbound messages;
  • 讨论 Apex callouts 和 outbound messages 的用例。

Callouts 到 Heroku 应用

slide_43

有时 Salesforce 上的事件因规模或流程类型必须由外部系统处理。例如用户在 Salesforce 上传一张需要缩放的照片。调用 Heroku 应用有三种方式:Apex HTTP callouts(代码里发 REST 调用)、outbound messages(声明式发 SOAP 调用)、Flow 里的 HTTP actions。无论哪种,Heroku 应用都收到带事件详情负载的请求,执行动作后,可选用 REST APIs 或 Heroku Connect 把结果写回 Salesforce。

上图展示了 Salesforce 中的数据事件通过 outbound message 触发 Heroku 上应用的过程。

用 Apex Trigger 实现 Callouts(一):解剖

slide_44

Apex trigger 可以响应 insert、update、delete、merge、upsert、undelete 等事件。trigger 里可以发起对 Heroku 应用端点的 callout:一个 Webhook Apex 类的 jsonContent 方法把 trigger 数据序列化成 JSON,callout 方法把这个 JSON 负载通过 HTTP POST 发给 Heroku。Heroku 侧的开源应用收到事件详情后执行它的处理逻辑。

用 Apex Trigger 实现 Callouts(二):Heroku 端点与安全

slide_45

Heroku 侧可以用任何 Web/REST 技术构建端点。以 JavaScript、Node.js、Express 为例,请求处理器接收 POST,req.body 就是 Apex trigger 发来的反序列化 JSON。两点安全实践很重要:用预共享密钥认证请求,避免恶意调用;在负载里带上 session ID,让 Heroku 应用能回调 Salesforce 的 REST API 来取数或更新数据。

用 Outbound Messages 实现 Callouts(一):Action

slide_46

Outbound Messages 提供声明式的路径——无需 Apex。创建一个 Outbound Message action,把端点 URL 指向你的 Heroku 应用。如果勾选 Send Session ID,Heroku 就能拿到 token 代表用户调用 REST API;不勾选则无法校验请求,端点会暴露给恶意调用。因为 outbound message 是 SOAP 格式,Heroku 侧要能解析 XML(Node.js 可用 express-xml-bodyparser 库)。示例中,每创建一个联系人,Heroku 应用就收到联系人的详情。

上图是配置 Outbound Messaging 的对话框(消息名为 New Contact to Heroku)。

用 Outbound Messages 实现 Callouts(二):Flow

slide_47

真正发送 callout 的是一个记录触发的 Flow:其起始元素在记录被创建、更新、创建或更新、删除时触发。你可以用入口条件限制哪些记录触发 Flow;对于更新,可以选每次更新都触发,还是只在更新使条件满足时触发。然后添加一个 Action 元素,选择你创建的 Outbound Message action,给它一个 Label 并保存。Flow 甚至可以用 Pause 元素等待 Heroku 的响应。

上图是 Flow 中的 Action 元素配置界面。


文章来源:Trailhead - Salesforce & Heroku Integration