搜索​​​​

清除过滤器
文章
Hao Ma · 一月 30, 2021

WebGateway系列(2): 配置Apache连接IRIS

## 检查Apache工作状态 确认Apache正常工作, apache的版本已经安装路径。 [root@centos7 ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Apr 24 2019 13:45:48 [root@centos7 ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2020-06-15 16:46:36 CST; 5min ago Docs: man:httpd(8) man:apachectl(8) Main PID: 6506 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" Tasks: 272 Memory: 31.3M CGroup: /system.slice/httpd.service ├─6506 /usr/sbin/httpd -DFOREGROUND ├─6592 /usr/sbin/httpd -DFOREGROUND ├─6607 /usr/sbin/httpd -DFOREGROUND ├─6608 /usr/sbin/httpd -DFOREGROUND ├─6609 /usr/sbin/httpd -DFOREGROUND ├─6610 /usr/sbin/httpd -DFOREGROUND ├─6611 /usr/sbin/httpd -DFOREGROUND ├─6612 /usr/sbin/httpd -DFOREGROUND ├─6613 /usr/sbin/httpd -DFOREGROUND ├─6622 /usr/sbin/httpd -DFOREGROUND ├─6623 /usr/sbin/httpd -DFOREGROUND └─6633 /usr/sbin/httpd -DFOREGROUND Jun 15 16:46:36 centos7 systemd[1]: Starting The Apache HTTP Server... Jun 15 16:46:36 centos7 systemd[1]: Started The Apache HTTP Server. [root@centos7 ~]# 确认httpd.conf的位置。 在CentOS7中此位置为/etc/httpd/conf, 其他linux系统可能有其他位置, 如果不确认,可以使用 find命令寻找. [root@centos7 ~]# ll /etc/httpd/conf total 56 -rw-r--r-- 1 root root 890 Jun 26 2019 healthshare.conf -rw-r--r-- 1 root root 0 Jun 26 2019 healthshare.conf_save -rw-r--r-- 1 root root 11786 Jun 30 2019 httpd.conf -rw-r--r-- 1 root root 11753 Jun 26 2019 httpd.conf.bak -rw-r--r-- 1 root root 11746 Jun 30 2019 httpd.conf2 -rw-r--r-- 1 root root 13077 Apr 24 2019 magic [root@centos7 ~]# 从Caché所在服务器用浏览器检查Apache测试页面可以访问。如果在Apache本地服务器访问, 网址为127.0.0.1(如果远端无法访问,请首先检查防火墙,后面步骤中有介绍) picture testing123 ## 关闭SELinux配置 查询确认SELinux状态为disabled [root@centos7 ~]# getenforce Disabled 如果非disabled状态,需要修改配置文件实现, 下图为修改后的文件内容,修改后重启电脑生效。 [root@centos7 ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@centos7 ~]# ## 检查防火墙 确认apache所在服务器的防火墙打开了80端口。(为简化步骤, 这里不讨论Web Server的SSL接入) [root@centos7 ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2020-06-15 17:24:15 CST; 2s ago Docs: man:firewalld(1) Main PID: 27433 (firewalld) Tasks: 2 Memory: 25.1M CGroup: /system.slice/firewalld.service └─27433 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid Jun 15 17:24:15 centos7 systemd[1]: Starting firewalld - dynamic firewall daemon... Jun 15 17:24:15 centos7 systemd[1]: Started firewalld - dynamic firewall daemon. [root@centos7 ~]# firewall-cmd --state running [root@centos7 ~]# firewall-cmd --zone=public --list-ports [root@centos7 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent Success [root@centos7 ~]# firewall-cmd --reload success [root@centos7 ~]# firewall-cmd --zone=public --list-ports 80/tcp [root@centos7 ~] 如果Caché安装在另一台服务器, Web gateway和Caché间的通信通过Caché的superserver端口(默认1972), 因此Caché所在服务器的防火墙必须运行此端口访问。 ## 对Apache调优 如果apache的工作模式为Prefork, 通过修改配置文件后重启服务,将工作模式改成“worker”(下面cat命令显示修改后的配置文件) [root@centos7 ~]# apachectl -V | grep MPM Server MPM: prefork [root@centos7 ~]# vim /etc/httpd/conf.modules.d/ [root@centos7 ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # LoadModule mpm_worker_module modules/mod_mpm_worker.so # Worker MPM parameters ServerLimit 40 StartServers 10 MaxRequestWorkers 1000 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # #LoadModule mpm_event_module modules/mod_mpm_event.so [root@centos7 ~]# systemctl restart httpd [root@centos7 ~]# apachectl -V | grep MPM Server MPM: worker [root@centos7 ~]# ## 安装Web Gateway 最新的IRIS或者HealthConnect安装包可能不包含让用户选择是否安装csp/web gateway的选项, 因此大多数情况, 用户更多的是使用专门的Web/CSP gateway的安装包来安装, 无论Apach Server 和Caché/IRIS Server是否在同一台服务器上。 以下的介绍是用WebGateway 2020.1版本安装的过程。 1. 解压缩安装包到一个临时文件夹 [root@centos7 ~]# tar -xzf WebGateway-2020.1.0.197.0-lnxrhx64.tar.gz 2. 使用touch命令在/etc/httpd/conf.d目录下创建空配置文件isc.conf Apaceh启动时会调用主配置文件/etc/httpd/conf/httpd.conf。 该文件的默认配置项中会自动include目录/etc/httpd/conf.d下的*.conf文件, 因此不同的应用创建不同的conf文件放在conf.d目录下是方便管理的通常做法。 这个.conf的文件名可以任意名字,isc.conf只是示意。(下一步安装Web Gateway时需要输入此名字)。 [root@centos7 httpd]# touch /etc/httpd/conf.d/isc.conf 同理手动 在 /opt/webgateway/bin 下面建立CSP.ini文件,并且赋予读写权限 3. 到解压后的安装包目录下的install子目录, 执行以下命令: [root@centos7 ~]# cd WebGateway-2020.1.0.197.0-lnxrhx64/ [root@centos7 WebGateway-2020.1.0.197.0-lnxrhx64]# ls install lnxrhx64 [root@centos7 WebGateway-2020.1.0.197.0-lnxrhx64]# cd install/ [root@centos7 install]# ./GatewayInstall Starting Web Gateway installation procedure. Please select WebServer type. Choose "None" if you want to configure your WebServer manually. 1) Apache 2) None WebServer type? [2] 1 Please enter location of Apache configuration file [/etc/httpd/conf/httpd.conf]: /etc/httpd/conf.d/isc.conf Enter user name used by Apache server to run its worker processes : Please enter location of Apache executable file : Apache version 2.4 is detected. Please enter destination directory for Web Gateway files [/opt/webgateway]: Do you want to create directory /opt/webgateway [Y]: Please enter hostname of your InterSystems IRIS server [localhost]: HCDEMO Please enter superserver port number for your InterSystems IRIS server [51773]: Please enter InterSystems IRIS configuration name [IRIS]: HCDEMO (注 这里的 configuration name 其实是csp.ini 中服务器的配置代称,可以任意起,不一定必填为服务器本身的hostname) Please enter directory for static CSP content [/opt/webgateway/hcdemo]: Do you want to create directory /opt/webgateway/hcdemo [Y]: Installing InterSystems IRIS Web Gateway for Apache: ------------------------------------------------------------------ Apache configuration file: /etc/httpd/conf.d/isc.conf InterSystems IRIS configuration name: HCDEMO InterSystems IRIS server address: HCDEMO InterSystems IRIS server port number: 51773 Web Gateway installation directory: /opt/webgateway ------------------------------------------------------------------ Do you want to continue and perform the installation [Y]: Updating Apache configuration file ... - /etc/httpd/conf.d/isc.conf * You need to restart your Apache server before any configuration changes will take effect. Web Gateway configuration completed! [root@centos7 install]# 安装结束后 - 检查安装目录被生成,并包含CSPGateway文件 - 检查isc.conf文件,确认文件已经被写入配置信息。 - 登录CSP Gateway管理页面查看: http://WebServer:80/csp/bin/Systems/Module.cxw 如果不是在Apache服务器访问而是远程登录该页面,此时会出现错误提示,显示CSP Gateway的版本信息和“You are not authorized to use this facility”的提醒。这是CSP Gateway的安全策略。默认不允许远程的访问,对于需要远程访问的源IP地址或者源网段,用户必须手工在CSP.ini配置文件的[SYSTEM]块里添加,比如添加 ”System_Manager=172.16.58.100",或者"System_Manger=172.16.*.*"。虽然不推荐,但"System_Manager=*.*.*.*”允许任意地址远程访问的远程访问。如果CSP.ini没有自动生成,那需要手动 在 /opt/webgateway/bin 下面建立此文件,并且赋予读写权限。 下面是添加System_Manager后的CSP.ini例子: [root@centos7 bin]# cat /opt/webgateway/bin/CSP.ini [SYSTEM_INDEX] HCDEMO=Enabled LOCAL=Enabled [HCDEMO] Ip_Address=HCDEMO TCP_Port=51773 Minimum_Server_Connections=3 Maximum_Session_Connections=6 [APP_PATH_INDEX] /=Enabled /csp=Enabled /hcdemo=Enabled [APP_PATH:/] Default_Server=HCDEMO Alternative_Server_0=1~~~~~~HCDEMO [APP_PATH:/csp] Default_Server=HCDEMO Alternative_Server_0=1~~~~~~HCDEMO [APP_PATH:/hcdemo] Default_Server=HCDEMO Alternative_Server_0=1~~~~~~HCDEMO [SYSTEM] SM_Timeout=28800 Server_Response_Timeout=60 No_Activity_Timeout=86400 Queued_Request_Timeout=60 Configuration_Initialized=Tue Nov 17 07:58:29 2020 Configuration_Initialized_Build=2001.1740 System_Manager=*.*.*.* [LOCAL] Ip_Address=127.0.0.1 TCP_Port=1972 Minimum_Server_Connections=3 Maximum_Session_Connections=6 [root@centos7 bin]# ## 登录Web Gateway管理页面的抓图 检查Web Gateway的配置文件位置,版本,log位置 ## 配置CSP Gateway到IRIS的连接,并测试从Apache登录IRIS维护界面 ### 在CSP Gateway配置页面,查看Server Access。 Server Access中会列出这本CSP Gateway连接的IRIS实例的列表。在上面的安装步骤中,当问到了“ Please enter hostname of your InterSystems IRIS server [localhost]: HCDEMO ”选择了HCDEMO, 这时这个列表中会显示有两个Server, localhost和HCDEMO. (localhost无法被删除,遗憾) 下面检查HCDEMO Server的配置 - 检查服务器地址为127.0.0.1 - 添加到Caché服务器的账号密码,默认为CSPSystem, SYS 如果IIS服务器+Web Gateway和Caché位于两个不同的服务器, 或者需要添加到另一Caché Server的连接, 需要添加Server, 如下图, 需要的配置: Caché服务器的IP,superserver端口号, CSPSystem用于的密码,服务器的类型(可选) **测试Caché Server连接成功** 双击左边菜单栏的"Test Server Connection", 确认结果中收到"Server connection test was successful: ...."的结果。 ## 访问IRIS维护主页 (可选) 从链接 http://WebServer/csp/sys/Utilhome.csp 访问IRIS维护主页System Management Portal应该可以成功了,但您会发现有部分网页内容(element)无法加载。这是因为在默认的安装中,isc.conf中CSP Gateway路径的配置的"CSPFileTypes csp cls zen cxw"中只将这4种类型的请求发送给CSP Gateway, 而被称为Static file的文件,比如.js, .css, .png等等类型的文件并没有被发送给CSP Gateway. 这是另外的一个安全机制,强制客户人工的配置是否需要从Web服务器访问IRIS维护主页。如果答案是NO, 那么访问IRIS维护页面就只能通过PWS,用IRIS服务器的52773的接口。 如果用户认为从Web服务器访问IRIS维护页面是必要的, 需要修改CSPFileTypes配置,比如修改成"CSPFileTypes *",作用是把任意类型的请求发送给IRIS。以下是安装并修改后的isc.conf文件示例。 [root@centos7 conf.d]# cat isc.conf #### BEGIN-ApacheCSP-SECTION #### LoadModule csp_module_sa "/opt/webgateway/bin/CSPa24.so" CSPModulePath "/opt/webgateway/bin/" CSPConfigPath "/opt/webgateway/bin/" Alias /csp/ "/opt/webgateway/hcdemo/csp/" SetHandler csp-handler-sa SetHandler csp-handler-sa CSPFileTypes * AllowOverride None Options MultiViews FollowSymLinks ExecCGI Require all granted Require all denied AllowOverride None Options None Require all granted Require all denied #### END-ApacheCSP-SECTION #### #### BEGIN-ApacheCSP-SECTION-HCDEMO #### Alias /hcdemo/csp/ "/opt/webgateway/hcdemo/csp/" #### END-ApacheCSP-SECTION-HCDEMO #### [root@centos7 conf.d]# 注意isc.conf修改后需要重启apache server [root@centos7 conf.d]# systemctl restart httpd [root@centos7 conf.d]# ## 访问IRIS上的其他Web Application IRIS上其他的Web Application需要经过配置才可以发送到IRIS Server。这些Web Application可能是一个访问HTTP, REST的URL, 或者是一个用户自己定义的SOAP,甚至可能是一个简单的CSP文件。要确保他们被发送给IRIS Server, 用户需要: 1. 配置Apache配置文件isc.conf, 保证请求被发送给了CSP Gateway。 可以通过CSP Gateway管理页面的HTTP Trace来确认。 2. 如果需要,配置CSP Gateway, 将请求发送给IRIS. ### 访问带文件后缀的应用 在isc.conf中的中定义的是Web Server中文件对象的地址,比如"/opt/webgateway/bin/"是CSP Gateway的.so文件的存放位置。 Alias是URL中资源地址,比如"/csp/"到定义的映射。他们在apache中注册一个有后缀的文件的发送路径, 这个配置使得访问"http://WebServer/csp/sys/Utilhome.csp"可以成功发送给CSP Gateway。 Alias /csp/ "/opt/webgateway/hcdemo/csp/" CSPFileTypes * AllowOverride None Options MultiViews FollowSymLinks ExecCGI Require all granted Require all denied 对于其他的Web Application, 比如如果需要将"http://WebServer/test/Hello.csp"成功发送给CSP Gateway, 需要添加以下配置,它把路径为”/test/"的URL发送给CSP Gateway处理。 Alias /test/ "/opt/webgateway/hcdemo/csp/" 测试连接一个SOAP服务,注意这个服务要在IRIS的Web Applicatin里配置正确,它至少可以从PWS用匿名用户访问。(关于Web Application的配置另行文档, 简单说, 要匿名访问, 要使用%Security_WebGateway的资源).测试结果: [root@centos7 conf.d]# curl http://172.16.58.100/test/test.webservice1.cls?soap_method=winter Winter is Coming... [root@centos7 conf.d]# ### 访问其他URL应用 对于 “http://172.16.58.100/api/mgmnt/v2/”这样的URL地址, 映射到CSP Gateway处理需要的配置是。下面的配置保证对"/api/"开头的,没有文件地址的URL的处理: SetHandler csp-handler-sa CSP on 请求的结果如下: [root@centos7 ~]# curl -X GET "http://172.16.58.100/api/mgmnt/v2/" [{"name":"%Api.IAM.v1","webApplications":"/api/iam","dispatchClass":"%Api.IAM.v1.disp","namespace":"%SYS","swaggerSpec":"/api/mgmnt/v2/%25SYS/%25Api.IAM.v1"},{"name":"%Api.Mgmnt.v2","webApplications":"/api/mgmnt","dispatchClass":"%Api.Mgmnt.v2.disp","namespace":"%SYS","swaggerSpec":"/api/mgmnt/v2/%25SYS/%25Api.Mgmnt.v2"},{"name":"PetStore","dispatchClass":"PetStore.disp","namespace":"DEMO","swaggerSpec":"/api/mgmnt/v2/DEMO/PetStore"}][root@centos7 ~]# 备注: 如果得到了{"msg":"错误 #8754: Unable to use namespace: USER."},或者403 forbidden, 需要在IRIS上给Web Application "/api/mgmnt"添加”%DB_USER"的权限;或者,也可以将应用的“安全设置”设成"密码",然后使用下面的命令查看: [root@centos7 conf.d]# curl -i -X GET http://172.16.58.100/api/mgmnt/v2/ -u "_system:SYS" HTTP/1.1 200 OK。。。(后面省略) [{"name":"%Api.IAM.v1","webApplications":"/api/iam","dispatchClass":"%Api.IAM.v1.disp","namespace":"%SYS","swaggerSpec":"/api/mgmnt/v2/%25SYS/%25Api.IAM.v1"},{"name":"%Api.Mgmnt.v2","webApplications":"/api/mgmnt","dispatchClass":"%Api.Mgmnt.v2.disp","namespace":"%SYS","swaggerSpec":"/api/mgmnt/v2/%25SYS/%25Api.Mgmnt.v2"},{"name":"PetStore","dispatchClass":"PetStore.disp","namespace":"DEMO","swaggerSpec":"/api/mgmnt/v2/DEMO/PetStore"}][root@centos7 conf.d]# ### CSP Gateway配置 "Application Access" 通常情况下,CSP Gateway测试成功连接IRIS Server后,会发现IRIS上的Web Application列表,并添加到自己的”APPlicaiton Access"列表里。如下图所示。每次用户在IRIS添加一个新的Web应用, 只需要在isc.conf上做相应的配置,无需人工去更新CSP Gateway的配置。 特殊的情况,如果发现某个URL无法发送到IRIS。先打开了CSP Gateway的HTTP Trace,确认CSP Gateway可以收到请求消息但无法发送到IRIS, 这是需要人工检查并且配置"Application Access".
文章
Hao Ma · 一月 30, 2021

精华文章--WebGateway系列(1): Web Gateway介绍

本文介绍InterSystems Web Gateway的安装和配置。 在2018以前的ISC产品中, InterSystems Web Gateway被称为CSP Gateway。, CSP是Cache'的页面技术。InterSystems的产品页面,Web服务等大多是CSP写成的。IRIS发布后CSP Gateway改名成Web Gateway, 但内部的配置文件,说明等等还到处可见CSP Gateway的叫法。在本文里不同的地方有这两个说法别奇怪,他们是一个东西。 IRIS通过它和外部Web服务器连接。 本文的内容适用任何ISC产品的部署,包括页面的选项Cache'. IRIS,HealthConnect, Ensemble等等。它的作用和表现是一样的。 无论您使用的是Cache',IRIS , HealthConnect还是HealthShare, 只有在生产环境中使用HTTP请求,基本上都需要使用Web Gateway。 如果需要更详细的内容,请参考在线文档:[InterSystems Web Gateway](https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI.Page.cls?KEY=PAGE_web_gateway) ### 什么是Web Gateway CSP是Cache' Server Page的缩写,如同JSP(Java Server Page)是Java的前端技术, CSP是InterSystems的前端技术。要在IRIS或者HealthConnect上提供一个HTTP服务,唯一安全可靠的技术是CSP. 创建HTTP,REST服务直接创建CSP页面, 创建SOAP服务使用%SOAP.WebService或者EnsLib.SOAP.Service, 它们都是%CSP.Page的子类,因此在IRIS的在线文档中有CSP Server的称法,指的就是IRIS中负责CSP处理的那部分功能。 CSP Server并不监听TCP端口得到HTTP消息,它只能通过CSP Gateway从Web服务器接收请求。用户的请求要先发给IIS/Apach/Nginx等Web服务器,转发给IRIS, 而Web Gateway就是Web服务器发请求给IRIS所使用的网关。 或者说, 它是InterSystems提供的给第三方Web服务器的一个组件,或者称为模块。在Windows系统中是若干DLL库文件,在LINUX环境是SO动态链接库。安装CSP Gateway就是诸如”CSPa24.so"等文件拷贝到Web服务器的目录,将这些模块配置到Web服务器,并将以.csp,.cls,.zen结尾的HTTP请求发送给IRIS。如果Web服务器和IRIS独立安装在不同的硬件服务器上(更安全的方式),发送的是TCP消息,到IRIS的superserver端口,默认是51773(Cache'是1972)。 CSP Gateway支持3种Web服务器:IIS, Apache Web Server, Nginx。 后面的链接提供了完整的在各种操作系统中ISC产品支持的Web Server的版本: [IRIS支持的第三方Web Server列表](https://docs.intersystems.com/healthconnectlatest/csp/docbook/platforms/ISP_technologies.html#ISP_webservers) 听上去是不是挺简单?那用户还有什么可糊涂的? ### Private Web Server(PWS)带来的混乱 混乱来自IRIS的安装过程会安装一个私有的Apache Web服务器,被称作PWS。它的作用有两个:支持访问维护页面;给一个测试环境提供测试Web服务的能力。在线文档是这么描述PWS的: >> The PWS is not supported for any other purpose. For deployments of http-based applications, including REST, CSP, Zen, and SOAP over http or https, you should not use the private web server for any application other than the Management Portal; instead, you must install and deploy one of the supported web servers. For information, see the section “Supported Web Servers” in the online InterSystems Supported Platforms document for this release.(**如果要部署http应用, 包括在http或者https上层的REST, CSP, Zen, SOAP,你绝不能让除Management Portal以外的任何应用使用PWS. 你必须安装一个IRIS兼容的Web服务器。了解这部分内容, 请查看InterSystems在线文档的"Supported Web Servers"部分**) 然后很多用户没有意识到这个提醒。当安装IRIS时被问到”你想要安装CSP网关并未CSP网关配置外部Web服务器(IIS和Apache)吗?"时,他们选择了“不要安装CSP网关",然后浏览器接入维护界面,开发了若干Web服务,一直没有意识使用PWS访问IRIS上的Web服务在生产环境是不可接受的。PWS是一个非常轻量级的Apache Web服务器。它的程序包在IRIS安装目录下的httpd子目录里。IRIS启动后, 它开始工作,监听IRIS上配置的Web端口,默认是57772,或者52773.它的工作机制决定了它无法承受大的负载,因此不能用于生产环境的http应用。 它和CSP/IRIS Server的连接用的是与上面讲的CSP Gateway完全相同的方式,也就是说,这里有一个PWS专用的Gateway, 我们可以称它为Private CSP Gateway。为了写的更清楚,总结了下面几点: ***CSP Gateway*** - 安装IRIS实例时用户可以选择是否安装CSP Gateway. 如果这时没选择安装,后面可以用单独的安装包安装。 - 安装的程序可以放在任何位置。比如在Linux默认放在"/opt/webgateway"目录,配置文件在Web Gateway的配置文件目录。 - 访问CSP Gateway的管理页面是 http://WebServer:80/csp/bin/Systems/Module.cxw 。 (这里的WebServer是Web服务器的地址,➕它的端口是默认的80) ***PWS*** - 安装时自动安装 - 程序和配置都在IRIS的安装目录,比如"C:/InterSystems/HealthConnect/CSP/bin/" - 访问管理页面的地址是 http://IRIS:57772/csp/bin/Systems/Module.cxw,这里的IRIS是IRIS服务器的地址,如果是本机登录,也就是localhost. 注意一点:从PWS访问IRIS管理页面, 比如 http://localhost/csp/sys/UtilHome.csp, 选择其中的 “系统管理 > 配置 > Web网关管理"进入的是PWS的配置。如果是从 http://WebServer/csp/sys/UtilHome.csp进入的IRIS管理页面, 那么同样的操作进入的是CSP Gateway的管理页面。 这很容易从页面显示的Web Server的类型和版本发现区别。 ### 其他关于部署CSP Gateway的疑问 - 一个Web服务器可以连接多个CSP Gateway吗? 如果你真正理解了CSP Gateway, 你就明白它是Web服务器工作的一部分,比如在IIS里面它就是配置的一个虚拟路径。技术上你可以多配一个,但完全没有必要。 如果要把HTTP从一个Web服务器发到多个IRIS, 可以在一个Web Gateway里配置多个"Server Access"连接。 - 一个CSP Gateway是怎么连接多个IRIS Server的? CSP Gateway可以配置多个"Server Access”, 只是要区分出收到的请求应该发给那个IRIS Server.如果分发给不同的IRIS的URL是不同的,比如CSP Gateway可以路由"/csp/demo1"到第一个IRIS, "/csp/demo2"到第2个IRIS。 - Web Server要和IRIS部署在一台服务器吗? 生产环境中, 部署单独的Web Server通常是好选择。为了安全起见,很多用户会部署Web Server的高可用。 如果Web Server和Caché/IRIS分别装在两台服务器,IRIS安装时选择“不要安装CSP网关”,在Web Server的服务器上安装单独的Web Gateway软件包,测试和Caché/IRIS的连接。 如果是Web Server和Caché/IRIS装在同一台服务器, 那么应该先安装Web Server, 然后使用Caché/IRIS安装包安装Caché, 选择 “安装CSP网关”, 这样CSP网关会被安装在Web Server的目录下, 相关的模块和Web Server配置也会自动完成。 如果顺序反过来, 那么需要手工配置Web Server, 增加的不必要的复杂步骤。 - 安装外部Web Server能使用私有Web Gateway吗? 对Web服务器有了解的用户更会有这样的疑问。既然Web Gateway只是给Web Gateway工作的程序组件,那么是否从外部服务器就可以直接使用私有的Web Gateway了,何必再多安装一个。 是的,技术上这样是可行的。前提是,1. 外部Web服务器和IRIS在一台硬件服务器上。2. 客户要对外部服务器的配置非常熟悉,可以手工配置外部Web服务器对私有Web Gateway的访问, 包括路径或者虚假路径,文件夹的访问权限,用户或者用户组的权限等等。总的说, 这样既麻烦,又不便于后期的管理,因此我推荐还是重新装一个Web Gateway。只是要分清它和私有的连接PWS的Web Gateway的区别,而永远不要让他们混在一起。 安装CSP Gateway的具体步骤请参考下面的文章: WebGateway系列(2): 配置Apache连接IRIS WebGateway系列(3): 配置IIS连接IRIS
文章
jieliang liu · 一月 27, 2021

在Caché中使用正则表达式

1.关于本文 就像Caché模式匹配一样,正则表达式也可以在Caché中用来识别文本数据中的模式--只是表达能力更强。本文简要介绍了正则表达式,以及在Caché中如何使用它。这里提供的信息基于各种来源,最值得拜读的是Jeffrey Friedl的《掌握正则表达式》一书,当然还有Caché在线文档。本文无意讨论正则表达式的所有可能性和细节。如果你想了解更多,请参考第5章中列出的信息来源。 使用模式进行文本处理有时会变得很复杂。在处理正则表达式时,我们通常有几种实体:我们正在搜索模式的文本、模式本身(正则表达式)和匹配(文本中与模式匹配的部分)。为了便于区分这些实体,本文档中使用了以下约定。 文本样本以单色字体单独列出,不加引号。 This is a "text string" in which we want to find "something". 除非不明确,否则正文中的正则表达式会以灰色背景显示,如本例。\".*?\". 需要时用不同的颜色突出显示匹配。 这是一个"text string",我们要在其中找到"something"。 代码样本会显示在如下的文本框里: set t=" This is a ""text string"" in which we want to find ""something " set r="\"".*?\""" w $locate(t,r,,tMatch) 2.一些历史(和一些小事)。 在20世纪40年代初,神经生理学家开发了人类神经系统的模型。几年后,一位数学家用一种代数来描述这些模型,他称之为"正则集"。这种代数的符号被命名为"正则表达式"。 1965年,正则表达式第一次在计算机的范畴内被提及。随着qed,一个作为UNIX操作系统一部分的编辑器,正则表达式开始传播。该编辑器后来的版本提供了一个命令序列g/正则表达式/p(全局、正则表达式、打印),在所有文本行中搜索匹配的正则表达式并输出结果。这个命令序列最终成为独立的UNIX命令行程序"grep"。 今天,许多编程语言都存在正则表达式(RegEx)的各种实现(见3.3节)。 3.Regex 101 就像Caché模式匹配一样,正则表达式也可以用来识别文本数据中的模式--只是表达能力更强。下面的章节概述了正则表达式的组成部分,它们的评估和一些可用的引擎,然后在第4章中详细介绍如何使用。 3.1.正则表达式的组成部分 3.1.1.Regex元字符 以下字符在正则表达式中具有特殊意义。 . ( ) [ ] \ ^ $ | 如果你需要将它们作为字面数使用,你需要使用反斜杠来转义。你也可以使用 \Q <literal sequence> \E显式指定字面序列。 3.1.2.文字 普通文本和转义字符被视为字面,例如:。 abc abc \f 换页 \n 换行 \r 回车 \v 标签 \0+三位数(如:0101) 八进制数Caché (ICU)中使用的regex引擎支持八进制数,最高可达\0377(十进制系统为255)。当你从另一个引擎迁移正则表达式时,请确保你了解它如何处理八进制数。 \x+两位数(如:x41) 十六进制数Caché库确实提供了更多处理十六进制数的选项,请参考文档(链接可以在5.8节找到)。 3.1.3.锚 使用锚点,你可以匹配文本/字符串中的位置,例如:。 \A 字符串的开始 \Z 字符串的末端 ^ 文本或行的开始 $ 文末或行末 \b 字词边界 \B 不字界 < 词的开头 #> 词尾 和一些RegEx引擎的行为有所不同,例如,对构成单词的确切定义以及哪些字符被视为单词定界符。 3.1.4.量词 使用正则表达式量词,你可以指定前面的元素可能出现的频率来进行匹配。 {x}正好出现x次 {x,y}最小x,最大y的出现次数。 * 0或更多;相当于{0,}。 +1或更多;相当于{1,}。 ? 0或1 量词很"贪婪",它们会尽可能多地抓取字符。假设我们有下面的文本字符串,想找到带引号的文本。 This is "a text" with "four quotes". 由于选择器的贪婪性质,正则表达式"/".*/"会找到太多的文本。 This is "a text" with "four quotes". 在这个例子中,正则表达式.*试图捕捉尽可能多的位于一对引号之间的字符。然而,由于点选择器 ( .) 也匹配引号,我们没有得到我们想要的结果。 通过一些regex引擎(包括Caché使用的引擎),你可以通过添加一个问号来控制量化符的贪婪程度。因此,正则表达式"\".*?\"现在可以匹配引号中的两部分文本--这正是我们要找的。 This is "a text" with "four quotes". 3.1.5.字符类(范围) 方括号用于指定字符的范围或字符集,例如 [a-zA-Z0-9] 或 [abcd] - 在 regex 中,这被称为字符类。一个范围可以匹配单个字符,所以范围定义中的字符顺序无关紧要--[dbac]返回的匹配结果与[abcd]相同。 要排除一个字符范围,只需在字符范围定义前面加上^(在方括号内!)。[^abc] 匹配除了a, b或c以外的任何字符. 一些regex引擎确实提供了预先定义的字符类(POSIX),例如。 [:alnum:] [a-zA-z0-9] [:alpha:] [a-zA-Z] [:blank:] [\t] … 3.1.6.Groups (组) 正则表达式的部分内容可以使用对括号进行分组。这对于将量化符应用于一组选择符,以及从同一regex内(反向引用)和从调用正则表达式的Caché对象脚本代码(捕获缓冲区)中引用分组都很有用。组可以被嵌套。 下面的regex匹配由一个三位数组成的字符串,后面是一个破折号,然后是3对大写字母和一个数字,后面是一个破折号,然后是与第一部分相同的三位数。 ([0-9]{3})-([A-Z][[0-9]){3}-\1 这个例子展示了如何使用反向引用(见下文)不仅匹配结构,而且匹配内容:反向引用(紫色)告诉引擎在结尾处寻找与开头处相同的三位数数字(黄色)。它还演示了如何将量词应用于更复杂的结构(绿色)。 上面的regex将匹配以下字符串。 123-D1E2F3-123 在这些上面是不匹配的。 123-D1E2F3-456(最后三位数与前三位数不同) 123-1DE2F3-123(中间部分不包含三个字母/数字对) 123-D1E2-123(中间部分只包含两个字母/数字对) 组也会填充所谓的捕获缓冲区(见4.5.1节)。这是一个非常强大的功能,它允许同时匹配和提取信息。 3.1.7. Alternations(交替) 使用管道字符来指定alternations,例如skyfall|done。这允许匹配更复杂的表达式,如3.1.5节中描述的字符类。 3.1.8.回溯引用 后面的引用允许您引用以前定义的组(括号中的选择器)。下面的例子显示了一个正则表达式,它匹配三个必须相等的连续字符。 ([a-zA-Z])/1/1 后面的引用由\x指定,而x代表第x个括号中的表达式。 3.1.9.优先规则 []在()之前 +和? 在序列前:ab等于a(b*),而不是(ab)*。 序列在alternation前:ab|c等于(ab)|c,而不是a(b|c) 3.2.一些理论 正则表达式的评估通常采用以下两种方法之一来实现(这里描述是简化的,请参考第5章中提到的文献进行深入讨论)。 文本驱动(DFA - Deterministic Finite Automaton) 引擎逐字逐句地检查输入文本,并尝试匹配它目前所拥有的内容。当它真正到达输入文本的结尾时,它宣布成功。 Regex-driven (NFA - Non-deterministic Finite Automaton) 引擎会逐一检查正则表达式,并尝试将其应用到文本中。当它真正到达(并匹配)最后一个标记时,它宣布成功。 方法1是确定性的,执行时间只取决于输入文本的长度。正则表达式中选择符的顺序不影响执行时间。 方法2是非决定性的,引擎会遍历正则表达式中选择符的所有组合,直到找到匹配或遇到错误。因此,当它没有找到匹配项时,这种方法特别慢(因为它必须遍历所有可能的组合)。选择符的顺序确实对执行时间有影响。但是,这种方法允许回溯和捕获缓冲区。 3.3.Regex引擎 目前有很多不同的regex引擎,有些是编程语言或操作系统的内置部分,有些是几乎可以在任何地方使用的库。以下是一些regex引擎,按评估方法分组。 DFA: grep, awk, lex. NFA:Perl、Tcl、Python、Emacs、sed、vi、ICU。 下表是各种编程语言和库中可用的regex功能的比较。 详情请点击这里:https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines 4.RegEx和Caché InterSystems Caché使用ICU库来处理正则表达式,Caché在线文档描述了它的许多功能。请参考ICU库的在线文档以了解完整的细节(包括诸如回溯引用等)--ICU的链接可以在5.8节中找到。以下章节旨在为您快速介绍如何使用它。 4.4.$match()和$locate() 在Caché ObjectScript (COS)中,两个函数$match()和$locate()提供了对ICU库提供的大部分regex功能的直接访问。$match(String, Regex) 在输入的字符串中搜索指定的Regex模式。当它找到一个匹配的模式时,它返回1,否则它返回0。 例如: w $match("baaacd",".*(a)\1/1.*") 返回1。 w $match("baacd",".*(a)\1/1.*") 返回0。 $locate(String,Regex,Start,End,Value) 就像$match()一样,以指定的regex模式搜索输入字符串。然而,$locate()给你更多的控制权,它返回更多的信息。在Start中,你可以告诉$locate应该在哪个位置开始搜索输入字符串中的模式。当$locate()找到一个匹配时,它会返回匹配的第一个字符的位置,并将End设置为匹配后的下一个字符位置。匹配的内容会在Value中返回。 如果$locate()没有找到匹配的对象,它将返回0,并且不触及End和Value(如果指定)的内容。End和Value是以引用的形式传递的,所以如果你重复使用它(例如在循环中)要小心。 例如: w $locate("abcdexyz",".d.",1,e,x) 返回3,e设为6,x设为"cde" $locate()执行模式匹配,并且可以同时返回第一个匹配的内容,如果需要提取所有匹配的内容,可以在循环中反复调用$locate(),也可以使用%Regex.Matcher提供的方法。 如果需要提取所有匹配的内容,你可以在一个循环中重复调用$locate(),或者你可以使用%Regex.Matcher提供的方法(见下一节)。 4.5.%Regex.Matcher. %Regex.Matcher提供了ICU库的regex功能,就像$match()和$locate()一样。然而,%Regex.Matcher还提供了一些高级功能,使更复杂的任务变得非常容易使用。下面的章节将重新审视捕获缓冲区,看看用正则表达式替换字符串的可能性以及控制运行时行为的方法。 4.5.1.捕获缓冲区(Buffers) 正如我们在关于组、回溯引用和$locate()的章节中已经看到的,正则表达式允许你同时搜索文本中的模式并返回匹配的内容。它的工作原理是将您想要提取的模式的部分放在一对括号中(组)。匹配成功后,捕获缓冲区包含所有匹配的组的内容。请注意,这与$locate()通过其值参数提供的内容略有不同:$locate()返回整个匹配本身的内容,而捕获缓冲区则让您访问匹配的部分内容(组)。 要使用它,你需要创建一个 %Regex.Matcher 类的对象,并将正则表达式和输入字符串传递给它。然后你可以调用%Regex.Matcher提供的方法来执行实际工作。 例1(简单组): set m=##class(%Regex.Matcher).%New("(a|b).*(de)", "abcdeabcde") w m.Locate()返回1 w m.Group(1) 返回 a w m.Group(2) 返回 de 例2(嵌套组和回溯引用)。 set m=##class(%Regex.Matcher).%New("((a|b).*?(de))(\1)", "abcdeabcde") w m.Match()返回1 w m.GroupCount返回4 w m.Group(1) 返回 abcde。 w m.Group(2) 返回 a w m.Group(3) 返回 de w m.Group(4) 返回 abcde。 (注意嵌套组的顺序--因为开头的括号标志着一个组的开始,所以内部组的索引号比外部组的索引号高) 如前所述,捕获缓冲区是一个非常强大的功能,因为它们允许您同时匹配模式和提取匹配的内容。如果没有正则表达式,您必须在第一步中找到匹配的内容(例如使用模式匹配操作符),并在第二步中根据一些标准提取匹配的内容(或部分内容)。 如果您需要对模式中的部分进行分组(例如对该部分应用量化符),但又不想用匹配部分的内容来填充捕获缓冲区,您可以通过在组前加上问号和冒号的方式将组定义为"非捕获"或"害羞",如下面的例子3。 例3。 set m=##class(%Regex.Matcher).%New("((a|b).*?(?:de))(\1)","abcdeabcde") w m.Match()返回1 w m.Group(1) 返回 abcde。 w m.Group(2) 返回 a w m.Group(3) 返回 abcde。 w m.Group(4) 返回 <REGULAR EXPRESSION>zGroupGet+3^%Regex.Matcher.1。 4.5.2.替换 %Regex.Matcher也提供了立即替换匹配内容的方法。ReplaceAll()和ReplaceFirst()。 set m=##class(%Regex.Matcher).%New(".c.","abcdeabcde") w m.ReplaceAll("xxxx") 返回 axxxxeaxxxxe。 w m.ReplaceFirst("xxxx") 返回 axxxxeabcde。 你也可以在替换字符串中引用组。如果我们在上一个例子的模式中添加一个组,我们可以通过在替换字符串中包含$1来引用它的内容。 set m=##class(%Regex.Matcher).%New(".(c).","abcdeabcde").","abcdeabcde") w m.ReplaceFirst("xx$1xx") 返回 axxcxxeabcde。 使用$0在替换字符串中包含匹配的全部内容。 w m.ReplaceFirst("xx$0xx") 返回 axxbcdxxeabcde。 4.5.3.操作限制(OperationLimit) 在3.2节中,我们了解了评估正则表达式的两种方法(DFA和NFA)。Caché中使用的正则表达式引擎是一个非确定性的有限自动机(NFA)。因此,对给定输入字符串评估各种正则表达式的持续时间可能会有所不同。[1] 您可以使用%Regex.Matcher对象的OperationLimit属性来限制执行单元的数量(所谓的簇)。执行一个簇的确切持续时间取决于你的环境。通常情况下,一个簇的执行持续时间是非常少的几毫秒。默认情况下,OperationLimit被设置为0(无限制)。 4.6.真实世界的例子:从Perl到Caché的迁移。 本节介绍了从Perl迁移到Caché的过程中与正则表达式有关的部分。Perl 脚本实际上由几十个或多或少复杂的正则表达式组成,这些正则表达式被用来匹配和提取内容。 如果Caché中没有regex功能,迁移项目就会变成一项重大工作。然而,Caché中的regex功能是可用的,Perl脚本中的正则表达式几乎可以在Caché中使用,而不需要任何改变。 下面是Perl脚本的一部分。 将正则表达式从 Perl 移到 Caché 的唯一改动是 /i 修饰符(使 regex 不区分大小写)--这必须从 regex 的结尾移到开头。 在Perl中,捕获缓冲区的内容被复制到特殊的变量中(在上面的Perl代码中是$1和$2)。在Perl项目中,几乎所有的正则表达式都使用了这种机制。为了类似于这种机制,我们在Caché对象脚本中写了一个简单的包装方法。它使用 %Regex.Matcher 对文本字符串评估正则表达式,并将捕获缓冲区的内容以列表的形式返回($lb())。 由此产生的Caché对象脚本代码如下。 如果...RegexMatch( tVCSFullName。 "(?i)[\\\/]([^\\^\/]+)[\\\/]ProjectDB[\\\/](.+)[\\\/]archives[\\\/]", .tCaptureBufferList) { set tDomainPrefix=$zcvt($lg(tCaptureBufferList,1), "U") set tDomain=$zcvt($lg(tCaptureBufferList,2), "U") } … Classmethod RegexMatch(pString as %String, pRegex as %String, Output pCaptureBuffer="") { #Dim tRetVal as %Boolean=0。 set m=##class(%Regex.Matcher).%New(pRegex,pString) set m.Locate() { set tRetVal=1 for i=1:1:m.GroupCount { set pCaptureBuffer=pCaptureBuffer_$lb(m.Group(i)) } } quit tRetVal } 5.参考资料 5.7.一般资料 概括信息和教程。 http://www.regular-expressions.info/engine.html 教程和实例。 http://www.sitepoint.com/demystifying-regex-with-practical-examples/ 几种regex引擎的比较。 https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines 常用表达式cheat sheet。 https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/pdf/ 书。 Jeffrey E. F. Friedl:"掌握正则表达式"(见http://regex.info/book.html) 5.8.Caché在线文件 关于Caché中正则表达式的用法概述。 http://docs.intersystems.com/latest/csp/docbook/ DocBook.UI.Page.cls?KEY=GCOS_regexp。 $match()的文档。 http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_fmatch $locate()的文档。 http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_flocate %Regex.Matcher的类引用。 http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=%25SYS&CLASSNAME=%25Regex.Matcher 5.9.ICU 如上所述,InterSystems Caché使用ICU引擎。全面的文档可在网上查阅。 http://userguide.icu-project.org/strings/regexp http://userguide.icu-project.org/strings/regexp#TOC-Regular-Expression-Metacharacters http://userguide.icu-project.org/strings/regexp#TOC-Regular-Expression-Operators http://userguide.icu-project.org/strings/regexp#TOC-Replacement-Text http://userguide.icu-project.org/strings/regexp#TOC-Flag-Options 5.10.工具 有许多工具支持开发人员创建正则表达式--其中一些是免费的,另一些则有商业许可。我个人的选择是RegexBuddy(http://www.regexbuddy.com/)--它提供了一套全面的交互式和可视化功能,可以创建和测试不同风味的正则表达式。 thanks for sharing!
文章
Botai Zhang · 一月 26, 2021

利用Intersystems IRIS医疗版数据平台内置多模型整合医院信息查询业务解决方案

利用Intersystems IRIS医疗版数据平台内置多模型整合 医院信息查询业务解决方案 概述: 随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。 应用链接:HealthInfoQueryLayer 关键应用:IRIS for Health、REST API、ObjectScript、Globals 、SQL、DATA LOOKUP TABLES 应用程序采用模型及应用介绍: 1.采用模型 1.1. Globals (key-value) Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals。 工具: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING 应用: 应用程序根据Globals的键值对、访问速度快的特性。应用在本次程序的Rest分派类与BP流程管理中取值应用,解决了频繁取值速度慢、实现在查找表前端页面配置操作,如:存储了SQL模型、服务配置信息等等。 1.2. SQL访问 InterSystems IRIS通过 ObjectScript、REST API及JDBC提供对数据的SQL访问. 工具: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSQL_smp 应用: 在查询业务中,三方系统不配合接口改造,导致接口实现困难问题。此时,我们采用IRIS内嵌模型ObjectScript、REST API及JDBC来实现对数据的SQL访问,来建立业务接口。 1.3. Object访问 通过ObjectScript、REST API,InterSystems IRIS提供了在Globals 存储和更改对象实例的途径。 文档: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PAGE_multimodel_object 应用: 在整个交互过程中,直接操纵InterSystems IRIS对象。ObjectScript类定义通常用作创建对象(例如患者,科室或医护人员)的模板。 建立应用案例(此应用程序以患者为例) 2.1应用搭建: 2.1.2基本环境 IRIS版本信息:IRIS for Windows (x86-64) 2020.1 (Build 215U) Mon Mar 30 2020 20:14:33 EDT [HealthConnect:2.1.0] IRIS具有JAVA、JDBC环境 可采用PostMan进行测试 2.1.2安装步骤 ①建立Rest服务 新建Web应用程序→配置分派类→配置权限。 该步骤可见图片:应用程序运行情况/webaplication(Query).png及webaplication(role).png ②配置SQL-JDBC 建立SQL连接,连接测试数据库Mysql,导入测试jhip_patient_info.sql ③配置查找表 Global-^Ens.LookupTable中查找表文件导入 ④导入代码 导入ApplicationCode中的代码,编译,打开Production, 注意:修改BO配置信息(DNS)、配置JavaGateway等 2.2应用流程 2.3应用测试 可采用Postman工具(其他工具也可以)进行测试验证 Postman可导入Query.postman_collection.json,更改IP、端口号信息、URL进行测试。 2.4应用总结 本应用程序以查询患者为案例,采用IRIS中REST API、ObjectScript、Globals 、SQL内置多种模型实现医院信息查询业务。如果有需要可根据此方案丰富业务满足需求。 最后,如果您认可此解决方案,请在系统间多模型数据库竞赛中为该应用程序投票。 投票链接:投票链接 应用程序名称:HealthInfoQueryLayer 点击Vote投票即可。 感谢各位! 集成平台应用典型案例 感谢您的分享
公告
Claire Zheng · 一月 26, 2021

投票时间!InterSystems多模型数据库竞赛

亲爱的社区开发者们! 本周进入 InterSystems多模型数据库竞赛的投票环节!是时候为你所认可的最佳方案投票了! 🔥 投票通道: 点击投票 🔥 如何投票? 使用我们全新的投票引擎和算法提名专家(Experts)和社区提名,您可以选择3个项目,分别投出心目中的第一、第二和第三位。 以下是社区排行榜说明: 社区排行榜: 名次 得分 1st 3 2nd 2 3rd 1 专家(Experts)排行榜会有更复杂的数学计算,不同级别的专家有更多的“点数”权力: 专家(Experts)排行榜: 级别 名次 1st 2nd 3rd VIP级:总经理,版主,产品经理 9 6 3 Global Masters中的专家(Expert)级 6 4 2 Global Masters中的专业(Specialist)级 3 2 1 专家投票也将为按“3-2-1”为社区排行榜贡献出分数。 投票说明 投票在 Open Exchange 竞赛页面 ,用户需要登录 Open Exchange 进行投票(使用开发者社区的账号即可登录)。 投票后您可以取消投票,将宝贵的票票投给其他更心仪的项目, 参赛者可以在投票周修复bug并进一步改进程序,欢迎订阅程序发布,不要错过 ! ➡️ 请查收最新的 InterSystems在线竞赛投票规则. 注:本文为译文,欢迎点击阅读原文,原文由Anastasia Dyubaylo撰写。
问题
Weiwei Yang · 一月 25, 2021

docker deploy

生产环境要使用80端口访问服务器,采用直接部署程序的方式,是在Linux服务器上同时部署HealthConnect和Apache。类似的现在想要使用Docker技术,在一台服务器上部署了HealthConnect和Apache容器,该如何配置http.conf文件,使80端口的请求转到HealthConnect上呢?如果这种方式不可行,有没有其他方法呢? 你好, 请参考在Openexchange中发布的例子:Example of InterSystems IRIS with external Apache and WebGateway( https://openexchange.intersystems.com/package/iris-webgateway-example)
文章
Qiao Peng · 一月 24, 2021

解决SQL适配器连接到字符集为US7ASCII的Oracle数据库的中文乱码问题

在使用xDBC连接到字符集为US7ASCII的Oracle数据库时,大家可能遇到过中文的乱码问题,尤其是使用Oracle自己的xDBC驱动的时候。 字符集为US7ASCII的Oracle数据库虽然可以保存中文数据,但给客户端带来了很多麻烦,需要对获取和提交的数据进行转码。 在Ensemble/Health Connect/InterSystems IRIS 中使用SQL适配器连接到这样的Oracle数据库时,可以使用$ZCVT函数进行转码。 1. $ZCVT函数 $ZCVT函数是广泛使用的字符串转换函数,可以做大小写转换、编码转换、URL 和 URI 转换等。我们用其编码转换能力来解决字符集转码问题。 2. 获取的SQL结果集数据有中文时 这时,Oracle的驱动返回的中文数据通常是GB码,而不是Unicode或UTF码。可以通过$ZCVT函数对GB码的数据进行转码,转换为Unicode: Set tCorrectData = $ZCVT(tOriginalData,"I","GB18030")其中$ZCVT函数的第一个参数tOriginalData是获取到到结果集字段值;第二个参数“I”说明tOriginalData是输入字符串;第三个参数“GB18030”是说明输入字符串的字符集编码是GB18030。 上面的代码会将tOriginalValue按GB18030编码转换为Unicode编码,并将转换结果赋给变量tCorrectData。 3. 发送中文数据或中文查询条件时 首先,需要将本地Unicode的中文数据转码为GB码。还是使用$ZCVT函数: Set tSendingData = $ZCVT(tOriginalData,"O","GB18030") 其中$ZCVT函数的第一个参数tOriginalData是输出的含中文数据;第二个参数“O”说明要转换输出数据;第三个参数“GB18030”是说明输出时要转换为GB18030。 上面的代码会将tOriginalValue按Unicode编码转换为GB18030编码,并将转换结果赋给变量tSendingData。 做完这一步,Oracle驱动很可能依然不认识其中的GB码中文数据。这时,需要将GB码的中文数据转换成GB明码字符串,例如你要将查询条件 中文 传给Oracle,你需要传递 D6D0CEC4过去(中的GB码为D6D0,文的GB码为CEC4),然后再使用Oracle的函数UTL_RAW.CAST_TO_VARCHAR2,将GB明码字符串转为内部使用的中文数据。所以修改后代码如下: Set tSendingData = $ZCVT(tOriginalData,"O","GB18030") Set tTmpDataHex = "" //转换为GB明码 For i=1:1:$length(tSendingData) { Set tTmpDataHex = tTmpDataHex_$zhex($ASCII(tSendingData,i)) } //使用Oracle的UTL_RAW.CAST_TO_VARCHAR2的函数 Set tSQL = "update dept_dict set dept_name = UTL_RAW.CAST_TO_VARCHAR2('"_ tTmpDataHex_"') where dept_code = '1'" 这里用到了$ZHEX和$ASCII函数,将数据转换为其编码,并转为16进制值,从而得到GB明码。关于更多的Ensemble/Health Connect/InterSystems IRIS函数,可以参考文档。 自此,应该可以解决从Ensemble和Health Connect连接到字符集为US7ASCII的Oracle数据库所遇到的各种中文乱码问题了。 如果您遇到更多的问题,欢迎在社区提问。 点赞
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(3):InterSystems IRIS独立组件

这是“IRIS数据库在医疗行业发展”系列课程的第三讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS独立组件。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(2):InterSystems IRIS分析能力

这是“IRIS数据库在医疗行业发展”系列课程的第二讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS强大的分析能力。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
文章
Claire Zheng · 一月 21, 2021

【视频】IRIS数据库在医疗行业发展(1):InterSystems IRIS架构

这是“IRIS数据库在医疗行业发展”系列课程的第一讲,InterSystems中国技术总监乔鹏为您介绍InterSystems IRIS架构。InterSystems IRIS数据平台是全球首款且唯一一款专门设计用于从医疗数据中提取价值的数据平台。
文章
Claire Zheng · 一月 21, 2021

InterSystems IRIS History Monitor仪表盘界面展示

大家好! 我想跟大家分享一个个人项目,该项目始于工作中的一个简单需求:“能否知道我们使用了多少个Caché许可证?” 在阅读社区的其他文章时,我发现了一篇David Loveluck写的非常棒的文章:APM——使用Caché History Monitor。 我根据David的这篇文章,开始使用Caché History Monitor并显示所有这些信息。 在面临“选择哪种很酷的技术”这个问题时,我决定使用简单而强大的CSP,这样我的客户可以认识到Caché不仅仅是MUMPS/终端。 在创建了页面以显示许可、数据库增长和CSP会话的历史记录后,我决定为System Dashboard和进程页面创建一个新设计。 我的Caché实例运行得良好。 但是,如果使用IRIS呢?根据Evgeny Shvarov的文章:在InterSystems IRIS开发存储库中使用Docker,我实现了docker技术,并把代码放到了GitHub上,现在大家只需几个步骤就可以进行尝试。 如何运行? 如要使用这里的repo进行编码,请执行以下操作: 1. 通过Clone/git命令将repo 更新到任意本地目录中: $ git clone https://github.com/diashenrique/iris-history-monitor.git 2. 打开这个目录下的终端,并运行: $ docker-compose build 3. 在项目中运行IRIS容器: $ docker-compose up -d 如何测试 打开浏览器,并转到链接:http://localhost:52773/csp/irismonitor/dashboard.csp 使用用户名_SYSTEM可以运行仪表盘dashboard和其他功能。 系统仪表盘 系统仪表盘(System Dashboard)可展示: ·许可 ·系统时间 ·应用程序错误 ·缓存过程 ·CSP会话 ·Lock Table ·日志空间 ·日志状态 ·ECP AppServer ·ECP DataServer ·编写守护进程 ·缓存效率 ·严重警告 折线图小工具每5秒绘制一个点: 系统菜单 系统进程 进程过滤器 通过使用不同的过滤器可以实现你所需的结果。也可以使用“Multiple Sort(多重排序)”,按Shift +单击列标题,甚至可以将数据网格导出到Excel! History Monitor(历史记录监控器) CSP会话和许可的History Monitor可显示三个部分的信息: ·每5分钟 ·每天 ·每小时 “Database Growth”部分只显示当日信息。历史记录页面共享以下功能: Date Range Picker(日期选择插件) 默认值为“过去7天” Chart / Data Table(图表/ 数据表) 在每个部分的右上角有两个按钮(Chart / Data Table [图表/ 数据表]) Data Table(数据表)显示创建图表所用的信息,同样可以以Excel格式下载。 Excel中显示CSP中定义的相同格式、内容和组。 缩放 所有图表都有Zoom(缩放)选项,以可视化方式显示更多详细信息。 平均值和最大值 对于“每小时”和“每天”部分,图表显示的是平均值和最大值。 平均值 最大值 希望这篇文章对您有用! 注:本文为译文,点击此处阅读原文,原文由Henrique Gonçalves Dias撰写。
文章
Claire Zheng · 一月 20, 2021

使用内置的REST API监控InterSystems IRIS

我们不必等待SAM发布才开始规划和试用该API来监控IRIS实例。在以后的文章中,我将更深入地探讨可用的指标及其意义,并提供一些交互式仪表板的示例。首先,我将介绍一下相关背景和一些问题及答案。 IRIS(和Caché)一直在收集自身及其运行平台的数十个指标。收集这些指标来监控Caché和IRIS的方法向来有很多。我发现,很少有安装软件使用IRIS和Caché的内置解决方案。譬如,History Monitor作为性能和系统使用指标的历史数据库,已经推出很长时间了,但它没有简便方法可实时显示这些指标和仪表系统。 IRIS平台解决方案(以及整个业界)正在从仅在一些本地实例上运行的单体式应用程序过渡到“随处”部署的分布式解决方案。在许多用例中,原有的IRIS监控方案并不适用于这些新的模式。InterSystems没有做重复工作,而是将目光投向当前流行的、经过验证的监控和告警开源解决方案。 Prometheus? Prometheus是一个基于成熟技术、应用广泛的著名开源监控系统,具有多种多样的插件。Prometheus的设计目的是在云环境中很好地运行,但它同样适用于本地环境。Prometheus的插件包括操作系统、web服务器(如Apache)和许多其他的应用程序。Prometheus通常与前端客户端(如Grafana)一起使用,后者可提供极具定制性的一流UI/UX体验。 Grafana? Grafana也是开源平台。随着本系列文章的深入,我将提供常见场景监控仪表板的示例模板。在这些示例模板的基础上,你可以进一步设计自己想要的各种仪表板。将IRIS指标与你的整个解决方案堆栈的各项指标适当结合,就可以发挥真正的威力;各项指标来自于平台组件、操作系统、IRIS,尤其是当你在应用程序中添加仪表功能的时候。 我以前见过这种方法吗? 使用Prometheus和Grafana监控IRIS与Caché并不是新出现的方法。几年来,我一直使用这些应用程序监控我的开发和测试系统。在开发者社区中搜索“Prometheus”,就可以找到一些其它文章,这些文章讲述了如何显示Caché指标,以供Prometheus使用。 跟过去不同的是,现在的/api/monitor API是内置的,而且默认启用。用户无需为显示指标而自己编写类。 Prometheus入门 在这里简单介绍一下Prometheus和一些术语。希望读者能够深入学习并打下一定基础,这将有助于你思考如何运用IRIS或其他来源提供的各项指标或将其可视化。 Prometheus的工作方式是抓取或提取由作为HTTP端点的应用程序(IRIS /api/monitor等API)所公开的时间序列数据。现有的导出器和客户端库适用于多种语言、框架、开源应用程序(例如Apache等web服务器)、操作系统、docker、Kubernetes、数据库和现在的IRIS。 导出器用于将应用程序和服务仪表化,并公开端点上的相关指标以进行抓取。核心导出器支持各种标准组件,例如web服务器、数据库等。其他多种开源导出器可从Prometheus社区获取。 Prometheus术语 有几个关键术语需要了解: ·目标 是指你关心的服务所处的位置,例如主机、应用程序或服务(如:Apache、IRIS或你自己的应用程序)。 ·Prometheus 通过HTTP抓取目标,以收集指标作为时间序列数据。 ·时间序列数据 是通过应用程序(如IRIS)或导出器公开的。 ·导出器 可用于你无法控制的数据,譬如Linux内核指标。 ·生成的时间序列数据 存储在本地Prometheus服务器上的一个数据库中**。 ·这个时间序列数据库 可以使用优化的查询语言(PromQL)进行查询,以便创建警报或者由客户端应用程序(如Grafana)在仪表板中显示指标等。 **剧透警告:出于安全性、扩展性、高可用性及运营效率方面的考虑,在新的SAM解决方案中,Prometheus时间序列数据所使用的数据库是IRIS数据库!但对IRIS平台的Prometheus数据库的访问是透明的,而应用程序(如Grafana)对这些访问既不知道也不关心。 Prometheus数据模型 该API返回的指标是Prometheus格式的。Prometheus采用基于文本的简单指标格式,每行一个指标,格式如下: [ (timen, valuen), ....] 指标可将标签作为(键,值)对,而标签是将指标作为维度过滤的强大方法。例如,检验IRIS /api/monitor返回的一个指标──日志可存储空间: iris_jrn_free_space{id="WIJ",dir=”/fast/wij/"} 401562.83 标识符反映了指标的含义和来源: iris_jrn_free_space 多个标签可用于修饰指标,然后用来过滤和查询。在这个例子中,可以看到WIJ及其存储目录: id="WIJ",dir="/fast/wij/" 此外,还有一个值:401562.83(MB)。 有哪些IRIS指标可供使用? 预览版文档资料中含有一个指标列表。但要注意,其中的内容可能会有所调整。你也可以查询/api/monitor/metrics端点以查看列表。我使用的是Postman,关于这一点,我将在下一篇文章中进行阐述。 我应该监控什么? 考虑怎样监控你的系统和应用程序时,请记住以下要点: 1. 尽可能将影响用户的关键指标仪表化 o用户并不关心你的某台机器是否缺少CPU。 o用户关心的服务是否缓慢或出错。 o你的主仪表板应显示那些直接影响用户的高级指标。 2. 仪表板应避免显示大量图表 o人无法一次性处理太多数据。 o例如:每项服务都有一个仪表板。 3. 关注服务,而不是机器 o将问题定位到某项服务之后,你就可以接着往下找原因,看看是否是哪台机器出了问题。 参考资料 文档资料和下载 Prometheus:https://prometheus.io/ Grafana:https://grafana.com/ 在InterSystems 2019年全球峰会上,我简要介绍了预发布版SAM(包括Prometheus和Grafana);你可以在InterSystems学习服务网站上找到相关链接。如果此链接无效,请访问InterSystems学习服务网站,并搜索:“System Alerting and Monitoring Made Easy”。 你也可以在社区中搜索“Prometheus”和“Grafana”。 注:本文为译文,欢迎点击阅读原文,原文由Murray Oldfield撰写
文章
Claire Zheng · 一月 20, 2021

InterSystems API 管理器简介

大家可能已经听说过,我们近期推出了InterSystems API管理器 (以下简称IAM)。InterSystems IRIS数据平台™新增了一项功能,支持用户监视、控制和管理IT基础架构中基于Web的API间通信。 在本文中,我将向大家展示如何设置IAM,并重点介绍IAM中可用的一些功能。InterSystems API管理器可提供你所需的一切功能。 监视基于HTTP的API通信,并了解谁在使用你的API、你最受欢迎的API是什么,哪些可能需要重新实现。 使用多种方式对API用户进行控制及限制。从简单的访问限制、API流量限制,到请求有效负载微调,你可以进行细粒度控制并快速做出反应。 使用集中式安全机制(如OAuth2.0或密钥和令牌身份验证)保护API。 招募第三方开发人员,为第三方开发人员提供一个专门的开发门户来满足他们的需求,并从一开始就为他们提供良好的开发体验。 扩展API需求并实现低延迟响应。 我很高兴为大家介绍IAM,让您一睹为快。 入门 从WRC Software Distribution站点下载IAM,并将其部署为自身的docker容器。 请确保满足以下最低要求: Docker引擎可用。最低支持版本是17.04.0+。 Docker-compose CLI工具可用。最低支持版本是1.12.0+。 第一步需要加载docker镜像,通过如下: docker load -i iam_image.tar 这样一来,IAM镜像可在你的计算机进行后续使用。IAM作为一个独立运行的容器,可以单独从InterSystems IRIS后端对其进行扩展。 启动IAM前,需要访问IRIS实例来加载所需的许可证信息。须进行以下配置更改: 启用/api/IAM web应用程序 启用IAM用户 更改IAM用户密码 现在,我们可以开始配置IAM容器了。在distribution tarball里可以找到一个名为“iam-setup”的Windows和Unix系统脚本。该脚本可帮助你正确地设置环境变量,使IAM容器能够与InterSystems IRIS实例建立连接。这是我在Mac终端会话中的运行示例: source ./iam-setup.sh Welcome to the InterSystems IRIS and InterSystems API Manager (IAM) setup script.This script sets the ISC_IRIS_URL environment variable that is used by the IAM container to get the IAM license key from InterSystems IRIS.Enter the full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1Enter the IP address for your InterSystems IRIS instance. The IP address has to be accessible from within the IAM container, therefore, do not use "localhost" or "127.0.0.1" if IRIS is running on your local machine. Instead use the public IP address of your local machine. If IRIS is running in a container, use the public IP address of the host environment, not the IP address of the IRIS container. xxx.xxx.xxx.xxx Enter the web server port for your InterSystems IRIS instance: 52773Enter the password for the IAM user for your InterSystems IRIS instance: Re-enter your password: Your inputs are:Full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1IP address for your InterSystems IRIS instance: xxx.xxx.xxx.xxxWeb server port for your InterSystems IRIS instance: 52773Would you like to continue with these inputs (y/n)? yGetting IAM license using your inputs...Successfully got IAM license!The ISC_IRIS_URL environment variable was set to: http://IAM:****************@xxx.xxx.xxx.xxx:52773/api/iam/licenseWARNING: The environment variable is set for this shell only!To start the services, run the following command in the top level directory: docker-compose up -dTo stop the services, run the following command in the top level directory: docker-compose downURL for the IAM Manager portal: http://localhost:8002 我隐藏了IP地址和密码,但这足以让大家了解配置是多么简单。现在我们得到了开始下一步前所需的全部内容:InterSystems IRIS实例的完整镜像名称、IP地址和端口,以及IAM用户密码。 现在可以通过执行以下命令启动IAM容器: docker-compose up -d 该命令将开始协调IAM容器,并确保以正确的顺序启动所有内容。 你可以使用以下命令检查容器的状态: docker ps 在浏览器中输入localhost:8002会出现基于web的用户界面: 因为这是一个全新的节点,所以全局报告中未显示任何吞吐量。但我们很快就会改变这个情况。我们可以看到,IAM支持“Workspace(工作区)”概念,将工作划分为“module”和/或“team”。向下滚动并选择“default”工作区会将我们带到“Dashboard”界面。我们将在“default”工作区开始首次实验。 同样,这个工作区的请求数量也是零,但是你可以先在左侧的菜单中了解一下API网关的重要概念。前两个元素——即服务和路由——是最重要的。服务是指向用户公开的API。因此,IRIS实例中的REST API被视为一种服务,就像你所使用的Google API一样。路由决定应将传入请求路由到哪些服务。每个路由都有一组特定的条件,如果满足这些条件,就会将请求路由到相关的服务。大家需要了解的是,路由可以匹配发送者的IP或域、HTTP方法、部分URI,或者其中的几种。 现在让我们创建一个IRIS实例的服务,其值如下: 保留其他所有内容的默认设置。现在让我们创建一个路由: 同样,对其他所有内容保留默认设置。默认情况下,IAM正在监听端口8000上的传入请求。从现在开始,发送到http://localhost:8000并以/api/atelier路径开头的请求将被路由到IRIS实例。 让我们在REST客户端尝试一下(我使用的是Postman)。 向http://localhost:8000/api/atelier/发送一个GET请求会从IRIS实例返回一个响应。每个请求都经过IAM,并监视HTTP状态码、延迟和用户(如果已配置)等指标。我接着发出了另外几个请求(包含对不存在的端点的两个请求,如/api/atelier/test/),可以在Dashboard中看到汇总: 使用插件 既然已经有了一个基本的路由,那么可以开始管理API流量了。现在我们可以开始添加补充服务的行为。现在可以创造奇迹了。 执行某种行为最常见的方法就是添加插件。插件可提供一些功能,并且通常可以附加到IAM的某个部分。它们可能会对全局运行产生影响,也可能只对单个用户(组)、服务或路由等产生影响。首先,我们在路由中添加限速插件。此时需要确保插件和路由之间建立的链接是路由的唯一ID。这些可以从路由的详细信息里找到。 如果按照本文的步骤进行,那么你的路由ID是不一样的。复制ID继续下一步。 单击左侧工具栏菜单上的“Plugins”。通常可以在此界面上看到所有的活动插件,但由于这个节点相对较新,所以未显示任何活动插件。选择“Add New Plugin”继续下一步。 我们要选择的插件在“Traffic Control”类中,名为“Rate Limiting”。选中该插件。由于插件非常灵活,所以我们可以在这里定义非常多的字段,但现在我们只关心两个字段: 如上所示,插件已配置并处于活动状态。你可能已经发现有多种时间间隔可以选择,比如分钟、小时或天。我特意选择了分钟,因为这样可以让我们很容易理解这个插件产生的效果。 如果在Postman中再次发送相同的请求,会发现响应返回了两个附加的头信息:XRateLimit-Limit-minute (value 5) 和XRateLimit-Remaining-minute(value 4)。这是在告诉客户端,每分钟最多可以调用5次,并且在当前时间间隔内还有4个请求可用。 如果不断地发出相同的请求,最终会用完可用配额,得到一个带有以下负载的HTTP状态码429: 等这一分钟结束后,就可以再次调用。这是一个非常方便的机制,可以完成以下工作: 1. 确保后端避免高峰值 2. 为客户端设置一个期望值,即允许以透明的方式为服务进行多少次调用 3. 引入分级制有望从API流量中获利(例如,青铜级别每小时调用100次,而黄金级别则不受限制) 你可以为不同的时间间隔设置值,从而在一定时期内平滑API流量。假设允许某条路由每小时进行600次调用,平均每分钟调用10次。但是,你没有阻止客户端在一小时的第一分钟就用光600次调用(也许这就是你想要的)。也行你想让负载在一个小时内分配得更均匀。将config_minute字段设置为20,这样就可以确保用户每分钟调用的次数不超过20次,每小时不超过600次。这将使分钟级别的间隔出现一些峰值,因为它们平均每分钟只能调用10次,但用户不能在一分钟内用完一小时配额。现在,至少需要30分钟,系统才会达到满负荷运行。客户端将在每个配置的时间间隔内收到附加标头,例如: header value X-RateLimit-Limit-hour 600 X-RateLimit-Remaining-hour 595 X-RateLimit-Limit-minute 20 X-RateLimit-Remaining-minute 16 当然,可以采用多种不同的方法配置rate-limits,这取决于你想要实现的目标。 对此我不再做过多介绍,因为作为一篇介绍InterSystems API Manager的文章,上述介绍已经足够了。IAM还可以用来实现更多的事情。我们刚刚只用了40多个插件中的一个,甚至还没有使用到所有的核心概念,你还可以实现以下任务: 为所有服务添加集中式身份验证机制 通过负载均衡请求扩展到支持同一组API的多个目标 向更小的受众介绍新特性或bugfixes,并在向大家发布之前监视的进展情况 为内部和外部开发人员提供一个专用的、可自定义的开发人员门户,记录他们有权访问的所有API 缓存常见的请求响应,以减少响应延迟和服务系统上的负载 所以,请大家试一试IAM,并在下面评论区留下建议。我们努力推出这一功能,希望了解大家可以使用这项技术克服哪些挑战。 更多资源 官方新闻稿:InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities 短动画视频概述:什么是InterSystems API Manager?(英文) What is InterSystems API Manager 8分钟小视频带你了解主要亮点:InterSystems API管理器简介(英文) Introducing InterSystems API Manager 选自IRIS文档部分内容:InterSystems API管理器文档(英文) InterSystems API Manager Documentation 注:本文为译文,欢迎点击查看原文,原文由Stefan Wittmann撰写 IAM 是只能在docker 里运行吗? 对,目前IAM提供的是容器版本。如果有对IAM的需求,可以联系InterSystems的销售和销售工程师。 欢迎联系Intersystems 中国服务热线:400-601-9890,谢谢!
文章
Claire Zheng · 一月 20, 2021

InterSystems IRIS医疗版2020.1 HL7基准测试

简介 最近完成了针对IRIS医疗版2020.1版本的性能及可扩展性基准测试,重点关注HL7v2的互操作性。本文介绍了在各种工作负载下观察到的吞吐量,并提供了IRIS医疗版用作HL7v2消息传输互操作性引擎时的系统常规配置和调整准则。 基准测试模拟了与实际环境接近的工作负载(详细信息请参见“工作负载说明和方法”部分)。本次测试的工作负载包括HL7v2患者管理(ADT)和生命体征结果(ORU)数据,并包含数据内容转换和路由。 IRIS医疗版2020.1版本可以表明,采用第二代Intel®Xeon®可扩展处理器和Intel®Optane™SSD DC P4800X系列SSD存储的商用服务器,每天的持续消息吞吐量超过23亿条(入站和出站总量),与此前的Ensemble 2017.1 HL7v2吞吐量基准测试相比,扩展性提高了一倍多。 在这些测试过程中,将IRIS医疗版配置为先进/先出(FIFO)顺序,并且在磁盘中完整保存每个入站和出站消息以及消息队列信息。通过持久化消息队列和消息内容,IRIS 医疗版能够在系统崩溃时提供数据保护,并提供完整的历史消息搜索和重新发送功能。 下面将继续介绍配置准则,帮助您选择适当的配置和部署,以充分满足工作负载性能和可扩展性需求。 通过实验结果可以证实,IRIS 医疗版能够满足商用硬件上的极端消息吞吐量需求,并且在大多数情况下支持仅用单个小型服务器可为整个组织提供HL7互操作性服务。 结果概述 以下三种工作负载代表了HL7互操作性活动的不同方面: ·T1工作负载:使用HL7消息的简单传递,每条入站消息对应一个出站消息。不需要路由引擎就可以直接将消息从Ensemble业务服务传递到Ensemble业务操作。不使用任何路由规则,也不执行任何消息内容转换。每条入站消息都在数据库中创建了一个HL7消息对象。 ·T2工作负载:通过路由引擎将入站消息平均分成4个分段,并将其路由到单个出站接口(1对1转换)。对每条入站消息执行一次数据转换,并在数据库中创建两个HL7消息对象。 ·T4工作负载:使用路由引擎将单独修改的消息路由到四个出站接口中的每一个接口。平均而言,每次转换都会修改入站消息的4个分段(1条入站消息对应4条出站消息,进行4次转换)。对于每条入站消息,将执行4次数据转换,向外发送4条消息,并在数据库中创建5个HL7消息对象。 这三个工作负载是在一个物理48核系统上运行的,该系统有两个Intel®可扩展Gold 6252处理器和两个运行Red Hat Enterprise Linux 8的750GB Intel®Optane™SSD DC P4800X SSD驱动器。测试记录每秒(和每小时)入站的消息数、每秒(和每小时)出站的消息数,以及一天10小时内的总消息数(入站与出站)。此外,CPU利用率是用于衡量既定吞吐量水平下可用系统资源的指标。 可扩展性结果 表1:该测试硬件配置的四个工作负载吞吐量汇总 * 包含25%的T1,25%的T2和50%T4的“混合工作负载” 工作负载描述及方法论 测试的工作负载包括HL7v2患者管理(ADT)和生命体征结果(ORU)消息,平均大小为1.2KB,平均14个片段。通过转换大约修改了4个片段(针对T2和T4工作负载)。测试包括48至128个入站接口和48至128个出站接口,通过TCP/IP接收和发送消息。 在T1工作负载中,使用了四个单独的命名空间,每个命名空间有16个接口;T2工作负载使用了三个命名空间,每个命名空间有16个接口;T4工作负载使用了四个命名空间,每个命名空间有32个接口;最后的“混合工作负载”使用了三个命名空间,在所有的接口中:T1工作负载为16个,T2工作负载为16个,T4工作负载为32个。 逐渐增加每个接口上的通信量来衡量可扩展性,以寻找可接受性能标准范围内的最高吞吐量。为了获得可接受的性能标准,必须以持续不变的速率处理消息,无需排队,消息传递没有可测量的延迟,且平均CPU使用率必须保持在80%以下。 之前的测试表明,HL7消息类型对集成的性能或可扩展性没有显著影响;重要的影响因素包括入站消息的数量、入站和出站消息的大小、在路由引擎中创建的新消息的数量,以及修改的消息段的数量。 之前的测试还表明,在数据转换中处理HL7消息的各个字段通常对性能影响不大。这些测试中的转换通过相当简单的赋值来创建新消息。请注意,复杂的处理(例如在数据转换中使用大量的SQL查询)可能会导致结果发生变化。 之前的测试还验证了规则处理的影响通常不大。这些测试中使用的路由规则集平均为32条规则,所有规则都很简单。请注意,非常大或非常复杂的规则集可能会导致结果发生变化。 硬件 服务器配置 测试中使用的服务器采用了第二代Intel®可扩展Gold 6252“Cascade Lake”处理器,带有48核@ 2.1GHz的2插槽系统,每个插槽提供24个核心,并具有192GB DDR4-2933 DRAM和10Gb以太网网络接口。本测试使用的是Red Hat Enterprise Linux Server 8操作系统和InterSystems IRIS医疗版 2020.1。 磁盘配置 通过IRIS 医疗版传递的消息将完全持久化保存到磁盘上。本次测试中系统内部的两个Intel 750GBIntel®Optane™SSD DC P4800X SSD驱动器分开使用,一个用于数据库,一个用于日志。此外,除了确保与真实环境进行比较之外,还对日志启用了同步提交以确保数据持久化。对于本文前面提到的T4工作负载,每条入站HL7消息都会生成大约50KB的数据,这些数据可以进行细分(如表2所述)。事务日志的在线时间通常比消息数据或日志的时间短,在计算总磁盘空间时应该考虑到这一点。 表2:每条入站HL7 T4消息所需的磁盘空间 组成部分 数据要求 分段数据 4.5 KB HL7消息对象 2 KB 消息头 1.0 KB 路由规则日志 0.5 KB 事务日志 42 KB 总计 50 KB 回顾上文,T4工作负载使用路由引擎将每个修改后的消息路由到四个出站接口中的每一个接口。平均而言,每次转换都会修改入站消息的4个分段(1条入站消息对应4条出站消息,进行4次转换)。每条入站消息将进行4次数据转换,将4条消息发送到出站,并在数据库中创建5个HL7消息对象。 在配置生产系统时,计算净需求时应考虑到每日入站量、HL7消息的删除计划以及日志文件的保留策略。此外,应该在系统上配置适当的日志文件空间,以防止保存日志的磁盘卷被占满。出于性能和可靠性方面的考虑,日志文件和数据库文件应分别保存至两个物理磁盘。 结论 InterSystems IRIS医疗版HL7v2消息吞吐量测试结果表明,简单的2插槽商用服务器配置即具有巨大的吞吐量能力,可满足任何组织中的极限消息工作负载的需求。此外,InterSystems致力于通过不断的版本迭代和升级,利用最新的服务器特性或者云技术,达到更高的性能和扩展性。 下图概述并比较了Ensemble 2015.1和Ensemble 2017.1基于英特尔®E5-2600 v3(Haswell)处理器的基准测试,以及Ensemble 2017.1基于第一代Intel®可扩展白金系列(Skylake)处理器的基准测试,和IRIS医疗版2020.1版本基于第二代Intel®可扩展黄金系列(Cascade Lake)处理器的基准测试最新结果。 图1:单个服务器上每天10小时的消息吞吐量(百万) InterSystems IRIS 医疗版不断提高版本之间互操作性吞吐量的标准,并提供灵活的连接功能。如上图所示,IRIS 医疗版消息吞吐量已有显著增加,在T2工作负载情况下比2017版翻了一番,与2015版测试相比,在相同的10小时窗口内吞吐量增加了两倍多,24小时总消息速率保持在23亿以上。 证明IRIS 医疗版性能提升的另一个关键指标是更复杂的T2和T4工作负载(包含转换和路由规则,而不是T1工作负载的纯直通操作)中的吞吐量的提高。 InterSystems可随时与您探讨组织中遇到的与互操作性需求相关的解决方案。 注:本文为译文,欢迎点击查看原文,原文由Mark Bolinsky撰写 这篇能不能发个微信公众号?:) 欢迎查看:https://mp.weixin.qq.com/s?__biz=MzA4MTg3OTU4Mg==&mid=2656760711&idx=1&sn=b098179e1947105917517a7ceeede3f4&chksm=842064f6b357ede044475009db72bf3777a5e18427904f893390e466e16703c289830d0beda6&token=2031523301&lang=zh_CN#rd
公告
Claire Zheng · 一月 20, 2021

InterSystems IRIS支持基于ARM的AWS Graviton2处理器

去年,AWS推出了基于ARM架构的AWS Graviton处理器第一代Amazon EC2 A1实例。在2019年AWS re:Invent 大会上,亚马逊宣布了第二代AWS Graviton2处理器和相关的Amazon EC2 M6g实例。相比前一代基于Intel Xeon的M5实例,Amazon EC2 M6g实例的性价比提升幅度高达40%。基于AWS Gravity 2的M6g实例现已推出预览版,InterSystems借此机会利用InterSystems IRIS数据平台对其性能进行了评估。InterSystems很高兴地宣布,我们取得了令人印象深刻的结果,并在2020年实现支持基于ARM架构的AWS Graviton2处理器的Amazon EC2实例! 我们测试了两种不同的工作负载,它们代表着InterSystems IRIS客户群体的常见用例。第一个工作负载是基于InterSystems IRIS数据平台的金融应用程序的纯数据接收。第二个是基于InterSystems IRIS医疗版的医疗互操作性工作负载。我们对比了Amazon EC2 M6g和M5在每种工作负载下的性能表现。 工作负载#1:InterSystems IRIS数据平台上的数据接收吞吐量 我们测试了相同的工作负载,以便在InterSystems IRIS上模拟纽约证交所在两节点分片集群上运行的数据处理(下单/成交)。该基准测试比较了m5.2xlarge和基于AWS Graviton2的m6g.2xlarge Amazon EC2实例之间的性能表现。每个实例均具有8个vCPU和32GB RAM,唯一的配置差异是处理器和AMI操作系统镜像。所对比的系统配置具有相同的EBS卷、iops、VPC配置和IRIS参数(例如全局缓冲区),且均使用了InterSystems IRIS的预发布版本IRIS-2020.1.0L.188.0-lnxrharm64和IRIS-2020.1.0L.188.0-lnxrh64。 结果显示,m5.2xlarge系统平均每秒处理9.8万条记录,而m6g.2xlarge每秒处理大约12万条记录。在相同数量的vCPU上,后者的性能提高了20%以上! 工作负载#2:InterSystems IRIS 医疗版上的医疗互操作性吞吐量 我们测试了相同的工作负载,以便在InterSystems IRIS医疗版互操作性技术框架上模拟HL7消息接收、路由和转换。该基准测试对m5.2xlarge和m6g.2xlarge(均具有8个vCPU和32GB RAM)进行了比较。除处理器以外,二者其余配置完全相同,且均在InterSystems IRIS(2020.1)的预发布版本上进行测试。我们同样针对基于第一代AWS Graviton处理器的A1实例进行了测试,以展示AWS Graviton2在性能上的飞跃。结果如下: 左侧轴是衡量此工作负载性能的主要指标,即应用程序每秒处理的消息数。x轴表示基准驱动向应用程序传输的不断增加的消息。从左向右,应用的工作负载不断增加,首先将入站接口的数量增加到16个,然后在保持稳定的情况下增加每秒消息数量。上图中的列则表示在右侧轴上测得的CPU利用率,当CPU利用率接近100%时,可以看到每种实例的最大容量。 正如大家所看到的,基于AWS Graviton2的M6g实例是线性扩展,并且在高工作负载下明显优于M5实例。在相同的工作负载下,M6g实例保持较低的CPU利用率,并在M5实例达到CPU最大利用率后仍可以继续扩展。与相同大小的M5实例相比,M6g实例的消息吞吐量最终提高了约28%。AWS Graviton2处理器以显著优势胜出! 性价比 通过比较基于AWS Graviton2的M6g和相同大小的M5实例,可以发现前者除了明显的性能提升外,还具有价格优势——与当前的Amazon EC2 M5实例相比,Amazon EC2 M6g实例的成本降低了20%: m5.2xlarge按需:每小时0.384美元 m6g.2xlarge按需:每小时0.308美元 结论 InterSystems致力于为客户提供选择平台的自由。我们很高兴地看到,AWS Graviton2处理器将为InterSystems IRIS客户带来显著的性能提升,并为客户降低成本。我们相信这些综合优势将推动ARM平台在IRIS客户中的广泛应用,我们很高兴可以为此提供支持! 更多资源 https://aws.amazon.com/ec2/graviton/ https://aws.amazon.com/ec2/instance-types/m6/ https://www.intersystems.com/products/intersystems-iris/ 注:本文为译文,欢迎点击查看原文,原文由Steven LeBlanc撰写 @LU.WANG @na.liu 这个版本的IRIS 我们能发货吗?