简介:SAP NetWeaver是SAP推出的企业应用集成平台,基于服务导向架构(SOA),提供涵盖ABAP与Java双引擎的完整技术框架,支持ERP、CRM等核心业务系统及非SAP系统的无缝集成。本文深入分析其三层核心架构(客户端层、应用服务器层、数据库层),详解ABAP/Java应用服务器、Portal、BI、KM、Process Orchestration等关键组件功能,并探讨其在Web服务、数据集成、流程协同中的实现机制。结合HANA内存计算与SAP Cloud Platform的演进路径,全面展示NetWeaver在数字化转型中的技术支撑能力。
1. SAP NetWeaver架构概述与SOA设计理念
SAP NetWeaver架构核心与SOA设计原则
SAP NetWeaver作为企业级集成平台,基于面向服务的架构(SOA)构建,通过服务封装、松耦合通信和可重用组件实现系统间的灵活集成。其双栈架构(ABAP/Java)支持多运行时环境协同,依托企业服务总线(ESB)实现消息路由与协议转换。NetWeaver提供统一的安全认证、元数据管理与身份传播机制,支撑跨系统单点登录(SSO)与服务治理,成为SAP生态系统的集成中枢。
graph TD
A[客户端层] --> B[应用服务器层]
B --> C[数据库层]
B <-- SOA --> D[外部系统]
E[ESB] -->|服务编排| B
F[统一用户管理] -->|SSO| B & A
该架构推动企业从单体系统向服务化演进,为后续各层技术展开奠定基础。
2. 客户端层交互模式分析(Web/桌面/移动)
现代企业信息系统对多终端支持的需求日益增长,SAP NetWeaver平台作为集成化技术底座,必须满足从传统桌面到移动设备、再到浏览器端的多样化访问场景。客户端层是用户与系统交互的第一入口,其设计质量直接影响用户体验、响应性能和安全边界。本章深入探讨NetWeaver在不同客户端环境下的接入机制与交互逻辑,涵盖Web浏览器、原生桌面客户端以及移动端三大主要形态。通过剖析底层通信协议、会话管理策略及前端渲染流程,揭示如何在异构设备上实现一致的功能暴露与数据同步能力。
客户端层的设计目标不仅是提供界面展示,更在于构建一个抽象化的接入通道,使上层业务逻辑无需感知终端类型差异。为此,NetWeaver采用分层架构思想,在传输层之上引入适配器机制,将具体的技术实现细节封装于中间件内部。这种“前端无关”的设计理念允许开发人员专注于服务定义与流程编排,而由平台自动处理诸如设备识别、内容协商、状态维持等跨端共性问题。尤其在SOA架构背景下,服务接口以标准化方式对外发布(如OData、RFC、SOAP),进一步强化了客户端与后端解耦的能力。
随着HTML5、JavaScript框架及移动原生SDK的发展,NetWeaver逐步演进为支持多种前端技术栈的开放平台。无论是基于BSP的传统网页应用,还是采用UI5构建的响应式单页应用(SPA),亦或是通过SMP打包的本地App,系统均能通过统一的身份认证、权限控制与数据服务网关进行协调管理。这种灵活性使得企业在数字化转型过程中可并行推进多个前端项目,而不必重构核心后端逻辑。此外,针对离线操作、断网续传、本地缓存等复杂需求,平台也提供了成熟的解决方案,确保关键业务在弱网络环境下仍具备可用性。
2.1 客户端访问架构的设计原理
客户端访问架构的核心任务是在异构终端之间建立统一、高效且安全的通信路径。该架构不仅要适应不同的操作系统、屏幕尺寸和输入方式,还需在保持低延迟的同时保障数据完整性与用户身份可信度。NetWeaver通过引入抽象层机制、标准化通信协议栈以及精细化的状态管理模型,实现了跨平台一致性体验。
2.1.1 多终端适配的抽象层机制
为了屏蔽终端差异,NetWeaver在客户端与应用服务器之间部署了一套 设备抽象层(Device Abstraction Layer, DAL) 。该层负责解析客户端请求中的User-Agent信息、屏幕分辨率、DPI密度、支持的MIME类型等元数据,并据此动态选择最优的内容呈现模板或资源版本。例如,当检测到移动设备时,系统可自动切换至轻量级UI组件库;而对于高分辨率桌面显示器,则启用富交互控件与图表渲染引擎。
此抽象机制的关键在于 内容协商(Content Negotiation) 过程,它依赖HTTP头部字段如 Accept , Accept-Encoding , Accept-Language 来决定响应格式。NetWeaver内置的内容分发控制器会根据这些参数匹配最合适的视图处理器:
| 请求特征 | 匹配策略 | 输出形式 |
|---|---|---|
| User-Agent包含”Mobile” | 移动优先布局 | 简化导航+触控优化控件 |
Accept头含 application/json | API优先 | JSON/OData响应 |
| 屏幕宽度 < 768px | 响应式断点触发 | 隐藏侧边栏,折叠菜单 |
| 支持WebP图像编码 | 资源压缩优化 | 返回.webp替代.jpg |
graph TD
A[客户端请求] --> B{设备类型识别}
B -->|Desktop| C[加载完整UI5框架]
B -->|Tablet| D[启用响应式容器]
B -->|Phone| E[调用轻量BSP模板]
C --> F[返回HTML+JS+CSSL]
D --> G[返回自适应布局]
E --> H[返回简化页面结构]
上述流程体现了抽象层如何通过条件判断实现差异化输出。值得注意的是,抽象层并非仅作用于视觉层面,还影响功能模块的激活范围。例如,某些后台批处理任务可能仅限桌面端执行,而审批流推送则优先路由至移动端通知中心。
此外,抽象层与 前端路由网关(Frontend Router Gateway) 协同工作,后者依据URL路径前缀(如 /ui5 , /bsp , /mobile )将请求导向对应的应用容器。这种基于路径的分流机制避免了客户端主动选择技术栈的负担,提升了整体架构的透明性。
2.1.2 基于HTTP/HTTPS的通信协议栈解析
所有客户端访问最终都通过标准HTTP/HTTPS协议与NetWeaver通信。尽管SAP GUI等传统工具使用专有二进制协议(如SAP NI),但在现代集成架构中,基于RESTful风格的Web服务已成为主流。因此,理解HTTP协议栈在NetWeaver中的实现至关重要。
完整的通信链路如下所示:
客户端 → TLS加密层 → HTTP(S)监听器 → Web Dispatcher → ICM (Internet Communication Manager) → AS ABAP/Java
其中, ICM(Internet Communication Manager) 是ABAP栈中负责处理HTTP请求的核心组件。它运行在独立的工作进程中,能够并发处理数千个连接。每个请求经过以下阶段:
- 连接建立 :TCP三次握手完成后,若启用了TLS,则进行SSL/TLS握手,验证证书链。
- 请求解析 :ICM读取HTTP头,提取方法(GET/POST)、URI、Host、Cookie等关键信息。
- 虚拟主机路由 :根据Host头确定目标实例(适用于多租户部署)。
- 安全检查 :检查IP白名单、CSRF Token有效性、XSS过滤规则。
- 服务映射 :通过Service Handler注册表查找匹配的处理器类(如
IF_HTTP_EXTENSION实现类)。
以下是一段典型的HTTPS请求日志示例:
POST /sap/opu/odata/SAP/ZEMPLOYEE_SRV/Employees HTTP/1.1
Host: sapgw.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-CSRF-Token: FETCH
Cookie: MYSAPSSO2=...; SAP_SESSIONID=...
{
"Name": "John Doe",
"Department": "IT"
}
逐行解析:
- 第1行:使用POST方法提交员工数据至OData服务端点,表明这是一个创建操作。
- 第2行:指定目标主机名,用于SNI(Server Name Indication)识别。
- 第3行:声明请求体为JSON格式,服务器需调用JSON解析器。
- 第4行:Bearer Token用于OAuth 2.0认证,替代传统的Basic Auth。
- 第5行:CSRF防护机制要求携带一次性令牌,防止跨站伪造攻击。
- 第6-7行:Cookie携带会话标识,用于维持登录状态。
- 后续部分为实际业务数据,遵循OData v2/v4规范。
在整个通信过程中,NetWeaver严格遵守RFC 723x系列标准,并扩展了SAP特有的错误码(如 HTTP 400 - Invalid OData URI syntax )。同时,支持HTTP/2特性如多路复用、头部压缩,显著提升高延迟网络下的性能表现。
2.1.3 状态管理与会话保持策略
由于HTTP本身是无状态协议,NetWeaver必须借助外部机制维护用户会话上下文。常见的方案包括Cookie-based Session Tracking、Token-Based Authentication以及Stateless JWT模式。
Cookie-Based 会话机制
在传统BSP或Web Dynpro应用中,系统通常采用基于Cookie的会话跟踪。用户首次访问时,服务器生成唯一Session ID(如 SAP_SESSIONID_XXXXX ),并通过 Set-Cookie 头写入客户端:
HTTP/1.1 200 OK
Set-Cookie: SAP_SESSIONID_A1B2C3=abc123xyz; Path=/; HttpOnly; Secure; SameSite=Lax
后续请求中,浏览器自动附带该Cookie,ICM据此查找内存中的会话对象(存储在Roll Area或Shared Memory中)。会话超时时间可通过事务码 RZ10 配置参数 icm/session_timeout 设定,默认值为60分钟。
Token-Based 认证流程
对于前后端分离架构,推荐使用Token机制。典型流程如下:
sequenceDiagram
participant Client
participant OAuth2_Server
participant Resource_Server
Client->>OAuth2_Server: POST /oauth2/token (grant_type=password)
OAuth2_Server-->>Client: {access_token, expires_in}
Client->>Resource_Server: GET /data (Authorization: Bearer <token>)
Resource_Server->>OAuth2_Server: Introspect Token
OAuth2_Server-->>Resource_Server: {active:true, user:jdoe}
Resource_Server-->>Client: Return Data
该流程基于OAuth 2.0密码模式,优点是服务端无需保存会话状态,适合横向扩展。Access Token通常为JWT格式,内嵌用户信息与权限声明,减少数据库查询开销。
会话复制与集群支持
在双节点或多实例环境中,为防止单点故障导致会话丢失,NetWeaver支持 会话复制(Session Replication) 。通过SMICM配置共享内存区域或使用Redis作为外部缓存,各应用服务器可同步会话状态。相关参数如下:
| 参数名称 | 说明 | 推荐值 |
|---|---|---|
rdisp/login_refresh_support | 是否启用登录刷新 | TRUE |
httpxx/global_session | 全局会话开关 | TRUE |
login/accept_cookies | 是否接受第三方Cookie | TRUE |
综上所述,NetWeaver的客户端访问架构通过抽象层、协议栈优化与会话管理三位一体的设计,构建了一个兼具兼容性、安全性与可扩展性的接入体系,为后续各类终端的具体实现奠定了坚实基础。
3. 应用服务器层核心组成(ABAP与Java引擎)
在企业级SAP系统架构中,应用服务器层是承上启下的关键枢纽。它不仅负责接收来自客户端的请求并进行逻辑处理,还承担着业务规则执行、事务管理、资源调度以及跨系统通信等核心职能。SAP NetWeaver平台支持两种主要的应用运行环境:ABAP和Java。这两种技术栈虽然底层机制迥异,但在NetWeaver双栈系统中实现了深度集成与协同工作。理解ABAP与Java应用服务器的内部构造及其交互方式,对于优化系统性能、保障高可用性及实现灵活扩展具有重要意义。
本章将深入剖析ABAP应用服务器的运行时模型,包括其进程结构、内存管理体系和程序加载机制;同时解析Java应用服务器基于J2EE标准的容器架构,并探讨JVM调优策略;进一步分析ABAP与Java双栈之间的通信路径与共享服务机制;最后从集群部署角度出发,阐述负载均衡、故障转移与缓存一致性等关键设计原则。
3.1 ABAP应用服务器的运行时环境
ABAP应用服务器作为SAP传统系统的基石,承载了绝大多数SAP ERP、S/4HANA等核心模块的业务逻辑处理任务。其运行时环境的设计高度专业化,围绕“多进程+共享内存”的架构理念构建,确保了高并发场景下的稳定响应能力。该环境由多个协同工作的组件构成,其中最为核心的是工作进程(Work Processes)、内存区域划分机制以及ABAP字节码解释器。
3.1.1 工作进程(Work Processes)类型与调度机制
ABAP应用服务器采用多进程模型来处理用户请求。每个应用服务器实例可配置若干个工作进程,这些进程由操作系统级别的独立线程或轻量级进程实现,共同隶属于一个中央调度器——Dispatcher。所有进入服务器的请求首先被送入Dispatcher维护的请求队列中,随后根据特定算法分配给空闲的工作进程进行处理。
工作进程按功能划分为以下五种类型:
| 类型 | 缩写 | 功能描述 |
|---|---|---|
| 对话进程 | DIALOG | 处理用户交互式请求(如GUI操作、Web Dynpro) |
| 更新进程 | UPDATE | 执行数据库更新任务,分为V1(优先级高)和V2(优先级低) |
| 后台进程 | BACKGROUND | 运行定时作业(Job) |
| 消息进程 | MESSAGE | 在集群环境中协调消息分发(仅主实例存在) |
| 队列进程 | SPOOLL | 管理打印输出请求 |
" 示例:通过SM50查看当前工作进程状态 "
CALL TRANSACTION 'SM50'.
逻辑分析 :
SM50是SAP提供的标准监控事务码,用于实时查看所有工作进程的状态(空闲、运行、等待等)。此代码并非编程语句,而是调用系统内置工具的方式示例。在实际运维中,管理员可通过该界面识别长时间阻塞的进程,判断是否需调整进程数量或排查死锁问题。
调度流程与负载均衡
当用户发起请求时,网络层将其封装为HTTP或RFC格式传入应用服务器。Dispatcher接收到后,将其放入相应的请求队列(例如对话请求进入对话队列),然后轮询各工作进程状态。一旦发现某个DIALOG进程处于空闲状态,即触发上下文切换,将请求指派给该进程处理。
graph TD
A[客户端请求] --> B{Dispatcher}
B --> C[检查请求类型]
C --> D[加入对应队列]
D --> E[轮询工作进程状态]
E --> F{是否有空闲进程?}
F -- 是 --> G[分配请求至空闲WP]
F -- 否 --> H[排队等待]
G --> I[WP处理请求]
I --> J[返回结果]
流程图说明 :上述Mermaid图展示了请求从客户端到达ABAP应用服务器后的完整调度路径。Dispatcher作为中枢控制器,依据请求类型分类并排队,最终通过状态检测机制实现动态分配。这种设计避免了单一进程成为瓶颈,提升了整体吞吐量。
参数说明:
- Dispatcher :运行于单独OS进程中的核心调度组件,不参与具体业务处理。
- Request Queue :先进先出(FIFO)队列,支持优先级排序(如V1更新请求优先于V2)。
- Work Process Status :包括Idle、Running、Wait for DB、Roll-in/Roll-out等状态,影响调度决策。
实践中,若发现大量请求积压在队列中,通常意味着工作进程数不足或某些进程陷入长时间数据库操作。此时应结合ST06(操作系统监控)和ST04(数据库监控)进行联合诊断。
3.1.2 内存区域划分(Roll, Page, EM)及其管理策略
ABAP运行时依赖一套精细的内存分区机制,以支持多用户并发访问的同时保证资源隔离与效率最大化。整个内存空间被划分为三个主要区域:Roll Area、Page Area 和 Extended Memory(EM),每部分服务于不同层次的数据存储需求。
内存结构详解
| 区域 | 用途 | 生命周期 | 共享性 |
|---|---|---|---|
| Roll Area | 存储用户会话的基本上下文(如程序名、调用栈) | 每次请求开始时分配,结束后释放 | 每用户独占 |
| Page Area | 存放程序代码、常量、静态变量等 | 请求期间持续存在 | 可跨请求复用 |
| Extended Memory | 存储内表、字段符号等大对象数据 | 用户登录到登出期间保持 | 进程间共享 |
DATA: lt_data TYPE TABLE OF sflight,
ls_data TYPE sflight.
SELECT * FROM sflight INTO TABLE lt_data UP TO 100 ROWS.
逐行解读 :
- 第1行定义一个内表lt_data,用于暂存航班数据;
- 第2行定义行结构ls_data;
- 第3行执行数据库查询并将结果填充至内表。此过程中,
lt_data的实际数据存储于Page Area或Extended Memory中,具体取决于数据大小。小规模数据可能驻留在Page Area,而超过阈值的大内表会被自动迁移至EM区,以防止Roll Area溢出导致“TIME OUT”错误。
内存管理优化建议
- 设置合理的EM上限 :通过实例参数
em/initial_size_MB和em/max_size_MB控制Extended Memory总量,避免过度占用物理内存。 - 启用Memory Reuse机制 :配置
abap/session_timeout_action = REUSE,允许用户重新连接时复用原有内存上下文,减少重建开销。 - 监控内存使用情况 :使用事务码
ST02查看Buffer Statistics,重点关注“Too Small”标记的缓冲区,及时调整大小。
pie
title ABAP内存分布示意图
“Roll Area” : 15
“Page Area” : 25
“Extended Memory” : 50
“Heap Area (for internal use)” : 10
图表说明 :该饼图展示了一个典型ABAP应用服务器的内存占比情况。Extended Memory占据最大份额,因其承担了大部分动态数据的存储职责。合理规划各区域配比,是提升系统响应速度的关键。
3.1.3 ABAP字节码解释器与程序加载流程
尽管ABAP源代码以文本形式保存在Repository中,但在运行时并不会直接解释源码,而是经过编译生成一种中间表示——ABAP Load,也称作字节码(Bytecode)。这一过程由ABAP Runtime Processor中的解释器完成,构成了ABAP高效执行的基础。
程序加载全流程
-
语法检查与编译
当开发者激活ABAP程序(如使用SE38)时,系统自动进行语法校验,并生成对应的Load对象,存储于REPOSRC和REPOLOAD数据库表中。 -
缓冲区缓存
编译后的Load被加载至Program Buffer(程序缓冲区),这是一个位于共享内存中的高速缓存区域,供所有工作进程访问。 -
运行时加载
当某工作进程需要执行程序时,首先检查本地缓冲区是否存在有效副本。若存在,则直接载入;否则向Global Area发起请求获取。
CALL TRANSACTION 'SE38'.
" 输入程序名ZMY_REPORT并执行
SUBMIT zmy_report AND RETURN.
逻辑分析 :
-CALL TRANSACTION 'SE38'启动ABAP编辑器;
-SUBMIT语句触发后台报告执行;
- 系统查找zmy_report的Load对象,若未命中缓冲区,则从数据库读取并缓存。
缓冲区同步与失效机制
为防止因程序变更导致旧版本继续运行,SAP引入了缓冲区同步协议。每当程序被修改并重新激活时,系统会向所有应用服务器广播一条“Invalidation Message”,通知其清除本地缓存中的旧Load。
| 参数 | 作用 |
|---|---|
rdisp/SHM_PGMNO | 控制Program Buffer的最大条目数 |
rsdb/ssfs_enable | 是否启用SSFS(Secure Store in File System)增强安全加载 |
abap/load_form_mode | 控制定时加载策略(Lazy vs Eager Loading) |
# 查看Program Buffer命中率(OS命令)
sudo su - <sid>adm
devctl -v | grep "PGMSHMDT"
参数说明 :该命令输出包含Program Buffer的统计信息,如总容量、当前使用量、命中次数与未命中次数。理想情况下命中率应高于95%,否则需扩大缓冲区或优化程序命名规范以减少冲突。
此外,在分布式系统中,还可通过ICM(Internet Communication Manager)启用HTTP缓存代理,进一步降低对后端ABAP引擎的频繁调用压力。
3.2 Java应用服务器的容器架构
SAP NetWeaver AS Java遵循J2EE(现Jakarta EE)规范,提供完整的Java EE容器支持,适用于开发和部署基于标准Java技术的企业应用。其架构以模块化、松耦合和服务导向为核心思想,广泛应用于SAP PI/PO、SAP Portal、SAP Cloud Platform等产品中。
3.2.1 J2EE引擎核心组件(Web Container, EJB Container)
Java应用服务器的核心由多个容器组成,其中最重要的是Web Container和EJB Container,它们分别负责处理Web请求和企业级组件调用。
Web Container 架构
Web Container用于托管Servlet、JSP、JSF等Web组件。所有HTTP请求首先由ICM(Internet Communication Manager)接收,再转发至Web Container中的相应处理器。
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.getWriter().println("Hello from SAP J2EE Engine!");
}
}
逐行解读 :
-@WebServlet注解声明URL映射路径;
-doGet方法响应GET请求;
-resp.getWriter()获取输出流,向浏览器发送字符串;该Servlet部署后可在SAP Enterprise Portal中通过
http://<host>:<port>/hello访问。
容器内部通过线程池管理并发请求,每个请求由独立线程处理,互不阻塞。容器还负责生命周期管理(init → service → destroy)、过滤器链(Filter Chain)调用以及Session跟踪。
EJB Container 与业务组件
EJB(Enterprise JavaBean)Container支持无状态/有状态Session Bean、Message-Driven Bean等分布式组件。在SAP场景中,常用于封装跨模块业务逻辑。
@Stateless
public class OrderProcessorBean implements OrderProcessorRemote {
@Resource
private SessionContext ctx;
public void createOrder(OrderDTO order) {
// 调用JDBC或JPA持久化
EntityManager em = getEntityManager();
em.persist(order);
}
}
参数说明 :
-@Stateless表示该Bean为无状态会话Bean,可被多个客户端共享;
-SessionContext提供事务控制和安全上下文访问;
-EntityManager来自JPA,用于对象关系映射操作。
EJB调用通常通过RMI/IIOP或HTTP-based Webservice暴露接口,便于与其他系统集成。
classDiagram
class WebContainer {
+handleRequest()
+manageSessions()
+invokeFilters()
}
class EJBContainer {
+createBeanInstance()
+enforceSecurity()
+transactionControl()
}
class Client <-- WebContainer : HTTP
WebContainer --> Servlet : delegate
EJBContainer --> SessionBean : instantiate
WebContainer --> EJBContainer : lookup via JNDI
类图说明 :展示了Web请求如何通过Web Container调用EJB组件。前端Servlet通过JNDI查找远程EJB引用,实现业务逻辑解耦。
3.2.2 JVM调优与垃圾回收在高负载场景下的实践
Java应用服务器运行在JVM之上,因此JVM性能直接影响整体系统表现。尤其在高并发、大数据量处理场景下,不当的GC策略可能导致长时间停顿甚至OOM(Out of Memory)错误。
常见JVM参数配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
-Xms / -Xmx | 4g ~ 16g | 初始与最大堆大小,建议设为相同值避免动态扩容 |
-XX:NewRatio | 2 | 新生代与老年代比例 |
-XX:+UseG1GC | 启用 | 使用G1垃圾收集器适合大堆 |
-XX:MaxGCPauseMillis | 200 | 目标最大GC暂停时间 |
-verbose:gc | 开启 | 输出GC日志用于分析 |
# 启动脚本片段(jstartup.ini 或 defaultProfile)
jstartup/vm/home = $(DIR_INSTANCE)/j2ee/jvm
jstartup/vm/parameter.1 = -Xms8g
jstartup/vm/parameter.2 = -Xmx8g
jstartup/vm/parameter.3 = -XX:+UseG1GC
jstartup/vm/parameter.4 = -XX:MaxGCPauseMillis=200
执行逻辑说明 :以上配置应用于SAP NetWeaver AS Java的启动脚本中,确保JVM以最优方式初始化。G1 GC特别适合超过4GB的堆空间,能有效控制停顿时间。
GC监控与诊断工具
推荐开启GC日志记录,并配合SAP自带的VisualVM或第三方工具(如GCViewer)进行分析:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/usr/sap/<SID>/JC<inst>/data/gc.log
通过分析日志可识别频繁Full GC的原因,进而优化内存泄漏或调整代大小。
3.2.3 Java命名与目录接口(JNDI)的服务查找机制
JNDI是Java EE中用于统一访问命名和目录服务的标准API。在SAP Java引擎中,JNDI被广泛用于定位数据源、EJB、连接工厂等资源。
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/SAPDataSource");
Connection conn = ds.getConnection();
逻辑分析 :
-InitialContext初始化JNDI上下文;
-lookup方法根据名称查找注册的服务;
- 名称为逻辑引用,实际绑定由部署描述符(如web.xml或ejb-jar.xml)定义。
SAP通过 jndi.properties 文件或SMICM事务码配置全局JNDI绑定,实现资源集中管理。
| JNDI名称 | 实际资源 | 作用 |
|---------|----------|------|
| `java:comp/env/jdbc/MyDB` | Oracle DataSource | 应用专属数据库连接池 |
| `sap.com/security/UserStore` | UME Provider | 用户认证服务 |
| `javax.jms.QueueConnectionFactory` | JMS工厂 | 消息队列通信基础 |
JNDI机制屏蔽了底层实现差异,使应用程序具备更强的可移植性和配置灵活性。
3.3 双栈系统(ABAP+Java)的协同工作机制
SAP NetWeaver支持ABAP+Java双栈共存于同一系统实例中,形成统一的技术平台。这种架构既保留了ABAP在ERP领域的深厚积累,又融合了Java在Web、门户、集成方面的现代能力。
3.3.1 SCS(System Communication Services)跨栈通信协议
SCS是双栈系统中实现ABAP与Java互通的核心中间件。它基于RFC和HTTP协议,提供透明的远程调用能力。
例如,Java程序可通过SAP Java Connector(JCo)调用ABAP函数模块:
JCoDestination dest = JCoDestinationManager.getDestination("ABAP_SYSTEM");
JCoFunction function = dest.getRepository().getFunction("Z_GET_CUSTOMER_DATA");
function.getImportParameterList().setValue("CUSTOMER_ID", "C10001");
dest.execute(function);
参数说明 :
-Z_GET_CUSTOMER_DATA是已在ABAP侧注册的RFC-enabled函数模块;
- 数据通过导入/导出参数列表传递;
- JCo需正确配置.jcoDestination文件以建立连接。
反之,ABAP也可通过HTTP/WebService调用Java端REST API。
flowchart LR
subgraph ABAP Stack
WP[Work Process]
RFC[RFC Layer]
end
subgraph Java Stack
JC[JCo Library]
Servlet[Servlet Engine]
end
RFC <-->|SCS Gateway| JC
Servlet --> DB[(Database)]
WP --> DB
流程图说明 :ABAP与Java通过SCS网关实现双向通信。RFC请求经由SCS路由至Java端JCo适配器,反之亦然。数据库作为共享资源,由两栈共同访问。
3.3.2 共享用户会话与单一登录(SSO)的实现路径
在双栈系统中,用户只需一次登录即可访问ABAP和Java应用,得益于SAP统一用户管理(UME)与SSO机制。
关键技术点包括:
- 使用SAP Logon Ticket或X.509证书实现身份传递;
- 通过SAP Security Assertion Markup Language(SAML 2.0)实现跨域认证;
- UME统一管理用户角色与权限。
配置步骤如下:
1. 在AS Java中启用SAP Logon Tickets;
2. 配置ICF节点 /sap/bc/sec/uit_logon 支持Ticket生成;
3. 设置ABAP系统信任Java签发的Ticket(SU01 → 参数文件添加 login/create_sso2_ticket = 2 )。
3.3.3 部署单元(SDA/EAR)在混合环境中的部署模型
SAP Java应用打包为SDA(SAP Archive)文件,类似于标准EAR,但包含额外的SAP专有元数据(如 MANIFEST.MF 中的 SAP-Application-Version )。
部署流程:
1. 使用NWDS(NetWeaver Developer Studio)构建SDA;
2. 上传至System Landscape Directory(SLD);
3. 通过Software Deployment Manager(SDM)或NWDI进行发布。
支持热部署与版本滚动升级,确保业务连续性。
3.4 应用服务器的高可用与负载均衡配置
3.4.1 实例冗余与故障转移机制设计
通过部署多个应用服务器实例并接入负载均衡器,实现横向扩展与容错。
SAP推荐使用硬件负载均衡器(如F5 BIG-IP)或软件方案(HAProxy)结合Message Server实现智能分发。
3.4.2 负载分发器(Message Server)的工作原理
Message Server收集各应用服务器的负载信息(CPU、内存、进程状态),并向ICM提供最优路由建议。
客户端通过 DEFAULT.PFL 中的 ms/server_list 指定Message Server地址列表,实现自动重连。
3.4.3 集群环境下缓存一致性维护方案
使用SAP Cache Infrastructure(SCI)同步缓冲区内容,防止因缓存不一致导致数据偏差。
支持事件驱动刷新机制,确保全局视图统一。
4. 数据库层多源支持与数据管理机制
在企业级ERP系统架构中,数据库层不仅是数据存储的核心载体,更是业务逻辑执行、事务一致性保障以及跨系统集成的基石。SAP NetWeaver平台通过高度抽象和灵活配置的数据访问机制,实现了对多种异构数据库系统的无缝支持,同时在性能优化、语义建模与实时分析方面不断演进。尤其随着SAP HANA内存数据库的广泛应用,传统基于磁盘的I/O密集型处理模式已被列式存储、并行计算与原生应用开发所取代。本章将深入探讨NetWeaver数据库层如何通过统一数据访问接口实现多源兼容,并结合HANA的技术特性重构数据持久化、事务控制与BI集成流程。
4.1 异构数据库接入的通用数据访问层(UDA)
SAP长期以来致力于构建一个不依赖特定数据库厂商的应用运行环境。为此,其引入了“通用数据访问”(Universal Data Access, UDA)架构,作为连接ABAP/Java应用逻辑与底层物理数据库之间的桥梁。UDA的核心在于屏蔽不同数据库之间的语法差异、驱动实现与性能特征,使开发者能够以一致的方式进行数据操作。
4.1.1 Open SQL与Native SQL的转换机制
Open SQL是SAP ABAP语言内置的一套标准化SQL方言,专为ABAP运行时环境设计,具备良好的可移植性。它仅允许访问当前客户端会话相关的数据表(即透明表),且所有语句均经过数据库接口预处理,确保符合目标数据库的最佳实践。
SELECT belnr, buzei, dmbtr
INTO TABLE @DATA(lt_bseg)
FROM bseg
WHERE bukrs = @p_bukrs
AND gjahr = @p_gjahr.
上述代码展示了典型的Open SQL查询。尽管语法类似于标准SQL,但其执行过程经历了复杂的编译与转换阶段:
| 阶段 | 描述 |
|---|---|
| 词法解析 | 检查关键字、字段名、表名是否合法 |
| 语义绑定 | 将 bseg 映射为数据库实际表名(如 BSEG$ 或分区表) |
| 数据库适配 | 根据当前DBSL驱动生成对应数据库的SQL(如Oracle → ANSI SQL,HANA → CE函数调用) |
| 执行计划缓存 | 若已存在相同结构的语句,则复用执行计划 |
而Native SQL则允许直接向数据库发送原生命令,绕过Open SQL的安全检查与抽象层。常用于调用存储过程、执行DDL语句或使用数据库特有功能:
EXEC SQL PERFORMING on_db_line.
SELECT * FROM "ZSTATS_TABLE" WHERE "CATEGORY" = 'SALES'
INTO :lv_category, :lv_value
ENDEXEC.
注意 :Native SQL需手动处理变量绑定、字符集转换与异常捕获,且不具备跨数据库兼容性。
转换逻辑深度分析
当Open SQL语句被提交后,ABAP处理器首先将其传递给 Database Interface (DBI) ,后者调用 Database Shared Library (DBSL) 中的适配器模块。例如,在Oracle环境下, SELECT ... FROM bseg 可能被转换为:
SELECT BELNR, BUZEI, DMBTR
FROM BSEG
WHERE BUKRS = :P_BUKRS
AND GJAHR = :P_GJAHR
AND MANDT = '100' -- 自动注入客户端字段
而在SAP HANA上,则可能进一步优化为使用Calculation Engine(CE)函数,避免全表扫描:
CE_COLUMN_TABLE("BSEG", ("BELNR", "BUZEI", "DMBTR"),
("BUKRS" = :P_BUKRS, "GJAHR" = :P_GJAH))
这种动态重写能力使得同一段ABAP代码可在不同数据库平台上高效运行。
graph TD
A[Open SQL Statement] --> B{Database Type?}
B -->|HANA| C[HANA Optimized CE Call]
B -->|Oracle| D[ANSI-Compliant SELECT]
B -->|SQL Server| E[T-SQL with Hints]
C --> F[Execution & Result Fetch]
D --> F
E --> F
F --> G[Return to ABAP Stack]
该流程图揭示了UDA如何依据目标数据库类型动态选择最优执行路径。
4.1.2 数据库接口(DBSL)在物理层抽象中的角色
DBSL(Database Shared Library)是SAP提供的动态链接库集合,每个支持的数据库都有对应的 .so (Linux)或 .dll (Windows)文件,如 dboraslib.so (Oracle)、 dbmssslib.dll (SQL Server)。这些库实现了统一的C API,供ABAP内核调用。
主要职责包括:
- 连接池管理
维护多个到数据库的长连接,减少频繁建立/断开开销。 -
预编译语句缓存
存储已准备的SQL语句句柄,提升重复查询效率。 -
数据类型映射
将ABAP基本类型(如CHAR,NUMC,DEC) 映射为数据库原生类型(如VARCHAR2,NUMBER)。 -
错误码翻译
将数据库返回的错误码(如ORA-00942)转换为SAP内部消息类(如DBIF_*)。 -
批量操作支持
提供数组插入/更新接口,提升大数据量写入性能。
以下是一个简化的DBSL调用示例(伪代码):
// 初始化连接
rc = dbcon_init(&conn, "HDB", "hana-host:30015", "SYSTEM", "pass");
// 准备SQL
rc = dbstmt_prepare(conn, "SELECT COUNT(*) FROM SBOOK WHERE CARRID = ?", &stmt);
// 绑定参数
char* carrier = "LH";
dbbind_param(stmt, 1, DB_CHAR, carrier, 2);
// 执行并获取结果
rc = dbstmt_execute(stmt);
long count;
dbbind_result(stmt, 1, DB_LONG, &count);
参数说明 :
-dbcon_init: 初始化数据库连接,参数依次为连接句柄、数据库类型标识、主机端口、用户名密码。
-dbstmt_prepare: 预编译带占位符的SQL,提升后续执行速度。
-dbbind_param: 将ABAP变量绑定到SQL参数位置,防止SQL注入。
-dbbind_result: 定义接收查询结果的内存地址。
此机制保证了即使更换底层数据库,上层ABAP程序无需修改即可继续运行——只要相应DBSL库可用。
4.1.3 多数据库兼容性测试与迁移最佳实践
企业在升级或迁移到新数据库(如从Oracle迁移到HANA)时,必须进行全面的兼容性验证。SAP提供了多种工具辅助此过程:
| 工具 | 功能描述 |
|---|---|
| SQL Monitor (ST04) | 记录所有发出的SQL语句及其执行统计 |
| Database Migration Cockpit (DMC) | 自动化评估、导出、导入与切换流程 |
| Custom Code Migration (SE80 + ATC) | 扫描使用Native SQL或非兼容特性的代码 |
| HANA Readiness Check | 分析系统是否满足HANA部署要求 |
典型迁移步骤如下:
-
预检阶段
运行/SDF/HS事务码启动HANA就绪检查,识别不兼容对象(如LONG RAW字段、触发器等)。 -
影子系统测试
在非生产环境中搭建目标数据库实例,启用 Shadow Repository 记录所有SQL请求。 -
性能对比分析
使用DBACOCKPIT比较旧库与新库的执行时间、CPU消耗、I/O次数。 -
灰度切换
利用SAP Landscape Transformation (SLT) 实现双写同步,逐步切流。 -
回滚预案
配置快照与归档日志,确保可在60分钟内恢复至原系统。
案例说明 :某制造企业从IBM Db2迁移到SAP HANA过程中,发现部分财务报表因使用
ORDER BY ROWNUM导致性能下降。经分析,该语法在Db2中有效但在HANA中需改写为LIMIT+ORDER BY。最终通过ATC自动修复37处类似问题,整体响应时间提升68%。
综上所述,UDA不仅是一组技术组件,更是一种设计理念:将数据访问逻辑与物理实现解耦,为企业提供长期的技术灵活性与投资保护。
5. ABAP应用服务器工作原理与请求处理流程
5.1 用户请求的完整生命周期追踪
在SAP ABAP应用服务器中,用户请求从客户端发起至最终响应返回,经历一个结构清晰、层次分明的处理链。该过程始于网络层接收HTTP或RFC请求,终于前端展示数据或函数调用结果。理解这一全生命周期对于性能优化和故障排查至关重要。
当用户通过SAP GUI、Web浏览器或外部系统发起请求时,首先由 Message Server 进行负载均衡判断,并将请求定向至某一可用的应用服务器实例。随后,该实例的 Dispatcher 组件接管请求。Dispatcher作为中央调度器,不直接执行业务逻辑,而是负责管理请求队列(Request Queue)并将其分配给空闲的工作进程(Work Process)。
graph TD
A[客户端请求] --> B{Message Server 负载均衡}
B --> C[选定ABAP实例]
C --> D[Dispatcher 接收请求]
D --> E[存入请求队列]
E --> F[空闲工作进程获取请求]
F --> G[工作进程执行任务]
G --> H[访问数据库/调用RFC]
H --> I[生成响应]
I --> J[返回客户端]
Dispatcher采用先进先出(FIFO)策略管理请求队列,但支持优先级标记机制,例如后台作业可被降级以保障在线事务响应速度。每个工作进程在同一时间只能处理一个请求,因此系统整体并发能力取决于工作进程数量及其类型配置。
在请求分发过程中,上下文对象(Context Objects)如 SY-MANDT (客户编号)、 SY-UNAME (用户名)、 SY-TZONE (时区)等被自动注入运行时环境。这些上下文信息通过共享内存区域(如Roll Area)传递,确保跨模块调用时用户状态的一致性。
此外,Dispatcher还维护着 共享内存缓冲区 (Shared Memory Buffers),包括程序缓冲区(Program Buffer)、字典缓冲区(Dictionary Buffer)等,用于加速频繁访问的元数据和代码片段加载。若目标工作进程所需资源已缓存,则无需重复读取数据库,显著降低I/O开销。
工作进程完成处理后,将结果写回响应缓冲区,由Dispatcher封装为HTTP响应或RFC应答包,经由通信接口返回客户端。整个流程中,各组件通过操作系统级别的IPC(进程间通信)机制协同工作,保证高吞吐与低延迟。
5.2 动态程序处理与运行时环境构建
ABAP运行时的核心在于其动态加载与解释执行机制。每当用户执行事务码(Transaction Code)或调用报表程序时,系统需即时构建完整的运行时环境,涵盖程序加载、符号解析、内存分配等多个阶段。
程序缓冲区(Program Buffer)的加载与版本控制
程序首次执行时,系统从数据库表 REPOSRC 中读取源代码,并编译为内部字节码(Bytecode),存储于 程序缓冲区 (Program Buffer)。该缓冲区位于共享内存中,所有工作进程均可访问,避免重复编译。
| 缓冲区类型 | 存储内容 | 刷新命令 |
|---|---|---|
| Program Buffer | ABAP字节码 | $SYNC or SMICM |
| Dictionary Buffer | 数据库表结构、视图定义 | SE38 > Utilities |
| Constant Buffer | 常量、文本元素 | /$CU |
| Pool Buffer | 包含多个小程序的内存池 | /$PB |
若程序发生变更(如通过SE38修改代码),系统会自动标记旧版本失效,并在下次调用时重新加载。可通过事务码 SE38 中的“Activate”操作触发更新,或使用 / 命令强制刷新缓冲区。
内表(Internal Table)与字段符号的内存操作优化
ABAP运行时对内存管理极为敏感。特别是 内表 (Internal Table)的设计直接影响性能表现。三种主要类型的内表具有不同访问特性:
DATA: lt_standard TYPE STANDARD TABLE OF mara WITH NON-UNIQUE KEY matnr,
lt_sorted TYPE SORTED TABLE OF makt WITH UNIQUE KEY matnr spras,
lt_hashed TYPE HASHED TABLE OF marc WITH UNIQUE KEY matnr werks.
- Standard Table : 使用线性搜索,适合小数据集。
- Sorted Table : 自动排序,二分查找,O(log n)复杂度。
- Hashed Table : 哈希索引,O(1)访问,仅支持完整键匹配。
推荐实践是根据访问模式选择合适类型。例如,在物料主数据查询中,若频繁按 MATNR+WERKS 定位记录,应使用哈希表提升效率。
字段符号(Field Symbols)提供指针式访问能力,避免数据复制:
FIELD-SYMBOLS: <ls_data> TYPE any.
ASSIGN lt_table[ 1 ] TO <ls_data>.
<ls_data>-field = 'New Value'. " 直接修改原数据
相比 MOVE-CORRESPONDING 或 READ TABLE INTO ,字段符号减少内存拷贝次数,尤其适用于大数据结构循环处理。
CALL TRANSACTION 与 SUBMIT 的调用栈管理
CALL TRANSACTION 以对话模式执行事务码,保留用户上下文,常用于屏幕导航:
CALL TRANSACTION 'VA01' AND SKIP FIRST SCREEN.
而 SUBMIT 用于启动报表程序,支持后台运行与参数传递:
SUBMIT zreport_vb10 VIA JOB jobname NUMBER 1
TO SAP-SPOOL IMMEDIATELY
AND RETURN.
两者均在调用栈中创建新层级,可通过 SYSTEM-CALLSTACK 查看嵌套深度。过度嵌套可能导致堆栈溢出(ST22中报错SHORTDUMP ID: SYSTEM_CALLSTACK_OVERFLOW),建议限制递归层数不超过10层。
运行时环境通过 Roll Area 保存每个请求的私有变量、参数栈和调用上下文。一旦请求结束,Roll Area即被释放,保障多用户隔离。
简介:SAP NetWeaver是SAP推出的企业应用集成平台,基于服务导向架构(SOA),提供涵盖ABAP与Java双引擎的完整技术框架,支持ERP、CRM等核心业务系统及非SAP系统的无缝集成。本文深入分析其三层核心架构(客户端层、应用服务器层、数据库层),详解ABAP/Java应用服务器、Portal、BI、KM、Process Orchestration等关键组件功能,并探讨其在Web服务、数据集成、流程协同中的实现机制。结合HANA内存计算与SAP Cloud Platform的演进路径,全面展示NetWeaver在数字化转型中的技术支撑能力。
1095

被折叠的 条评论
为什么被折叠?



