2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!
第二十二章 CSP Session 管理 - Private Pages
CSP 提供了私有页面的概念。只能从同一 CSP 会话中的另一个页面导航到私有页面。私有页面对于想要限制对某些页面的访问的应用程序很有用。
例如,假设有一个名为 private.csp 的私有页面(CSP 示例页面之一)。用户无法直接导航到 private.csp(例如,通过输入其 URL)。用户只能从另一个 CSP 页面中包含的链接导航到 private.csp。引用 CSP 页面中包含的链接不能是绝对 URL,以 http:// 开头。只有相对于引用页面的路径才被私有页面方法正确加密/标记。即:下面的前两个链接将相同的令牌传递给目标私有页面 test2.csp。
<A HREF='test2.csp'>Link to private page - relative path</A> <BR>
<A HREF='/csp/samples/test2.csp'>
Link to private page - full application path</A> <BR>
此链接的散列方式不同,无法访问。
<A HREF='http://myserver/csp/samples/test2.在InterSystems IRIS医疗版里有一个文件压缩解压的适配器HS.Util.Zip.Adapter和对应的文件压缩解压业务操作HS.Util.Zip.Operations。集成产品可以使用它们进行文件的压缩和解压操作。这2个类的联机文档说明较少,这里介绍它们的使用方法。
1. 基础配置
InterSystems IRIS使用操作系统的压缩和解压缩能力,因此需要注册操作系统执行压缩解压的命令。
在管理门户的Health标签页下,选中配置注册(Configuration Registry):
.png)
在其中增加2个注册项目:
\ZipUtility\UnZipCommand 和\ZipUtility\ZipCommand,分别代表解压和压缩命令。适配器HS.Util.Zip.Adapter会检查这2个注册项并得到相应的命令。各个操作系统的命令并不一样,示例如下:
\ZipUtility\UnZipCommand 解压缩命令
| Windows | "c:\program files\7-zip\7z" x %1 -o. -r |
| 非Windows | unzip %1 -d . |
\ZipUtility\ZipCommand 压缩命令
| Windows | "c:\program files\7-zip\7z" a %1 . |
IRIS中实现zip文件的下载、解压及读取
0 前言
项目上做对账需求时,需要通过http方式下载第三方的对账的文件,是一个压缩文件,里边包含一个csv文件。
1 准备工作
1.1 安装解压缩软件
需要根据cache/iris服务器运行环境安装不同的解压缩软件。 本文是在windows环境下实现的,安装了WinRAR解压缩软件,安装目录为:”C:\Program Files\WinRAR“。
1.2 部署测试http服务器
部署一个web服务器,放一个zip文件。 本文在macOS系统中使用MAMP部署了一个简单的服务器,提供一个对外服务:http://192.168.1.107:8888/sss/Archive.zip
2 下载zip文件
主要思路: 通过http下载zip文件,然后另外到服务器上指定的文件夹下,并重命名。
代码
/// d ##class(web.test.DownloadFile).DownloadFile()
ClassMethod DownloadFile()
{
set filePath="E:\testdata"
set fileName="BCMData"_$zd(+$h,8)_".zip"
Set httprequest=##class(%Net.HttpRequest).%New()
set httprequest.使用Cache的两个痛点问题:
一、Cache作为后关系型数据库,使用其提供M语言操作Global数据结构。可以达到极快的查询速度。M语言的set赋值和初始化没有区分,加之是弱类型,非常容易出现死循环,就算你是多年老手也一个不小心就踩坑。我就经历过改代码即使很小心还是出了死循环把数据库tmp撑满的事故。
二、M语言作为完备的编程语言,结合cache数据库操作数据实在是不要太方便。同时一个复杂的业务提交到数据库通过一个M逻辑全部处理完成,极大的减少了app和数据库交互次数。复杂业务的事务就是一方面,通过TSTART、TROLLBACK 、TCOMMIT,前台一次数据库交互后台就可能做了几十张表的更新操作。直接使用事务是容易,但是极易引入开放事务锁表(你自己就算很小心,也难保调别人接口别人事务不完善,而你又没检测事务层级),锁表之后结束进程导致数据回滚。
解决办法:
据我观察出现上面两个问题的原因,第一个是M语言弱类型和没单独的初始化命令导致,就算你是老手、工作细致也难以避免。第二个不是Cache特有的,通用关系库也有事务写的不完整的问题,事务问题对开发要求高或者从框架设计可以解决。
可以基于AOP切面设计一套死循环和开放事务避免体系,从架构上解决死循环难以发现引起的数据库崩溃和开放事务问题。
首先要求程序框架有统一的调入数据库入口,才方便在入口统一实现死循环监测和开放事务监测。

前言
自接触IRIS以来在医院之中使用最多的是其作为一个ESB集成引擎来使用,作为医院的集成平台+数据中心中的一环。但是其也可以进行CRUD作为前后端分离项目的后端使用:
文章目录
前言
文章目录
一、开发技术和工具
二、开发路径和相关代码
1.数据库
2.准备工作
3.开发接口的相关步骤
4.成果展示
总结
本文章将以一个简单的页面展示IRIS的相关CRUD操作:

是的,我计划使用IRIS重构Production页面,先展示一下我开发完的成果吧:

呃の 好像是一毛一样,哈哈
一、开发技术和工具
工欲善其事,比先利其器:
后端:HealthConnect+Global
前端:vue
使用IRIS的%CSP.REST开发的Rest API接口,前端使用vue简单的把接口相关内容展示,可以编辑、新增组件,控制production启动、停止、更新检测状态。
二、开发路径和相关代码
1.数据库
首先,我们找到Production的相关表,分别是:Ens_Config.Item 和 Ens_Config.Production 如图所示:

所以代码的思路很明确了对Ens_Config.Item进行新增、删除、修改、查询操作对Ens_Config.Production进行查询操作。
2.
概述
现有Ensemble平台BS(服务)、BP(流程)、BO(操作)需对平台及开发语言有一定的了解才能实现,为简化用户操作,现对现有平台进行二次封装,通过API接口的形式进行前后端分离,通过前端界面操作实现BS(对外提供的服务)、BP、BO(逻辑处理或调用外部的服务)自动生成(通过%Dictionary实现),具体实现如下。
一、开发技术和工具
版本:Ensemble 2017.2.1
二、涉及公用类
2.1 %Dictionary.ClassDefinition(自定义类)
• property Super as %CacheString; Specifies one or more superclasses for the class. 定义一个或多个父类,继承父类
• property** ProcedureBlock** as %Boolean [ InitialExpression = 0 ]; Specifies that the class uses procedure block for method code. 设置类是否允许使用程序块,程序块强制实施变量作用域:方法无法看到由其调用方定义的变量,程序块中的任何变量都会自动成为私有变量
• relationship Parameters as %Dictionary.
第二十一章 CSP Session 管理 - 身份验证和加密
身份验证和加密
在发送到 HTTP 客户端的页面上放置状态信息是很常见的。当从这些页面发出后续请求时,会将状态信息发送回服务器。很多时候,重要的是将状态信息放置在网页上,以便 a) HTTP 源的查看者无法确定状态信息的值,并且 b) 服务器可以验证返回的信息是,实际上,从同一服务器和会话发送出去。通过其加密服务,CSP 提供了一种易于使用的机制来实现这一点。
Session Key
CSP 可以使用加密密钥对服务器上的数据进行加密和解密。每个 CSP session 都有一个唯一的会话密钥(可通对象 Key 属性中的 %CSP.Session 访问),用于加密会话数据。这种机制是安全的,因为会话密钥永远不会发送到 HTTP 客户端;它作为 %CSP.Session 的一部分保留在 CSP 服务器上,位于对象中。
可以在类中使用 %CSP.Page的 Encrypt 方法手动加密服务器上的值。可以随后使用 Decrypt 方法解密此值。
加密 URL 和 CSPToken
在某些情况下(如下所述),从 .csp 文件生成的类会自动加密发送到客户端的 URL 值(对于手动创建的类,必须在类中调用 %CSP.Page的 Link 方法才能执行此操作)。
例如,假设
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是优秀作品获得“开发者社区奖”的关键!我们先来看看目前作品排名情况吧!
CORS请求Request携带Cookie失败占用License解决方案
起因
-
因为是前后端分离的项目,前端使用的
vue2,后端iris。需要获取cooike的sessionid,每次请求时携带cookie,防止每次请求都占用一个license。 -
登录认证,保持会话期间全局变量,超时退出。
现象
下图是如果不携带cookie每次请求都会新建一个session并且占用一个license。


解决过程
所以基于上述情况,需要每次获取响应response的cookie,保存下来,下次请求request再携带保存下来的cookie。

如图Set-Cookie内容:
CSPSESSIONID- 为SessionID的CSPSessionCookieCSPWSERVERID- 服务器ID,负载均衡时会用到,如果ID不对应,则会报错。
后端方法为%CSP.Response的WriteHTTPHeaderCookies():
Method WriteHTTPHeaderCookies()
{
#Dim c,cookie,port,cookiepath
s ^yx("yx","UseSessionCookie") = %session.UseSessionCookie
s ^yx("yx","CSPSessionCookie") = %session.第二十章 CSP Session 管理 - 状态管理
状态管理
因为 HTTP 是无状态协议。为 Web 编写的应用程序必须使用特殊技术来管理应用程序上下文或状态。 CSP 提供了许多用于状态管理的机制。这些中的每一个都可能适用于特定情况。
请求之间的跟踪数据
Web 应用程序中状态管理的基本问题是跟踪连续 HTTP 请求之间的信息。有许多可用的技术,包括:
- 使用隐藏的表单字段或
URL参数在单个页面上存储数据 - 将数据存储在客户端的
cookie中 - 将数据存储在服务器上的对象中的
%CSP.Session中 - 在
Caché数据库中存储数据
在页面中存储数据
要将状态信息存储在页面中,必须放置它以便来自该页面的后续请求包含该信息。
如果页面通过超链接发出请求,则数据应放置在超链接的 URL 中。例如,这是一个包含在 .csp 文件中定义的状态信息的超链接:
<a href="page2.csp?DATA=#(data)#">Page 2</A>
当 CSP 为包含此链接的页面提供服务时,表达式 #(data)# 将替换为发送给客户端的文本中的服务器变量 data 的值。当用户选择这个指向 page2.csp 的链接时,CSP 服务器可以通过 %request 对象访问 DATA 的值。如果需要,CSP 可以对此类数据进行编码。
ObjectScript是一种面向对象的编程语言,它是InterSystems公司的Caché和Ensemble数据库的核心语言之一。ObjectScript语言的语法类似于MUMPS语言,它支持面向对象编程、过程式编程、函数式编程等多种编程范式。ObjectScript语言主要用于开发Caché和Ensemble数据库应用程序,它可以访问数据库中的数据、调用数据库中的存储过程、触发器和事件,还可以与其他编程语言进行交互。
Cache使用的语言是ObjectScript简称COS,下面展示的是其基本语法,也是我个人的COS字典:
1 系统指令
SET 缩写 s ,赋值命令,样例 - s hello ="Hello World";
WRITE 缩写 w ,向当前设备输出,样例 - w hello (特殊用法:w ! 换行、w # 清屏 )
DO 缩写 d ,执行函数,样例 – d ##class(%SYSTEM.License).ShowSummary();
Kill 缩写 k ,从堆栈中清楚变量 x,慎用(不加参数调用时候将清楚内存中的所有变量!
前言
本人因技术需要,了解到了IRIS Health产品,在听了产品介绍会之后,感觉该产品是否有趣,并且比较符合自己目前的需求,因此大概了解了下IRIS的架构。以下是本人的浅显理解,如有错误之处欢迎讨论。
本人从产品介绍和社区的文档中,了解到IRIS的大概功能分类
- InterSystems IRIS是一款数据平台,适用于软甲开发人员
- 基于FHIR
- 整合医疗全流程数据,通过机器学习和人工智能分析
- 业务优化
- 数据管理
- Sharding数据分片技术
- 分布式架构
- IRIS互操作性
- 数据分析能力
- IRIS对FHIR的支持
- 机器学习与自动化
其中结合到自己想要研究的领域,想要探索是否可以利用该产品并结合其他工具开发一套通用的专病数据库构建及应用方法。
我目前对该产品的初步定位是对自行提供的数据集合的存储和处理,其中提供包括编码规范、高效存储架构、编程接口、算法在内的辅助工具。针对数据的处理和应用,该产品做的很完善,但是对于数据的获取,例如是否支持extract-transformation-load功能,或者能否利用自定义编程接口实现流批一体化数据抽取。
在美国各地,当需要实现大规模的应用集成时,医疗行业的领导者会使用InterSystems HealthShare Health Connect®。无论是为了连接电子病历,还是为了提升床边护理决策能力,无论是为了创新远程医疗和远程护理,还是为了业务增长,亦或是为未来做准备,InterSystems和Health Connect随时准备好帮助您和您的组织实现目标。我们在此提供几个InterSystems医疗行业的集成实例以作示范。
第十九章 CSP Session 管理 - %CSP.Session 对象
对象中的 %CSP.Session 包含有关当前Session的信息以及以编程方式控制会话各个方面的方法。
User Session Data — Data Property
可以使用其 Data 属性将 %CSP.Session 中的应用程序特定信息存储在对象中。数据是一种多维数组属性,可让关联多维数组中的特定信息。该数组的内容会在会话的整个生命周期内自动维护。
可以像使用任何其他 ObjectScript 多维数组一样在对象 Data 属性中使用 %CSP.Session。
例如,如果在 OnPage 方法中执行以下代码:
Set %session.Data("MyData") = 22
然后对同一会话的后续请求(无论哪个类处理请求)在对象中的 %CSP.Session中看到此值:
Write $Get(%session.Data("MyData")) // this should print 22
注意:理解为全局变量。
在%CSP.Session 中存储应用程序特定数据的能力是一项非常强大的功能,但应该正确使用。进一步讨论请参阅“状态管理”部分。
设置用户Session数据 - 设置命令
要在对象的 %CSP.
第十八章 CSP Session 管理 - 与 CSP.Session 的Sessions
`` 是一种无状态协议;每个请求都不知道以前的请求。虽然这适用于为用户提供简单静态内容的网站,但它使得开发交互式动态 Web 应用程序变得困难。为了解决这个问题,CSP 提供了所谓的Session 管理。
与 CSP.Session 的Sessions
Session 话表示在特定时间段内从特定客户端到特定应用程序的一系列请求。
CSP 自动提供会话跟踪;无需执行任何特殊操作即可启用它。 CSP 应用程序可以通过对象中的 %CSP.Session 查询和修改其会话的各个方面。 CSP 服务器通过 ObjectScript %session 变量使该对象可用。
Session 会话创建
当 HTTP 客户端向 CSP 应用程序发出第一个请求时,会话开始。
创建新session时,CSP 服务器会执行以下操作:
- 创建一个新的会话
ID号。 - 酌情执行许可检查。
- 在对象(持久)中创建
%CSP.Session的新实例。 - 调用当前
session事件类(如果存在)的OnStartSession方法。 - 创建一个
session-cookie以便在会话过程中跟踪来自HTTP客户端的后续请求。
第十七章 CSP 中的 HTTP 请求 - %CSP.Response 对象和 OnPreHTTP 方法
%CSP.Response 对象和 OnPreHTTP 方法
可以使用对象中的 %CSP.Response 控制将哪些响应标头发送回 HTTP 客户端。 CSP 服务器自动创建此类的一个实例,并将对它的引用放在变量 %response 中。
由于 %response 对象控制 HTTP 标头,因此通常在类中的 %CSP.Page 的 OnPreHTTP 方法中设置其属性。例如,要重定向传入的 HTTP 请求,请定义以下 OnPreHTTP 方法:
Class MyApp.Page Extends %CSP.Page
{
// ...
ClassMethod OnPreHTTP() As %Boolean
{
Set %response.ServerSideRedirect = "C:\CacheSys\csp\samples\redirect.csp"
Quit 1
}
}
如果使用 CSP 类创建 CSP 页面,请使用以下代码设置标题值:
Class MyPage Extends %CSP.第十六章 CSP 中的 HTTP 请求 - %CSP.Request 对象
%CSP.Request 对象
当 CSP 服务器响应 HTTP 请求时,它将有关传入请求的信息打包到对象中的 %CSP.Request 实例中。可以使用变量 %request 来引用此对象。
URL 属性
要查找传入 HTTP 请求的 URL(不包括查询字符串),对象中使用 %CSP.Request 的 URL 属性:
Write "URL: ", %request.URL
数据属性和 URL 参数
URL 可能包含参数列表(也称为 URL 查询)对象中的 %CSP.Request 通过其 Data 属性使这些可用。
例如,假设传入的 URL 包含:
/csp/user/MyPage.csp?A=10&a=20&B=30&B=40
可以使用以下命令在服务器上检索这些参数:
Write %request.Data("A",1) // this is 10
Write %request.Data("a",1) // this is 20
Write %request.Data("B",1) // this is 30
Write %request.第十五章 CSP 中的 HTTP 请求 - 处理 CSP 错误
处理 CSP 错误
%CSP.Error是默认的 CSP 错误页面。将其用作创建的任何错误页面的超类。可以使用 %CSP.Error中提供的功能从错误中提取信息。
在授予许可证之前处理 CSP 错误
如果已经有一个现有会话并且用户尝试转到一个未找到的页面,CSP 将显示标准错误页面,因为该会话已经有一个许可证。
如果 CSP 应用程序还没有许可证,并且发生以下任何错误,则 CSP 默认显示标准 Web HTTP/1.1 404 Page Not Found 错误消息。可以通过在错误页面(通常是 %CSP.Error的子类)上为应用程序设置以下参数来更改在授予许可之前遇到错误时显示的页面。
LICENSEERRORPAGE
如果生成以下错误,CSP 会查看 LICENSEERRORPAGE 参数的值:
Cannot grant license.
LICENSEERRORPAGE 可以有以下两个值:
-
"" — 返回
HTTP/1.1 404 Page Not Found错误(默认) -
静态 HTML 页面的路径 — 显示命名的静态页面,例如
/csp/samples/static.html。
第十四章 CSP 中的 HTTP 请求 - CSP.Page 类
在 CSP 服务器上,所有 HTTP 请求都通过调用由类中的 %CSP.Page 定义的方法来处理。类中的 %CSP.Page 从不直接处理请求本身;它只是定义了处理 HTTP 请求所需的接口。实际的事件处理的 %CSP.Page 的子类完成(手动创建或作为处理 CSP 源文件的结果)。
%CSP.Page 的子类永远不会被实例化;也就是说,不会在对象中创建 %CSP.Page。 %CSP.Page 定义的方法都是类方法,不需要对象即可调用。正如我们将看到的,这些方法所需的任何状态信息都由 CSP 服务器管理的其他对象(例如%CSP.Request 和对象中的 %CSP.Session)提供。
Page 方法
在 CSP 服务器确定类中的哪个 %CSP.Page 应该处理请求后,它会设置适当的处理上下文,然后调用该类的 Page 方法。设置处理上下文包括重定向标准输出设备 ($IO),以便将所有输出(使用 Write 命令)发送回 HTTP 客户端并创建任何所需对象的实例(例如 %request、%response 和%session 对象)或局部变量。
Page 方法处理对 HTTP 请求的完整响应。它通过按顺序调用回调方法 OnPreHTTP、OnPage 和 OnPostHTTP 来做到这一点。
第十三章 CSP 中的 HTTP 请求 - CSP 服务器事件流
当 CSP 服务器收到来自 CSP 网关的请求时,它会确定该请求是针对静态页面还是针对 CSP 类的。如果是静态页面,它会立即将页面发回。如果是针对 CSP 类,它会执行以下操作:
- 确定此请求属于哪个会话。如果没有,它会启动一个新会话。
- 确保在正确的
Caché命名空间中处理请求。 - 确保对象中正确的
%CSP.Session可用,并根据HTTP请求中包含的信息在对象中创建%CSP.Request的实例。如果需要任何解密,它也会这样做。 - 构造
%CSP.Response对象以允许应用程序修改响应标头。 - 确定应由哪个类处理请求并调用其
Page方法(该方法又调用OnPage回调方法)。
CSP 服务器 URL 和类名称解析
CSP 服务器通过解释其 URL 来确定将 HTTP 请求分派到哪个类。 CSP 将 URL 分解为以下组件:
| Component | Purpose |
|---|---|
http:// |
协议 |
localhost |
网络服务器地址 |
[ |
可选,Web 服务器正在运行的端口号;默认为端口 80 |
/csp/samples/ |
目录 |
object.csp |
文件名和扩展名 |
?OBJID=2 |
查询 |
协议和服务器地址由 Web 服务器处理,与 CSP 服务器无关。
- 概述
鉴于国内医疗市场上,还有一些遗留系统使用PB9,Delphi7等开发技术,为加快开发进度,使第三方能尽快调用由Ensemble提供的标准HL7 V2的webservice服务,先提供几种常见语言调用Ensemble的HL7 V2 webservice接口例子。请大家根据实际情况测试并使用
假设在Production中加入了EnsLib.HL7.Service.SOAPService.CLS这个预制的Business Service并将其命名为PeiXunHl7SoapIn,那么,外部系统可以通过如下endpoint访问HL7 V2 Webservice
http://localhost:57772/csp/peixunpro/EnsLib.HL7.Service.SOAPService.CLS?CfgItem=PeiXunHl7SoapInCfgItem=PeiXunHl7SoapIn这是一个重要的参数,CfgItem是固定写法,PeiXunHl7SoapIn是你的BS的名称。
其中,通过参数CfgItem,可以访问由同一个Business Service类开放,但以不同的名称暴露出来的SOAP接口。
简单分享下在医院实际业务过程中%Dictionary.CompiledClass的一些应用。
一,Query查询出来的数据直接存表。
我们经常会遇到一些突如其来的检查,如:飞行检查,审计检查等等,往往一下子要查询几年的各种数据,每种数据涉及字段还非常多,数据之间还要求对上,查询耗时长,数据对比难度大,此时,我们需要把查询出来的数据直接存到临时表,数据核对和修改直接在临时表中完成,核对好的数据直接在sqldbx或者水滴等查询工具中整表导出,效率会高一些。
具体实现:按照数据要求,把表建好,Query输出字段和表字段顺序一致,按日期每天调用Query查询和插入,记录异常数据,后续单独处理。
优点:效率明显提高,数据核对和修改、导出很方便,避免了数据量大,多次查询耗时长问题。
缺点:数据量大会占用存储,记得删。
// W ##CLASS(lizw.CloseCycleData).insertDayByDay("2022-01-01","2022-06-30")
ClassMethod insertDayByDay(sd, ed)
{
k ^tmplzw("insertFromQyeryTestpara",$j)
S classOBJ=##class(%Dictionary.CompiledClass).%OpenId("lizw.
背景
Cache起源于没有SQL的1970时代,当时各种高级计算机语言才刚刚诞生,其中M语言较为独特,它的诞生就是为了在没有操作系统的机器上,进行数据存储。别忘了,Unix在1971年才发布。M语言别具一格地采用了Global多维数组,统一了复杂的内存操作和文件读写,使之成为了1970年代数据库的事实标准,特别是在医疗行业。而后Intersystems在1978年接过M语言的旗帜,在M语言上添加了SQL兼容层和ObjectScript层,前者顺应了时代的潮流,后者不仅为M语言提供了强大的OOP和各种便捷的语法糖,还让数据能以对象形式进行访问,让数据和代码更加紧密。
本文将简述多维数组、SQL、对象这3种数据操作方式,提供实例代码片段,并在运行效率、开发效率、管理效率、实用性方面讨论它们的优缺点。 为方便讨论,以学校与学生为例。对每种操作方法,都列举3种典型的用例,分别为,访问某特定ID的学生(即数据库ID索引)、访问某特定studentID的学生(即遍历唯一索引)、和访问某学校的所有人(即遍历非唯一索引)。
第十二章 CSP 中的 HTTP 请求 - CSP 运行时环境
CSP 的主要任务是提供动态内容以响应传入的 HTTP(超文本传输协议)请求。本节介绍 CSP 如何处理 HTTP 请求的基础知识。
HTTP 是一种简单的协议,其中客户端向服务器发出请求。 HTTP 是一种无状态协议;客户端和服务器之间的连接只持续为服务请求所需的时间。每个 HTTP 请求都包含一个请求标头,该标头指定请求类型(例如 GET 或 POST)、一个 URL 和一个版本号。请求还可能包含附加信息。 CSP 自动确定它应该处理哪些 HTTP 请求,将它们分派到运行在 Caché 服务器上的适当类,并将请求信息打包成易于使用的对象(例如对象中的 %CSP.Request)。
CSP 运行时环境
下图显示了 CSP 和 HTTP 请求的架构:
CSP 应用程序的运行时环境包括以下内容:
HTTP客户端(例如Web浏览器)HTTP服务器(Web服务器,例如Apache或IIS)CSP网关(Web服务器的Caché插件)Caché服务器(CSP服务器在其上运行请求的CSP应用程序)
HTTP 请求处理
下图说明了 CSP 处理 HTTP 请求时的事件流:
- 浏览器(或类似的
Web客户端)发出HTTP请求。
在生产环境中IRIS通常以故障转移集群的形态被部署,而集群中各故障转移成员的镜像状态将决定该集群在故障发生时是否能够顺利切换保障业务不中断。因此,成员状态通常也是运维团队需要巡检或监控的目标。
尽管IRIS内部API提供了丰富的集群配置、成员状态监控等一系列接口,但除Portal上的镜像监视器外,并没有特定的接口便于从外部系统访问(如进行企业级监控集成时),也没有整合好的监控接口可用与获取镜像的健康状态。但在IRIS上开发一个REST接口暴露镜像状态数据并不困难,如下所示:
Include %syMirror
Class Monitor.MirrorMonitoring Extends %CSP.REST
{
/// Default the Content-Type for this application.Kong提供了一个开源的配置管理工具(用Go语言编写),称为decK(即声明式Kong,declarative Kong)。
- 通过deck ping检查deck是否能识别你的Kong Gateway安装
deck ping
Successfully connected to Kong!
Kong version: 2.3.3.2-enterprise-edition- 通过deck dump把 Kong Gateway 配置导出到一个叫 "kong.yaml" 的文件
deck dump- 修改kong.yaml文件后, 通过 deck diff 显示区别
deck diff
updating service alerts {
"connect_timeout": 60000,
- "host": "172.24.156.176",
+ "host": "192.10.10.Hi 大家好,
我最近开始学习InterSystems IRIS 的互操作性,我发现官方文档对理解它的工作原理很有帮助,尽管我自己在实现它时仍有一些困难。在我的同事的帮助下,我成功地创建了一个系统的Demo,并从实践中学习。因此,我决定写一下文章,分享我得到的帮助,来帮助更多的其他人。
介绍
首先,让我们掌握一些基本概念:
- 互操作性 - 这个词的含义并不像它的发音那样复杂--它基本上是把各种信息从一个系统带到另一个系统的“魔术”。
- 业务主机 - 如果把互操作性比作是魔术,那么业务主机Business Host就是魔术师的魔法帽--业务主机里有能够识别和接收信息的业务服务Business Service/BS,并将其作为消息发送给业务流程BP或业务操作BO。业务操作执行所需的操作(顾名思义)并传递信息。业务流程控制着消息的流动:它们定义了消息的去向(基于你所选择的任何东西)以及它是如何被传递的。
- 适配器 - 适配器是一些我们可以用来识别和操作我们可能要处理的各种信息的类。在实践中,我们把它们作为参数和(可选)属性来访问其方法和属性
准备搭建Production
从简单的开始比较容易--让我们先想想服务和操作--比如说你有一个接收一种信息的服务,它很容易被我们唯一的操作所识别。
当生产的目的和它的部分非常清楚时,开发就比较容易。如果你愿意,画一张图或写下你希望它完成的步骤可能会有帮助。
Cache软件自带数据服务和应用服务。在实际使用中会将Cache数据服务和应用服务分别安装在不同的服务器上面,作为数据库服务器和应用服务器。数据库服务器和应用服务器通过ECP(企业缓存协议)进行数据交换。在应用服务器部署上web服务,让数据交换和应用处理分开,实现瘦数据和胖应用的系统模式。
这种早已存在于互联网行业的基础级模式,虽然解决计算资源和存储资源的合理分配的问题,但也常用来扩展了用户许可数。毕竟将数据服务和应用服务装在一台服务器上面只能满足百级的用户需求,而将数据服务和应用服务分开的二层模式,就可以满足千级的用户需求。

在二层模式下,大量用户必须访问同一个应用源地址,才能在日常繁杂的应用维护中,减少维护的成本。这样,就在所有的应用服务器和客户端之间,加上了负载均衡,这种网络服务器。它通过SNAT发布的虚拟地址,满足了上面的需求。
但同时,也将客户与应用服务器的直接对话,替换成了,负载均衡服务器与客户端,和负载均衡服务器与应用服务器段的通话。

在客户端访问负载均衡的虚拟地址的时候,通过网络的三次握手协议建立连接。
在负载均衡确认了客户端的真实性后,负载均衡再与应用服务器,也是通过网络的三次握手协议,建立连接,将应用服务器作为负载均衡的服务器池成员。再将客户端的数据转发到应用服务器。

这个看似满足解决了当下所有应用需求的方案,也存在的些不确定。
.png)


