金融系统开发:Coherent Bank 示例应用全解析
1. 环境准备
1.1 下载与安装
- Coherence for .NET :从下载存档中运行安装程序,按提示接受默认安装选项,使用默认安装路径,便于构建 .NET 示例应用时找到 Coherence.dll。
-
Ant 1.7+
:若未安装,可从 http://ant.apache.org/ 下载。安装后,设置
ANT_HOME环境变量为 Ant 安装目录,并将ANT_HOME\bin添加到PATH中。 -
NAnt 0.86
:从 http://nant.sourceforge.net/ 下载,将 NAnt 的 bin 目录添加到系统
PATH中。
1.2 示例应用安装
从指定网站下载
CoherentBank.zip
并解压到磁盘,会得到
CoherentBank
目录,包含
cpp
、
java
和
net
三个子目录。
2. Java 应用部署
2.1 部署步骤
-
打开命令提示符,导航到
CoherentBank\java目录。 -
编辑
build.properties文件以适配当前环境。 - 启动 H2 数据库:
ant start-db-server
若一切顺利,H2 控制台将在浏览器中打开。登录时,将 JDBC URL 改为
jdbc:h2:tcp://localhost/db/coher-ent-bank-db
,用户名设为
sa
,点击连接按钮。初始时可能没有表,但很快会解决。
4. 启动 Web 应用:
ant web-app
此命令将运行 SQL 脚本创建必要的表,构建应用,启动嵌入式 Jetty Web 服务器,并在浏览器中打开登录页面。
- 若 Web 服务器启动失败,确保端口 8080 未被占用,重试或修改
build.xml
文件中的
jetty.port
属性。
- 若浏览器未自动打开,确保
build.properties
文件中指定了正确的浏览器位置,或手动打开浏览器并访问
http://localhost:8080/bank/login
。
5. 登录:使用以下测试用户之一登录,或点击登录表单下方的“register here”链接创建自己的账户。
| 用户名 | 密码 |
| ---- | ---- |
| sele | pass |
| aca | pass |
| marko | pass |
| ivan | pass |
| mark | pass |
| patrick | pass |
6. 体验应用:进行一些交易操作,如支付账单、查看交易列表、编辑用户资料等。
7. 启动 Coherence Extend 代理服务器:
ant start-extend-proxy
这将允许 C++ 和 .NET 客户端连接到集群。
2.2 可选:运行独立缓存服务器
默认情况下,Web 应用作为支持存储的 Coherence 节点运行以简化部署,但生产环境并非如此。若要模拟更真实的环境,需取消
build.xml
中
start-web-server
目标内
-Dtangosol.coherence.distributed.localstorage=false
JVM 参数的注释。但这样做需在步骤 4 之前运行一个或多个缓存服务器,可按以下顺序启动:
ant start-db-server
ant start-cache-server (可多次运行)
ant web-app
ant start-extend-proxy
3. C++ 应用部署
3.1 部署步骤
-
打开 Visual Studio 2008 命令提示符,导航到
CoherentBank\cpp目录,确保运行 Microsoft C++ 编译器所需的所有环境变量都已正确配置。 - 构建 ATM 应用:
build
此命令将编译并链接应用,并将可执行文件和必要的配置文件复制到
dist
子目录。
3. 导航到
dist
子目录。
4. 不带参数运行应用:
atm
将输出使用说明:
Usage: atm <deposit|withdraw> <account number> <amount> <currency code>
- 对有权访问的账户运行应用,例如从 ID 为 10 的账户提取 200 美元:
atm withdraw 10 200 USD
将看到类似以下的响应:
Transaction Details
----------------------------------
Type: WITHDRAWAL
Description: ATM withdrawal ($ 200.00 @ 0.6630)
Amount: 132.6 EUR
Balance: 20745.4 EUR
- 对同一账户进行多次取款和存款操作,然后在 Web 应用中查看账户交易记录。
3.2 注意事项
目前仅支持 USD、EUR、GBP、CHF、AUD、CAD 和 JPY 这些货币。
4. .NET 应用部署
4.1 部署步骤
-
打开命令提示符,导航到
CoherentBank\net目录。 -
构建并运行
BranchTerminal示例应用:
nant run-terminal
这将构建并启动 .NET 客户端,显示按客户分组的所有账户列表,点击账户可在右侧查看交易列表。
3. 通过 Web 应用支付账单、使用 C++ 应用进行 ATM 取款和存款操作,实时观察账户余额和交易列表的更新。
4.2 应用关闭
- .NET 应用:关闭应用窗口即可。
- C++ 应用:每次执行后自动终止,无需额外操作。
- 服务器端组件:关闭较为复杂,至少需关闭 Web 服务器、Extend 代理服务器和数据库服务器。可使用以下 Ant 任务:
ant stop-cluster
运行此任务前,确保示例应用集群与网络中的其他集群完全隔离,否则可能会向生产集群发送关闭代理。若不确定,可从任务管理器中终止进程。最后,尝试使用以下 Ant 任务关闭数据库服务器:
ant stop-db-server
但此任务成功率较低,可能需从任务管理器中终止最后一个
java.exe
进程(若关闭集群后仍有多个
java.exe
进程运行,查找占用约 30 MB 内存的进程)。
5. 代码审查
示例应用的主要价值不在于其提供的功能(功能较为有限),而在于背后的实现代码,这些代码展示了一些 Coherence 最佳实践。阅读相关资料时,审查示例代码将比单纯阅读资料收获更多。还应从 http://code.google.com/p/coherence-tools/ 下载最新的 Coherence Tools 版本,示例应用中使用的大部分基础和实用类都来自这里。建议同时审查 Coherence Tools 代码和依赖它的示例应用代码,这样能更好地在后续项目中利用 Coherence Tools 类和组件。
6. 相关技术概念
6.1 缓存配置
- 缓存映射 :将缓存名称映射到缓存方案,实现灵活的缓存管理。
-
缓存方案
:包括分布式缓存方案、本地缓存方案、近缓存方案等,不同方案适用于不同场景。
-
分布式缓存方案
:通过
autostart、backing-map-scheme等元素配置,可实现数据的分布式存储和处理。 - 本地缓存方案 :适用于对数据实时性要求不高的场景,可减少网络开销。
- 近缓存方案 :在客户端本地缓存部分数据,提高访问速度。
-
分布式缓存方案
:通过
6.2 缓存事件
- 事件类型 :包括轻量级事件(lite events)和非轻量级事件(non-lite events)。
- 监听方式 :可通过编程方式或在缓存配置中注册映射监听器(map listeners),监听缓存事件。
6.3 缓存存储
- 缓存存储实现 :有内置的缓存存储实现,也可使用 JPA CacheStore 实现更复杂的存储逻辑。
- 持久化模式 :包括缓存旁路(cache aside)、读穿透(read through)、写回(write behind)和写穿透(write through)等模式,根据不同需求选择合适的模式。
6.4 聚合器和过滤器
- 聚合器 :用于对缓存数据进行聚合操作,如计算平均值、最大值、最小值等。内置了多种聚合器,也可自定义聚合器。
-
过滤器
:用于筛选缓存数据,内置了多种过滤器,如
AllFilter、AlwaysFilter、AndFilter等,可通过组合过滤器实现复杂的查询条件。
6.5 网络过滤器
- 内置网络过滤器 :包括压缩过滤器和对称加密过滤器,可提高网络传输效率和安全性。
- 自定义网络过滤器 :可根据需求实现自定义的网络过滤器。
6.6 数据绑定
使用 Windows Presentation Foundation(WPF)进行数据绑定,可实现界面与数据的实时同步更新。
6.7 性能优化
- 带宽使用 :通过最小化带宽使用,提高系统性能。
- 延迟处理 :采用合适的策略处理延迟问题,如使用缓存、异步处理等。
6.8 可扩展性
- 数据库扩展 :通过数据库集群、数据库分片、主从复制等方式实现数据库的扩展。
- Coherence 应用 :利用 Coherence 提高系统的可扩展性和可用性。
6.9 持久化无知(PI)
在设计应用时,使应用对数据持久化方式无感知,提高代码的可维护性和可移植性。
6.10 架构演进
支持架构演进,可通过实现可演化对象(evolvable objects)和序列化机制,确保在数据结构变化时系统的兼容性。
7. 总结
通过上述步骤和技术概念,我们可以全面了解和使用相关技术构建和部署一个完整的金融系统示例应用。在实际应用中,可根据具体需求选择合适的技术和配置,不断优化系统性能和可扩展性。同时,审查示例代码和 Coherence Tools 代码,学习最佳实践,将有助于提升开发能力和项目质量。
7.1 流程图
graph TD
A[环境准备] --> B[Java 应用部署]
B --> C[C++ 应用部署]
C --> D[.NET 应用部署]
D --> E[应用关闭]
E --> F[代码审查]
G[缓存配置] --> H[缓存事件]
H --> I[缓存存储]
I --> J[聚合器和过滤器]
J --> K[网络过滤器]
K --> L[数据绑定]
L --> M[性能优化]
M --> N[可扩展性]
N --> O[持久化无知]
O --> P[架构演进]
A --> G
7.2 表格总结
| 应用类型 | 部署步骤 | 关闭方式 | 注意事项 |
|---|---|---|---|
| Java 应用 | 导航目录、编辑文件、启动数据库和 Web 应用等 | 关闭服务器端组件 | 注意端口占用和集群隔离 |
| C++ 应用 | 导航目录、构建应用、运行操作 | 自动终止 | 注意支持的货币类型 |
| .NET 应用 | 导航目录、构建并运行客户端 | 关闭应用窗口 | 实时观察数据更新 |
通过以上的介绍和操作步骤,你可以顺利部署和使用相关应用,并深入理解背后的技术原理。记得在实践中不断探索和优化,以满足不同的业务需求。
8. 详细技术操作解析
8.1 缓存配置操作
8.1.1 分布式缓存方案配置
分布式缓存方案是实现数据分布式存储和处理的关键,以下是详细的配置步骤:
1.
定义
autostart
元素
:该元素决定缓存服务是否自动启动。在配置文件中添加如下代码:
<autostart>true</autostart>
设置为
true
表示自动启动,
false
则反之。
2.
配置
backing-map-scheme
:此元素用于指定缓存的后备映射方案。示例代码如下:
<backing-map-scheme>
<local-scheme>
<scheme-name>local-backing-map</scheme-name>
<service-name>LocalCacheService</service-name>
</local-scheme>
</backing-map-scheme>
这里使用了本地缓存方案作为后备映射,可根据实际需求选择其他方案。
3.
设置
scheme-name
和
service-name
:
scheme-name
用于标识缓存方案,
service-name
用于指定缓存服务名称。示例代码如下:
<scheme-name>distributed-cache-scheme</scheme-name>
<service-name>DistributedCacheService</service-name>
8.1.2 近缓存方案配置
近缓存方案可在客户端本地缓存部分数据,提高访问速度。配置步骤如下:
1.
定义近缓存方案
:在配置文件中添加如下代码:
<near-cache-scheme>
<scheme-name>near-cache-scheme</scheme-name>
<front-scheme>
<local-scheme>
<scheme-name>local-front-cache</scheme-name>
<service-name>LocalFrontCacheService</service-name>
</local-scheme>
</front-scheme>
<back-scheme>
<distributed-scheme>
<scheme-name>distributed-back-cache</scheme-name>
<service-name>DistributedBackCacheService</service-name>
</distributed-scheme>
</back-scheme>
</near-cache-scheme>
这里定义了一个近缓存方案,前端使用本地缓存,后端使用分布式缓存。
2.
配置前端和后端缓存
:根据实际需求调整前端和后端缓存的配置,如缓存大小、过期时间等。
8.2 缓存事件监听操作
8.2.1 编程方式注册映射监听器
编程方式注册映射监听器可实现对缓存事件的灵活监听。以下是示例代码:
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.MapEvent;
import com.tangosol.util.MapListener;
public class CacheEventListener implements MapListener {
@Override
public void entryInserted(MapEvent event) {
System.out.println("Entry inserted: " + event.getKey());
}
@Override
public void entryUpdated(MapEvent event) {
System.out.println("Entry updated: " + event.getKey());
}
@Override
public void entryDeleted(MapEvent event) {
System.out.println("Entry deleted: " + event.getKey());
}
public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache("myCache");
CacheEventListener listener = new CacheEventListener();
cache.addMapListener(listener);
}
}
在上述代码中,定义了一个
CacheEventListener
类实现
MapListener
接口,重写了
entryInserted
、
entryUpdated
和
entryDeleted
方法,用于处理缓存事件。在
main
方法中,获取缓存并添加监听器。
8.2.2 在缓存配置中注册映射监听器
在缓存配置中注册映射监听器可简化监听配置。示例代码如下:
<cache-mapping>
<cache-name>myCache</cache-name>
<scheme-name>myCacheScheme</scheme-name>
<listener>
<class-name>com.example.CacheEventListener</class-name>
</listener>
</cache-mapping>
在上述代码中,在
cache-mapping
元素中添加
listener
元素,指定监听器类的名称。
8.3 缓存存储操作
8.3.1 使用 JPA CacheStore
JPA CacheStore 可实现更复杂的存储逻辑。以下是使用 JPA CacheStore 的步骤:
1.
配置 JPA CacheStore
:在配置文件中添加如下代码:
<cache-mapping>
<cache-name>myCache</cache-name>
<scheme-name>myCacheScheme</scheme-name>
<cachestore-scheme>
<class-scheme>
<class-name>com.tangosol.coherence.jpa.JpaCacheStore</class-name>
<init-params>
<init-param>
<param-type>java.lang.String</param-type>
<param-value>myPersistenceUnit</param-value>
</init-param>
</init-params>
</class-scheme>
</cachestore-scheme>
</cache-mapping>
在上述代码中,指定 JPA CacheStore 的类名和持久化单元名称。
2.
实现实体类
:创建与数据库表对应的实体类,使用 JPA 注解进行映射。示例代码如下:
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class MyEntity {
@Id
private Long id;
private String name;
// Getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
8.4 聚合器和过滤器操作
8.4.1 使用聚合器
聚合器用于对缓存数据进行聚合操作。以下是使用内置聚合器的示例代码:
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.aggregator.Count;
public class AggregatorExample {
public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache("myCache");
Object result = cache.aggregate(null, new Count());
System.out.println("Number of entries in the cache: " + result);
}
}
在上述代码中,使用
Count
聚合器统计缓存中的条目数量。
8.4.2 使用过滤器
过滤器用于筛选缓存数据。以下是使用
EqualsFilter
过滤器的示例代码:
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.Filter;
import com.tangosol.util.filter.EqualsFilter;
import java.util.Map;
public class FilterExample {
public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache("myCache");
Filter filter = new EqualsFilter("getName", "John");
Map results = cache.entrySet(filter);
System.out.println("Entries with name 'John': " + results);
}
}
在上述代码中,使用
EqualsFilter
过滤器筛选出名称为
John
的条目。
9. 性能优化策略
9.1 带宽使用优化
- 数据压缩 :使用内置的压缩过滤器对网络传输的数据进行压缩,减少带宽使用。配置示例如下:
<network-filter>
<class-name>com.tangosol.net.filter.CompressionFilter</class-name>
</network-filter>
- 批量操作 :将多个操作合并为一个批量操作,减少网络请求次数。示例代码如下:
NamedCache cache = CacheFactory.getCache("myCache");
Map data = new HashMap();
data.put("key1", "value1");
data.put("key2", "value2");
cache.putAll(data);
9.2 延迟处理优化
- 缓存预热 :在系统启动时,预先将常用数据加载到缓存中,减少首次访问的延迟。示例代码如下:
NamedCache cache = CacheFactory.getCache("myCache");
List keys = Arrays.asList("key1", "key2", "key3");
cache.getAll(keys);
- 异步处理 :使用异步操作处理耗时的任务,避免阻塞主线程。示例代码如下:
NamedCache cache = CacheFactory.getCache("myCache");
cache.invokeAsync("key", new MyEntryProcessor(), new MyCompletionListener());
10. 可扩展性设计
10.1 数据库扩展
- 数据库集群 :使用数据库集群技术,如 MySQL 集群、Oracle RAC 等,提高数据库的可用性和性能。
- 数据库分片 :将数据分散存储在多个数据库节点上,提高数据库的处理能力。示例代码如下:
// 根据数据的某个属性将数据路由到不同的数据库节点
public class DatabaseShardingRouter {
public String getDatabaseNode(Object key) {
if (key.hashCode() % 2 == 0) {
return "database1";
} else {
return "database2";
}
}
}
10.2 Coherence 应用扩展
- 水平扩展 :通过增加 Coherence 节点的数量,提高系统的处理能力。
- 垂直扩展 :通过增加单个 Coherence 节点的资源,如内存、CPU 等,提高系统的性能。
11. 总结与展望
11.1 总结
通过对 Coherent Bank 示例应用的详细解析,我们深入了解了金融系统开发中涉及的多个关键技术,包括缓存配置、缓存事件监听、缓存存储、聚合器和过滤器的使用、网络过滤器配置、数据绑定、性能优化和可扩展性设计等。这些技术的综合应用可以构建出高效、稳定、可扩展的金融系统。
11.2 展望
在未来的金融系统开发中,随着业务需求的不断变化和技术的不断发展,我们需要不断探索和应用新的技术和方法。例如,结合人工智能和机器学习技术,实现智能风险评估和预测;采用区块链技术,提高数据的安全性和可信度。同时,我们还需要关注系统的安全性和合规性,确保金融系统的稳定运行。
11.3 流程图
graph TD
A[缓存配置] --> B[缓存事件监听]
B --> C[缓存存储]
C --> D[聚合器和过滤器]
D --> E[网络过滤器]
E --> F[数据绑定]
F --> G[性能优化]
G --> H[可扩展性设计]
I[数据库扩展] --> H
J[Coherence 应用扩展] --> H
11.4 表格总结
| 技术领域 | 关键技术 | 应用场景 |
|---|---|---|
| 缓存 | 缓存配置、缓存事件监听、缓存存储 | 提高数据访问速度,减少数据库压力 |
| 聚合与过滤 | 聚合器、过滤器 | 对缓存数据进行统计和筛选 |
| 网络 | 网络过滤器 | 提高网络传输效率和安全性 |
| 数据绑定 | WPF 数据绑定 | 实现界面与数据的实时同步 |
| 性能优化 | 带宽使用优化、延迟处理优化 | 提高系统性能 |
| 可扩展性 | 数据库扩展、Coherence 应用扩展 | 应对业务增长和数据量增加 |
通过不断学习和实践这些技术,我们可以更好地应对金融系统开发中的挑战,为金融行业的发展提供有力的支持。
超级会员免费看
1013

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



