ICS35.
240.
80C07医保网络安全和信息化标准XJ-B01-2019医疗保障信息平台应用系统技术架构规范2019-09-06发布2019-09-06实施YB国家医疗保障局网络安全和信息化领导小组办公室发布XJ-B01-2019I目次前言.
V1范围.
12术语和定义.
13缩略语.
14总体技术架构.
24.
1总体架构.
24.
2架构设计思路.
34.
3应用分层架构.
44.
4HSAF框架.
54.
4.
1概述.
54.
4.
2HSAF核心框架.
54.
4.
3HSAF适配框架.
64.
4.
3.
1适配抽象层.
64.
4.
3.
2适配实现层.
64.
5远程服务调用.
65应用分层架构.
75.
1客户端.
75.
1.
1概述.
75.
1.
2前端展现层.
75.
2服务器端.
75.
2.
1概述.
75.
2.
2控制层.
75.
2.
3业务逻辑层.
85.
2.
4数据访问层.
85.
2.
5分布式数据库层.
85.
3框架层次调用.
85.
3.
1对象模型定义.
85.
3.
2调用顺序.
85.
3.
3调用要求.
96核心框架设计.
96.
1统一认证服务.
96.
1.
1概述.
96.
1.
2认证技术.
96.
1.
2.
1OAuth.
96.
1.
2.
2JWT.
106.
1.
2.
3SpringSecurity.
106.
1.
3认证服务.
10XJ-B01-2019II6.
1.
3.
1认证服务场景.
106.
1.
3.
2内部统一门户认证.
106.
1.
3.
3客户端应用认证.
106.
1.
3.
4开放授权认证.
116.
2单点登录服务.
126.
2.
1实现方式.
126.
2.
2单点登录流程.
136.
2.
3应用要求.
136.
3全局ID序列服务.
136.
4事务管理.
146.
4.
1实现方式.
146.
4.
2应用要求.
146.
5异常管理.
146.
5.
1异常类设计.
146.
5.
2异常错误码.
156.
5.
3不可捕获异常的处理.
166.
5.
4应用要求.
186.
6定时任务.
186.
7持久化服务.
186.
8数据库连接池服务.
186.
9报表服务.
187适配框架设计.
197.
1适配抽象层设计.
197.
1.
1分布式服务框架.
197.
1.
2分布式缓存.
197.
1.
3分布式消息队列.
207.
1.
4分布式数据库服务.
207.
1.
5非结构化存储.
217.
1.
6日志服务.
217.
2阿里云适配实现设计.
227.
2.
1分布式服务框架.
227.
2.
2分布式缓存.
227.
2.
3分布式消息队列.
227.
2.
4分布式数据库服务.
237.
2.
5非结构化存储.
237.
2.
6日志服务.
247.
3腾讯云适配实现设计.
247.
3.
1分布式服务框架.
247.
3.
2分布式缓存.
257.
3.
3分布式消息队列.
257.
3.
4分布式数据库服务.
267.
3.
5非结构化存储.
267.
3.
6日志服务.
277.
4开源适配实现设计.
27XJ-B01-2019III7.
4.
1分布式服务框架.
277.
4.
2分布式缓存.
277.
4.
3分布式消息队列.
287.
4.
4分布式数据库.
297.
4.
5非结构化存储.
297.
4.
6日志服务.
308框架技术选型.
308.
1核心框架版本选型.
308.
2适配实现技术选型.
318.
3关系型数据库选型.
329架构总体应用要求.
3210框架版本更新机制.
32XJ-B01-2019V前言本标准按照GB/T1.
1-2009给出的规则起草.
请注意本文件的某些内容可能涉及专利.
本文件的发布机构不承担识别这些专利的责任.
本标准由国家医疗保障局规划财务和法规司提出并归口.
本标准起草单位:国家医疗保障局规划财务和法规司.
XJ-B01-20191医疗保障信息平台应用系统技术架构规范1范围本规范规定了医疗保障信息平台建设总体技术架构,给出了业务子系统应用架构分层设计、核心服务框架和云平台适配框架设计说明,提出了框架相关技术选型、框架总体应用要求,明确了框架版本更新机制等方面内容.
本规范适用于医疗保障信息平台相关业务应用子系统和业务中台的建设.
2术语和定义2.
1架构architecture有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.
2.
2医疗保障应用框架HealthcareSecurityApplicationFramework(HSAF)为了实现医保信息化统一技术架构标准目标,为业务子系统提供技术架构标准所要求的基础功能软件产品和服务.
采用分布式云架构,封装核心云支撑服务适配接口,用于实现云产品解耦设计.
3缩略语下列英文缩略语适用于本文件.
HSAF医疗保障应用框架(HealthcareSecurityApplicationFramework)IaaS基础设施即服务(Infrastructure-as-a-Service)PaaS平台即服务(Platform-as-a-Service)Web全球广域网(WorldWideWeb)API应用程序编程接口(ApplicationProgrammingInterface)SDK软件开发工具包(SoftwareDevelopmentKit)SQL结构化查询语言(StructuredQueryLanguage)TCP传输控制协议(TransmissionControlProtocol)HTTP超文本传输协议(HyperTextTransferProtocol)HTTPS超文本传输安全协议(HyperTextTransferProtocolSecure)XML可扩展标记语言(ExtensibleMarkupLanguage)JSONJava脚本对象简谱(JavaScriptObjectNotation)ORM对象关系映射(ObjectRelationalMapping)JWTJSONWeb令牌(JSONWebToken)IoC控制反转(InversionofControl)DI依赖注入(DependencyInjection)XJ-B01-20192AOP面向切面编程(AspectOrientedProgramming)OLTP联机事务处理过程(On-LineTransactionProcessing)HA高可用(HighAvailable)ECS阿里云服务器(ElasticComputeService)HSF阿里云淘宝服务框架(High-speedServiceFramework)EDAS阿里云企业级分布式应用服务(EnterpriseDistributedApplicationService)DRDS阿里云分布式关系型数据库服务(DistributedRelationalDatabaseService)OSS阿里云对象存储服务(ObjectStorageService)TSF腾讯微服务平台(TencentServiceFramework)CMQ腾讯云消息队列(CloudMessageQueue)TDSQL腾讯云分布式数据库服务(TencentDBforTDSQL)CLS腾讯云的日志服务(CloudLogService)ELKElasticsearch、Logstash和Kibana简称RPC远程过程调用(RemoteProcedureCall)4总体技术架构4.
1总体技术架构总体技术架构参见图1及图2.
系统总体技术架构采用分布式云架构,在基础设施层上,结合云平台,提供分布式服务支撑.
通过业务中台构建业务中心,支持实时交易型应用;通过数据中台实现数据汇聚、数据治理等,开展大数据应用.
基于统一的应用分层架构建设经办管理类、公共服务类、智能监管类、宏观决策类业务子系统应用.
图1总体技术架构——概念图XJ-B01-20193图2总体技术架构——逻辑图总体技术架构描述如下:a)业务系统:基于医疗保障应用框架(HealthcareSecurityApplicationFramework,简称:HSAF)开发的支撑医疗保障业务运行的应用子系统;b)HSAF框架:采用分布式云架构,封装核心云支撑服务适配接口,用于实现云产品解耦设计,详见4.
3;c)适配层:基于HSAF的适配技术,将应用层依赖的分布式技术与具体厂商的分布式技术进行适配,实现应用层可以适配多家厂商的分布式技术;d)云支撑服务层:基于云基础设施,为应用层提供通用的技术支撑服务,包括分布式服务、分布式缓存、分布式数据访问、日志服务、非结构化存储和消息队列等;e)云基础设施层:采用云架构,在物理设备基础上,实现计算资源、存储资源、网络资源的动态管理和资源调配.
4.
2架构设计思路为满足全国医疗保障信息系统部署模式的可灵活选择要求,相对传统系统技术架构,医疗保障信息平台在架构中增加了"适配层",将应用层依赖的分布式技术与具体厂商的分布式技术进行适配,实现应用层可以适配多家厂商的分布式技术.
地方可根据实际情况向各个云资源提供商(包括政务云和专有云等)租用或申请资源使用,也可自建数据中心.
云基础设施建设参见图3.
XJ-B01-20194图3云基础设施建设在总体技术架构设计和代码开发时,应遵循一个重要原则:框架需满足技术扩展性的要求,当前框架能适配至少三种云平台分布式技术,新的分布式技术的加入可以通过框架的扩展实现.
4.
3应用技术分层架构为了保证业务子系统应用具有良好的横向扩展能力,以应对未来业务的快速发展,整个应用架构采用分布式云架构设计,业务能力通过微服务框架基于高内聚低耦合的思路实现.
所有服务均为无状态服务,实现在线应用的扩缩容能力.
应用分层架构参见图4.
图4应用技术分层架构XJ-B01-20195业务应用子系统分为客户端和服务器端两大部分:a)客户端:前端展现层;b)服务器端:——控制层;——业务逻辑层;——数据访问层;——分布式数据库层.
业务应用子系统需严格按照该分层架构和调用层次进行应用程序开发和服务调用.
4.
4HSAF框架4.
4.
1概述HSAF框架设计采用1+N模式,即1套核心框架,多套云支撑服务技术平台适配.
HSAF框架中包含控制层、业务层和持久化层接口抽象,定义了分布式服务框架、分布式缓存、分布式消息队列、非结构化存储、日志服务等分布式中间件服务的接口.
基于4.
2架构设计思路,HSAF框架分为两部分:a)HSAF核心框架,提供业务子系统运行相关的基础框架和服务支撑;b)HSAF适配框架,提供对不同云支撑服务技术平台的适配和可移植支撑.
HSAF框架总体结构参见图5.
图5HSAF框架结构4.
4.
2HSAF核心框架HSAF核心框架,统一封装了Spring框架相关组件、ORM持久化框架、数据库连接池组件、会话上下文、异常统一拦截器、操作日志拦截器、权限认证拦截器、安全过滤拦截器等开发基础服务,能使业务系统开发人员尽可能只关注业务逻辑,而无需过多关注技术细节.
它主要提供了以下功能和服务:a)统一认证服务(详见6.
1);XJ-B01-20196b)单点登录服务(详见6.
2);c)全局ID序列服务(详见6.
3);d)事务管理(详见6.
4);e)异常管理(详见6.
5);f)定时任务(详见6.
6);g)持久化服务(详见6.
7);h)数据库连接池服务(详见6.
8);i)报表服务(详见6.
9).
4.
4.
3HSAF适配框架4.
4.
3.
1适配抽象层适配抽象层是对适配层中的分布式服务的具体技术实现进行抽象,提供了分布式缓存、远程服务调用、非结构化存储、消息队列等PaaS层服务的抽象接口.
在代码中,应基于抽象接口层进行开发,而不能直接使用具体的扩展派生类,否则代码将绑定某种具体技术方案.
适配抽象层设计详见7.
1.
4.
4.
3.
2适配实现层适配实现层基于适配抽象层,扩展了分布式服务的具体技术实现.
医疗保障信息平台适配的技术实现,已预设提供以下三套方案:阿里云专有云产品(详见7.
2)、腾讯云专有云产品(详见7.
3)、开源产品中的一种选型(详见7.
4).
各地医保系统做技术合规选型时,如采用HSAF框架预设适配实现技术之外的技术,应做相应适配、开发工作.
4.
5远程服务调用远程服务调用是分布式服务框架的基础和核心功能.
目前主流的分布式服务框架使用两种远程服务调用协议:a)RPC协议,以Dubbo、Thrift、gRPC、rpcx、Motan为代表的框架使用的协议;b)HTTP协议,以SpringCloud为代表的框架使用的协议.
两种协议在不同的分层上提供服务,RPC协议是在Service层提供服务,HTTP协议是在Controller层提供服务.
为了兼容两种不同的服务提供方式,实现一套业务代码适配不同的分布式服务框架所使用的远程服务调用协议,如图6所示,架构要求如下:a)对于RPC协议,通过提供不同的服务注册发现配置文件来实现协议的切换;b)对于HTTP协议,Service服务需要额外包装一层Controller层来实现服务的协议转换.
XJ-B01-20197图6远程服务调用不同协议适配方案5应用技术分层架构5.
1客户端5.
1.
1概述客户端包含PC端、移动端、大屏幕端等类型.
客户端与服务器端之间的通讯协议为HTTP协议,交互的数据格式为JSON格式.
5.
1.
2前端展现层前端展现层泛指一切在客户端直接与用户交互的客户界面(UI),本层是MVC架构中的视图层(V).
各类型客户端使用各自的组件作为前端展现层的UI实现方式.
前端展现层将用户对UI的操作转化成基于HTTP协议的JSON格式的字符串去访问服务器,并将服务器返回的数据通过各自的组件展现给用户.
服务器端能响应符合HTTP/JSON的业务请求,客户端应发出符合业务要求的HTTP/JSON请求,由服务器端处理和响应.
HSAF框架在浏览器上的前端展现层实现是参考实现.
HSAF框架提供了基于PC端的前端展现层实现,其他类型客户端部分需要开发商自行实现.
5.
2服务器端5.
2.
1概述服务器端包含控制层、业务处理逻辑层、数据访问层和分布式数据库层四部分.
5.
2.
2控制层控制层包含过滤器拦截器层、控制器层(Controller)两部分.
过滤器拦截器层主要处理全局性问题,一切访问都会经过过滤器拦截器层处理,不会绕过过滤器拦截器直接访问控制层.
本层次提供的能力包括:XJ-B01-20198a)分布式会话管理:用户会话信息统一写入分布式缓存中;b)装载上下文信息;c)记录操作日志;d)安全管理:通过一个过滤器链拦截进入的请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性.
控制器层负责请求的全生命周期处理,包含接收——分发——调用业务——视图展现的全过程.
HSAF的核心控制框架是围绕前端控制器(DispatcherServlet)展开的,前端控制器负责将请求派发到特定的控制器.
当控制器类接收到一个请求时,它会在自己内部寻找一个合适的处理方法来处理请求.
控制器在选择好适合处理请求的方法时,传入收到的请求(根据方法参数类型,可能以不同的类型传入),并且调用该方法中的逻辑来进行处理.
方法逻辑会调用业务逻辑.
业务逻辑运行完毕之后,会委派给一个视图,由该视图来处理方法的返回值.
返回的视图名称会返回给前端控制器,它会根据一个视图解析器将视图名称解析为一个具体的视图实现.
5.
2.
3业务逻辑层业务逻辑层包含Service、BO两个子层次.
在View、Controller、Service、BO这三个层次之间通过DTO进行业务对象的传递,在BO与DAO之间通过DO进行数据对象的传递.
Service是服务的发布层,提供对外服务的接口,并调用BO完成接口任务.
BO层实现具体的业务逻辑.
DAO层书写数据库访问逻辑,调用持久化层实现数据库的访问工作.
5.
2.
4数据访问层数据访问层分为持久化层和数据访问代理层两部分.
持久化层实现O/RMapping的工作并调用分布式数据库.
数据访问代理层统一接收数据访问层的请求并对请求进行解析、优化、路由、分发给分布式数据库,提供对分库分表、读写分离的透明支持,并且提供对跨库信息进行合并等操作,将数据库结果返回给数据访问层.
5.
2.
5分布式数据库层分布式数据库层通过分布式数据访问代理服务,访问分布式关系型数据库,能使多个关系型数据库工作如在同一个关系型数据库一样.
5.
3框架层次调用5.
3.
1对象模型定义分层中涉及的对象模型定义如下:a)DTO(DataTransferObject):数据传输对象,Service或Manager向外传输的对象;b)BO(BusinessObject):业务对象,由Service层输出的封装业务逻辑的对象;c)DO(DataObject):数据对象,此对象与数据库表结构一一对应,可扩展虚拟字段(如一些查询条件、计算字段、汇总信息等),通过DAO层向上传输数据源对象.
5.
3.
2调用顺序框架层次调用参见图4,框架层次调用顺序如下:a)客户端浏览器发起HTTP/JSON请求;b)服务器端过滤器过滤请求,做安全、编码、session管理等处理,拦截器拦截请求做记录日志、访问统计等操作,并装载上下文信息;XJ-B01-20199c)控制器接收前端传过来的DTO对象,并调用本地服务或者远程服务;d)Service分为接口与实现两部分.
Service服务接口接受控制层的远程或本地调用,接收DTO对象,调用本地BO中的业务逻辑,并将BO返回的业务结果(DTO对象)返回给控制层(远程或本地客户端);e)BO分为接口与实现两部分.
BO服务接口接受Service的本地调用,接收DTO对象,实现业务逻辑,使用DO对象调用DAO来访问数据库,将DAO返回DO对象转换为DTO对象,返回给Service;f)DAO层接受BO层的调用,接收DO对象,实现具体的SQL逻辑,访问数据库,并将返回的数据模型返回给BO;g)数据访问层实现数据持久化工作,将数据库的库表结构与java对象做映射;h)数据访问代理层接受持久化层的数据访问,对数据访问进行数据操作的解析和执行,包括会话管理、分库分表策略、语义解析、请求路由、数据合并、切换控制等,数据访问代理层将数据操作处理后分派到具体的分布式数据库;i)分布式数据库层接受数据访问代理层的访问,进行数据库处理,将数据返回给数据访问代理层.
5.
3.
3调用要求各层次的调用顺序及对象模型的传输,应遵循5.
3.
2所述.
对象模型传输示意参见图7.
图7对象模型传输示意图6核心框架设计6.
1统一认证服务6.
1.
1概述用户认证指验证某个用户是否为系统中的合法主体,即判断用户能否访问该系统.
用户认证一般要求用户提供用户名和密码.
系统通过校验用户名和密码来完成认证过程.
6.
1.
2认证技术HSAF框架中采用OAuth2.
0标准、JWT(JSONWebToken)进行登录认证,使用SpringSecurity框架完成相关的认证和授权验证.
6.
1.
2.
1OAuthOAuth是一种开放的协议,为桌面、手机或Web应用提供了一种简单的、标准的方式去访问需要用户授权的API服务.
XJ-B01-201910OAuth2.
0具有以下特点:a)简单:不管是OAuth服务提供者还是应用开发者,都很容易于理解与使用;b)安全:没有涉及到用户密钥等信息,更安全更灵活;c)开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth.
OAuth2.
0定义了四种授权方式:a)授权码模式(AuthorizationCode);b)简化模式(Implicit);c)密码模式(Password);d)客户端模式(ClientCredentials).
OAuth2.
0定义了以下几种角色:a)ResourceOwner:资源拥有者;b)ResourceServer:资源服务器;c)Client:第三方应用客户端;d)AuthorizationServer:授权服务器.
6.
1.
2.
2JWTJWT是一个开放标准(RFC7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息.
此信息可以通过数字签名进行验证和信任.
JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名.
6.
1.
2.
3SpringSecuritySpringSecurity是一个能够为基于Spring的企业应用系统,提供声明式的安全访问控制解决方案的安全框架.
它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了SpringIoC,DI和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作.
6.
1.
3认证服务6.
1.
3.
1认证服务场景认证服务提供以下三种场景的认证能力:a)内部统一门户认证;b)客户端应用认证;c)开放授权认证.
6.
1.
3.
2内部统一门户认证内部统一门户子系统为医保局业务经办工作人员提供统一登录入口,认证服务能提供统一的身份认证能力和单点登录服务(详见6.
2).
6.
1.
3.
3客户端应用认证公共服务子系统涉及移动APP、网厅、短信、微信/小程序、自助终端等客户端,认证服务提供客户端统一身份认证能力.
如图8所示,认证服务提供的客户端统一身份认证流程如下:a)用户登录客户端;b)客户端向认证服务请求认证;c)认证服务使用密码模式进行认证;XJ-B01-201911d)认证服务认证通过,生成JWT格式的access_token,返回给客户端;e)客户端存储JWT,返回登录成功;f)用户在客户端进行后续操作;g)客户端携带JWT向API服务请求API接口;h)API服务验证JWT的有效性,验证通过则执行后续逻辑,返回结果;i)客户端向用户展示结果.
图8客户端应用认证流程6.
1.
3.
4开放授权认证基于OAuth标准,认证服务能提供开放开发授权认证的能力.
如图9所示,开放授权认证流程如下:a)用户(ResourceOwner角色)向第三方系统发起请求;b)第三方系统(Client角色)向用户返回用户授权认证操作;c)用户输入平台认证信息,向认证服务(AuthorizationServer角色)请求授权认证;d)认证服务认证通过,生成code,并跳转到授权确认页面;e)用户同意授权;f)认证服务生成code并跳转到重定向页面;g)第三方系统使用code请求认证服务的token接口;h)认证服务生成JWT格式的access_token并返回;i)第三方系统本地存储access_token;j)第三方系统后续使用access_token向开放资源服务(ResourceServer角色)请求开放资源,并经过处理后展现给用户.
XJ-B01-201912图9开放授权认证场景6.
2单点登录服务6.
2.
1实现方式单点登录(SingleSignOn)服务是指在多个相互信任的应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的服务.
系统采用Session共享方案来实现单点登录.
共享Session可谓是实现单点登录最直接、最简单的方式.
将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题.
Session服务用于存储与用户相关的数据,默认由Web容器进行管理.
单机情况下,所有用户的Session数据由一台服务器持有,不存在Session数据不一致的情况,但在分布式情况下,用户的前后两次请求可能会转发到不同的后端服务器上,如果不进行Session共享会出现Session数据不一致的情况.
因此打造一个高可用的分布式系统,应将Session管理从容器中独立出来成为统一的脱离容器的Session存储机制.
HSAF框架的Session管理通XJ-B01-201913过基于Redis服务器的方案来实现Session的共享存储.
6.
2.
2单点登录流程如图10所示,单点登录流程如下:a)接收用户认证信息;b)将用户认证信息提交认证中心进行认证;c)认证成功生成有效凭证并通过用户中心获取对应用户详细信息;d)将用户信息写入Session对象,保存至Session共享服务中;e)通过Session共享服务获取认证服务共享的Session信息,完成单点登录;f)通过用户过滤器获取当前登录用户,并将用户信息及所属机构信息写入线程对象HsafContextHolder中.
图10单点登录流程6.
2.
3应用要求为保证医疗保障信息平台各个业务子系统Web应用的Session共享,避免出现因跨域导致的Session不能共享问题,各业务子系统Web应用应配置相同的域名.
Session共享服务应使用独立的缓存服务器进行存储,与业务使用的缓存服务器完全分离,互不影响.
6.
3全局ID序列服务全局唯一序列号生成是在设计一个分布式系统时常常会遇见的需求.
在分布式系统架构XJ-B01-201914下,尤其是数据库使用分库分表的时候,数据库自增主键已无法保证全局唯一.
HSAF框架提供了统一的组件,实现全局ID序列生成服务,可被直接调用生成全局序列ID.
6.
4事务管理6.
4.
1实现方式HSAF框架使用了Spring框架的事务管理机制.
Spring支持编程式事务管理和声明式事务管理两种方式.
声明式事务管理是非代码侵入式的开发方式,这是Spring所倡导的开发方式.
声明式事务管理也有两种常用的方式,一种是基于tx和AOP命名空间的XML配置文件,另一种就是基于@Transactional注解.
6.
4.
2应用要求为了方便系统灵活地进行事务隔离等级、事务传播行为、事务超时、事务回滚规则等参数的控制,应使用基于XML配置文件的声明式事务管理方式,不应使用基于@Transactional注解的方式.
另外,根据分层设计,Service是服务的发布层,BO层是具体的业务逻辑实现层,Service层提供对外服务的接口,并调用BO层完成接口任务.
架构要求事务只能声明在BO层.
6.
5异常管理6.
5.
1异常类设计HSAF框架统一异常处理,实现对控制层、业务处理层及数据访问层的异常捕获和异常信息封装.
业务开发人员只需要在各个层次中,抛出对应的业务异常和数据访问异常,框架会进行统一拦截,不需要开发人员手动进行异常处理,可减少代码量,提高开发效率,同时也实现了整个系统的异常统一处理和管理.
异常类设计如图11所示.
框架所有的异常均继承自"cn.
hsa.
hsaf.
framework.
exception.
AppException"这个基类,每个业务子系统(或者业务中台)定义自己的异常类(统一继承自BusinessException).
系统运行过程中,在控制层(Controller)、业务服务层(Service)、业务逻辑层(BO)、数据访问层(DAO)如果发生业务异常(BusinessException)、数据访问异常(DataAccessException)或者其它运行时异常,SpringMVC调用框架提供的HSAFExceptionHandler对异常信息进行统一拦截处理,记录异常日志,并将异常信息经业务封装后返回UI层进行提示.
XJ-B01-201915图11异常类设计6.
5.
2异常错误码框架采用前后端分离技术,前端通过HTTP请求后台服务,数据统一使用JSON格式,服务端响应数据使用统一的规范格式和状态码:示例:{"type":"success","code":0,"message":"这里显示错误简短信息","data":{}}如图12所示,为了方便问题的定位排查,以及服务质量的统计分析,在HSAF框架的异常基类中定义错误码code属性,应用代码抛出异常时,需要定义该属性.
图12错误码定义业务异常错误码采用六位字符串,格式为"两位系统编号+两位模块编号+两位异常编号",具体的异常错误码见表1.
XJ-B01-201916表1错误码使用范围说明错误码使用范围说明0系统级成功-1系统级未知异常-2系统级请求参数异常-3系统级服务端请求超时-4系统级权限校验异常-5系统级无效的请求地址-6系统级触发限流10xxxx框架级11xxxx内部统一门户12xxxx基础信息管理13xxxx医保业务基础14xxxx支付方式管理15xxxx医疗服务价格管理16xxxx信用评价管理17xxxx跨省异地就医18xxxx药品和医用耗材招采19xxxx公共服务20xxxx基金运行及审计监管21xxxx医疗保障智能监管22xxxx运行监测23xxxx宏观决策大数据应用24xxxx内部控制25xxxx业务中台6.
5.
3不可捕获异常的处理HSAFExceptionHandler可以拦截处理所有应用层抛出的AppException异常的子类,但是系统运行过程中,还有一些"特殊"的异常是无法捕获的,原因是:a)AppException异常基类是继承自RuntimeException,而java的异常根类为Throwable,Throwable的两个子类Error和Exception,Exception的两个子类XJ-B01-201917CheckedException和RuntimeException;因此能被捕获的实际上只是RuntimeException相关的异常(当然这能够处理大部分的异常情况),对于Error以及CheckedException无法捕获;b)正常的代码中一般使用try.
.
.
catch(AppExceptionex){}来捕获异常,执行过程中可能因为线程中断或阻塞了,导致catch块中的代码并没有正常的执行到.
为了统一对不可捕获异常的处理,HSAF框架统一封装实现了Thread.
UncaughtExceptionHandler接口,该接口声明了某一个线程执行过程中,对于未捕获的异常处理,如图13所示.
图13未捕获的异常处理如图14所示,应用请求的入口一般是Controller,因此HSAF框架通过AOP切面的方式在请求的入口方法处设置当前线程的UncaughtExceptionHandler,以处理当前线程中无法正常捕获的各种异常.
图14AOP切面设置当前线程的UncaughtExceptionHandlerXJ-B01-2019186.
5.
4应用要求国家或地方在开展医疗保障信息平台建设时,异常派生类应继承框架统一的异常类结构设计(如图11所示).
代码开发中,除非有明确约定,否则对捕获的异常直接抛到上一层,由HSAF框架在控制层进行统一拦截.
6.
6定时任务HSAF框架基于XXL-JOB扩展定时任务组件,提供分布式定时任务支持.
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展.
现已开放源代码并接入多家公司线上产品线,接入场景如电商业务,O2O业务和大数据作业等,易上手,开箱即用.
其设计思想为将调度行为抽象形成"调度中心"公共平台,而平台自身并不承担业务逻辑,"调度中心"负责发起调度请求.
将任务抽象成分散的JobHandler,交由"执行器"统一管理,"执行器"负责接收调度请求并执行对应的JobHandler中业务逻辑.
因此,"调度"和"任务"两部分可以相互解耦,提高系统整体稳定性和扩展性.
6.
7持久化服务HSAF框架使用了MyBatis提供持久化服务.
MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架.
MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.
MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录.
6.
8数据库连接池服务数据库连接是一种关键的、有限的、昂贵的资源,对数据库连接的管理能显著影响到整个应用系统的伸缩性和健壮性,影响到应用系统的性能指标.
为了减少数据库连接频繁创建、释放所产生的开销,应用系统开发中应采用数据库连接池技术.
数据库连接池负责分配、管理和释放数据库连接,它允许应用系统重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏.
这项技术能明显提高对数据库操作的性能.
数据库连接池的基本思想就是为数据库连接建立一个"池".
预先在池中放入一定数量的连接,当需要建立数据库连接时,只需从"池"中取出一个,使用完毕之后再放回去.
可通过设定连接池最大连接数来防止系统过多地与数据库连接.
6.
9报表服务报表就是用表格、图表等形式来动态显示数据,可以用公式表示为:"报表=多样的格式+动态的数据".
报表可以帮助使用者访问、格式化数据,并把数据信息以可靠和安全的方式呈现给使用者.
报表是管理的基本措施和途径,是应用系统的基本业务要求,也是实施BI战略的基础.
框架中提供了统一的报表服务,主要功能是提供报表资源的管理,用户身份与权限管理,数字签章、服务转发及报表展现.
报表服务管理的报表资源主要包含数据源、报表模板、报表输出结果等.
报表服务是独立运行的单独服务,可进行分布式部署,模板的存储采用分布式对象存储(OSS),全网任意节点均可访问.
报表服务对外采用WeB和RESTful方式进行服务,WEB用XJ-B01-201919于管理人员对报表进行资源及权限配置,RESTful用于业务系统对接报表服务.
报表服务支持多种数据导出格式,如PDF、Excel、图片等进行存储,亦可通过RESTful方式调用报表将结果页面,其嵌入到业务系统中.
报表服务还提供了严谨的服务转发设置,能为每一张报表进行报表工具配置,当业务系统发起服务请求时,报表服务会根据配置进行转发,未配置的请求将会被作为非法请求丢弃并记录监控日志.
报表工具具有独立模板设计器,可视化地开发报表更方便、快捷,它具有如下特点:a)提供拖拽式、所见即所得的报表编辑器;b)提供多样的向导来简化复杂的报表设计任务;c)提供多样化的排版和格式化工具;d)报表可转换为PDF、HTML、EXCEL等格式;e)支持数据源调试;f)支持无限次数的撤消和重做;g)内置超过20种的图表支持;h)集成超过15种语言;i)提供报表模板与报表库样式管理;j)提供源文件的备份;k)提供文档结构浏览器.
7适配框架设计7.
1适配抽象层设计7.
1.
1分布式服务框架分布式服务框架是分布式系统架构的基础.
分布式服务关键不仅仅是分布式服务本身,而是一套治理框架,这种框架使得分布式服务可以独立的部署、运行、升级,还能实现分布式服务之间在结构上的"松耦合",而在功能上表现为一个统一的整体,体现为统一风格的界面,统一的权限管理,统一的安全策略,统一的上线过程,统一的日志和审计方法,统一的调度方式,统一的访问入口等等.
分布式服务框架具备如下能力:a)RPC远程过程调用;b)服务注册与发现;c)服务治理;d)负载均衡;e)消息总线,轻量级的MQ或HTTP;f)链路跟踪;g)配置中心.
HSAF采用配置文件的方法来切换不同的分布式服务框架.
7.
1.
2分布式缓存缓存的主要作用是降低应用和数据库的负载,提高系统性能、客户端访问速度.
在架构和业务设计上,可以考虑将访问量较大、不经常修改的,比如字典表和系统参数,或对数据库性能影响较大的查询的结果进行缓存,提高系统整体性能.
HSAF框架使用了SpringCache框架作为缓存层的抽象框架.
SpringCache不是一个具体的缓存实现方案,而是一个对缓存使用的抽象.
HSAF框架提供了基于Redis的接口实现,XJ-B01-201920能够兼容不同云平台基于Redis或提供类Redis接口服务的缓存方案.
分布式缓存服务抽象类接口如图15所示,定义cn.
hsa.
hsaf.
core.
cache.
HsafCacheManager缓存统一管理器.
图15分布式缓存服务抽象类接口7.
1.
3分布式消息队列分布式消息队列,是分布式系统中重要、常用的中间件,它使用事件驱动架构,通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作.
HSAF引入并使用消息队列组件作为分布式服务架构下各个应用之间消息通讯的中间件.
分布式消息队列服务抽象类接口如图16所示,类设计:a)定义cn.
hsa.
hsaf.
core.
mq.
MQBusinessHandler消息监听业务处理接口类;b)定义cn.
hsa.
hsaf.
core.
mq.
MQProducer消息队列生产者接口类;c)定义cn.
hsa.
hsaf.
core.
mq.
MQConsumer消息队列消费者接口类;d)定义cn.
hsa.
hsaf.
core.
mq.
MQMessage消息实体类.
图16分布式消息队列服务抽象类接口7.
1.
4分布式数据库服务在数据量逐渐增大的情况下.
传统数据库存在着先天性的弊端,分布式数据访问代理服XJ-B01-201921务主要能使得传统数据库易于扩展,可切分,提升性能,规避单体结构缺陷.
分布式数据库屏蔽了后端的分布式数据库层的复杂性,能让用户从逻辑上得到与访问单机数据库近乎相同的体验.
分布式数据访问代理服务本身是一个集群,支持HA,避免了单点故障.
分布式数据访问代理服务支持分库分表存储,支持横向和纵向切分,负责数据操作的解析和执行,提供会话管理、分库分表策略、语义解析、请求路由、数据合并、切换控制等功能.
7.
1.
5非结构化存储HSAF定制一套相对通用的非结构化文档存储接口标准规范,一套接口多种实现,即一套管理操作API,支持AWSS3、MongoDB、OSS、TStack、FastDFS等多种主流非结构化存储管理操作实现;存储环境切换,应用程序代码零调整,即只需简单参数变更即可完成应用程序的切换.
选择使用面向Java方向的AWSS3网络存储服务协议.
非结构化存储服务抽象类接口如图17所示,类设计:a)定义了存储实体类cn.
hsa.
hsaf.
core.
fs.
FSEntity;b)定义了管理类cn.
hsa.
hsaf.
core.
fs.
FSManager,包含存储对象(putObject)、获取对象(getObject)、删除(deleteObject)三个接口.
图17非结构化存储服务抽象类接口7.
1.
6日志服务软件系统中存在着各式各样的日志,包括应用日志、业务日志、系统日志、访问日志、行为日志等.
日志服务能将分布式环境的日志统一收集聚合,存储在分布式数据库中,同时经过一定的处理可以使非结构化的文本内容结构化,以便于做结构化的查询和分析.
日志服务提供以下主要能力:a)聚合:从多个数据源收集和发送日志的能力;b)处理:将日志消息转换为有意义的数据以便于分析的能力;XJ-B01-201922c)存储:能够长时间存储数据,以便用于监控、趋势分析和安全性方面的使用场景;d)分析:通过查询数据并在其上创建可视化和仪表板来分析数据的能力.
7.
2阿里云适配实现设计7.
2.
1分布式服务框架阿里云的分布式服务框架适配使用企业级分布式应用服务EDAS(EnterpriseDistributedApplicationService)实现.
EDAS是一个应用托管和微服务管理的PaaS平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持Dubbo、SpringCloud等微服务框架.
EDAS拥有如下特点和功能:a)多样的应用托管平台:可以根据应用系统和资源需求,选择独享实例的ECS集群、基于Kubernetes的容器服务、Kubernetes集群或EDASServerless部署并托管应用;b)丰富的微服务框架:可以基于原生Dubbo、原生SpringCloud和HSF开发应用及服务,并托管到EDAS中;c)完整的应用管理:可以使用EDAS控制台对应用系统进行全生命周期管理、服务治理及微服务管理:1)应用生命周期管理:EDAS提供应用全生命周期管理服务,包括应用的部署、扩容、缩容、停止和删除等;2)服务治理:EDAS集成了弹性伸缩、限流降级、流量管理、健康检查等服务治理组件,高效应对突发的流量洪峰和服务依赖所引发的雪崩问题,提高了平台的稳定性;3)微服务管理:EDAS提供服务拓扑、服务报表和调用链查询等功能,帮助管理分布式系统的中的每一个组件和服务.
d)全面的监控和诊断:可以使用EDAS控制台实时监控应用中资源和服务的状态,以便及时发现问题,并通过日志和诊断组件快速定位:1)应用监控:EDAS实时监控应用的IaaS层资源、服务的健康状态,帮助您快速发现、定位问题;2)应用诊断:EDAS提供了基于容器的应用诊断功能,提供相应数据来判断GC、类加载、连接器、对象内存分布、线程热点、Druid连接池和CommonsPool等发生的运行问题.
7.
2.
2分布式缓存阿里云使用开源的Redis4.
0作为分布式缓存实现,阿里云适配实现无需特别定制代码,统一使用开源版分布式缓存设计(详见7.
4.
2),直接访问阿里云版Redis服务.
7.
2.
3分布式消息队列阿里云的分布式消息队列适配使用RocketMQ.
RocketMQ是阿里巴巴集团自主研发的专业消息中间件,基于高可用分布式集群技术,提供消息订阅和发布、消息轨迹查询以及定时(延时)消息、资源统计、监控报警等一系列消息云服务.
阿里云分布式消息队列类设计如图18所示,类设计:a)定义了消息队列消费者实现类MQConsumerByOns;b)定义了消息队列生产者实现类MQProducerByOns.
XJ-B01-201923图18阿里云分布式消息队列类设计7.
2.
4分布式数据库服务阿里云的分布式数据库服务适配使用DRDS.
DRDS是一款基于MySQL存储、采用分库分表技术进行水平扩展的分布式OLTP数据库服务产品,支持RDSforMySQL以及POLARDBforMySQL.
7.
2.
5非结构化存储阿里云的非结构化存储服务适配使用OSS.
阿里云对象存储服务(ObjectStorageService,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务.
OSS提供与平台无关的RESTfulAPI接口.
阿里云非结构化存储类设计如图19所示,定义了对象存储OSS实现类FSStoreAliManagerImpl.
XJ-B01-201924图19阿里云非结构化存储类设计7.
2.
6日志服务阿里云的日志服务适配使用阿里云日志服务.
阿里云日志服务(LogService,简称LOG)是针对日志类数据的一站式服务,无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能.
LogService拥有如下特点和功能:a)实时采集与消费(LogHub):用于数据清洗(ETL)、流计算(StreamCompute)、监控与报警、机器学习与迭代计算,具体如下:1)通过ECS、容器、移动端,开源软件,JS等接入实时日志数据(例如Metric、Event、BinLog、TextLog、Click等);2)提供实时消费接口,与实时计算及服务对接;b)查询与实时分析(Search/Analytics):提供实时索引、查询分析数据相关功能,可用于DevOps/线上运维,日志实时数据分析,安全诊断与分析等;c)投递数仓(LogShipper):提供稳定可靠的日志投递服务,能将日志中枢数据投递至存储类服务进行存储,支持压缩、自定义Partition、以及行列等各种存储方式,能用于数据仓库与数据分析、审计、推荐系统与用户画像.
7.
3腾讯云适配实现设计7.
3.
1分布式服务框架腾讯云的分布式服务框架适配使用腾讯微服务平台TSF(TencentServiceFramework).
TSF是一个围绕着应用和微服务的PaaS平台,提供应用全生命周期管理、数据化运营、立体化监控和服务治理等功能.
TSF支持SpringCloud、ServiceMesh微服务框架.
TSF以腾讯云中间件团队多款成熟的分布式产品为核心基础组件,提供秒级推送的分布式配置服务、链路追踪等高可用稳定性组件.
此外,TSF与腾讯云API网关和消息队列打通,方便松构建大型分布式系统.
TSF拥有如下特点和功能:a)服务注册发现:TSF服务注册发现包括三个角色:服务提供者、服务调用者和服务注册中心.
服务提供者和服务调用者将地址信息注册到服务注册中心,并从服务注册中心获取所有注册服务的实例列表,服务调用者使用服务提供者的实例地址进行XJ-B01-201925调用;b)应用生命周期管理:TSF提供从创建应用到运行应用的全程管理,功能包括创建、删除、部署、回滚、扩容、下线、启动和停止应用.
TSF提供部署组来实现应用的版本控制功能.
TSF将每次操作记录下来,用户可以在应用的变更记录页面中查看和搜索变更记录;c)分布式配置管理:配置管理包括应用配置、全局配置和文件配置.
用户可以通过控制台进行分布式配置版本管理、发布配置到部署组或者命名空间范围内的实例;d)细粒度服务治理:TSF提供服务级和API级别的服务治理能力,支持通过控制台配置服务路由、服务限流、服务鉴权规则.
在TSF控制台中,用户可以通过配置、权重标签的形式进行细粒度的流量控制,实现灰度发布、就近路由、部分账号内测、流量限制、访问权限控制等功能;e)数据化运营:TSF提供全面的监控和分布式调用链分析工具,帮助用户把握应用上线后的运行状况,并提供日志分析能力,具体说明如下:1)监控包括应用监控,应用监控的指标包括应用的QPS、请求时间和请求出错率等;2)分布式调用链分析包括调用链查询和调用链详情,用户可以根据时间范围和服务名等条件查询一组调用链,调用链详情显示了请求经过每个服务的层次关系和耗时情况等信息;3)通过日志分析能力,自动获取用户的业务日志并支持在TSF控制台上进行日志查看、日志检索,支持日志关键词告警功能,并提供日志与调用链联动排查线上问题.
f)分布式事务:TSF集成了分布式事务能力,支持TCC模式分布式事务管理功能.
对于跨数据库、跨服务的分布式场景,用户可以通过控制台查看事务运行情况并进行超时事务处理,保证事务的一致性.
7.
3.
2分布式缓存腾讯云使用开源的Redis作为分布式缓存实现,腾讯云适配实现无需特别定制代码,统一使用开源版分布式缓存设计(详见7.
4.
2),直接访问腾讯云版Redis服务.
7.
3.
3分布式消息队列腾讯云的分布式消息队列适配使用腾讯云消息队列CMQ(CloudMessageQueue).
CMQ是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的CMQ队列中,防止消息丢失.
CMQ支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态.
腾讯云分布式消息队列类设计如图20所示,类设计:a)定义了消息生产者实现类MQConsumerByCMQ;b)定义了消息消费者实现类MQProducerByCMQ.
XJ-B01-201926图20腾讯云分布式消息队列类设计7.
3.
4分布式数据库服务腾讯云的分布式数据库服务适配使用TDSQL(TencentDBforTDSQL).
TDSQL是部署在腾讯云上的一种支持自动水平拆分的SharedNothing架构的分布式数据库服务.
目前TDSQL默认部署主备架构,且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案.
7.
3.
5非结构化存储腾讯云的非结构化存储服务适配使用TStack-Ceph.
TSTACK-CEPH是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持HTTP/HTTPS协议访问的分布式存储服务.
腾讯云TSTACK-CEPH的存储桶空间无容量上限,无需分区管理,适用于CDN数据分发、数据万象处理或大数据计算与分析等多种场景.
TSTACK-CEPH提供网页端管理界面、多种主流开发语言的SDK、API以及命令行和图形化工具,并且兼容S3的API接口,方便用户直接使用社区工具和插件.
腾讯云非结构化存储类设计如图21所示,定义了对象存储TSTACK-CEPH实现类FSStoreTencentManagerImpl.
XJ-B01-201927图21腾讯云非结构化存储类设计7.
3.
6日志服务腾讯云的日志服务适配使用CLS(CloudLogService).
CLS提供一站式的日志数据解决方案,提供日志采集、日志存储、日志内容搜索、统计分析等日志服务,有助于解决业务问题定位,指标监控、安全审计等日志问题.
日志服务主要提供以下功能:a)日志采集:通过LogListener、API等方式从不同日志采集端采集日志至日志服务;b)日志存储:使用日志服务存储日志数据;c)日志索引:开启日志索引对日志进行查询,可帮助用户快速定位日志问题;d)日志投递:用户可以将指定日志投递至其他云产品中,如TSTACK-CEPH,满足存储或其他计算需求.
7.
4开源适配实现设计7.
4.
1分布式服务框架开源版的分布式服务框架适配使用Dubbo.
Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现.
Dubbo主要核心部件包括:a)Remoting:网络通信框架,实现了sync-over-async和request-response消息机制;b)RPC:一个远程过程调用的抽象,支持负载均衡、容灾和集群功能;c)Registry:服务目录框架用于服务的注册和服务事件发布和订阅.
7.
4.
2分布式缓存开源适配方案使用开源的Redis作为分布式缓存实现.
开源分布式缓存服务类设计如图22所示,类设计:a)定义了Redis缓存管理器实现类HsafRedisCacheManager;b)定义了Redis缓存实现类HsafRedisCache;c)定义了Redis缓存实现类的值类型适配抽象类HsafRedisAbstractValueAdaptingCache;XJ-B01-201928d)定义了Redis缓存写入器HsafRedisCacheWriter;e)定义了Redis客户端Lettuce的配置类HsafLettuceCache.
图22分布式缓存服务类设计7.
4.
3分布式消息队列开源版的消息队列适配使用Kafka.
Kafka是一款由cala和Java编写的开源流处理平台.
开源版分布式消息队列类设计如图23所示,类设计:a)定义了消息生产者实现类MQConsumerByKafka;b)定义了消息消费者实现类MQProducerByKafka.
XJ-B01-201929图23开源版分布式消息队列类设计7.
4.
4分布式数据库开源版的分布式数据库服务适配使用MyCat.
MyCat是一个开源的实现了MySQL协议的分布式数据库服务,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而后端可以用JDBC协议与大多数主流数据库服务器通信,其核心能力是支持分表分库.
7.
4.
5非结构化存储开源版的非结构化存储服务适配使用FastDFS.
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理功能包括文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题.
FastDFS充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,适合以文件为载体的在线服务.
Tudcloud是一家新开的主机商,提供VPS和独立服务器租用,数据中心在中国香港(VPS和独立服务器)和美国洛杉矶(独立服务器),商家VPS基于KVM架构,开设在香港机房,可以选择限制流量大带宽或者限制带宽不限流量套餐。目前提供8折优惠码,优惠后最低每月7.2美元起。虽然主机商网站为英文界面,但是支付方式仅支付宝和Stripe,可能是国人商家。下面列出部分VPS主机套餐配置信息。CPU:1cor...
简介酷盾安全怎么样?酷盾安全,隶属于云南酷番云计算有限公司,主要提供高防CDN服务,高防服务器等,分为中国境内CDN,和境外CDN和二个产品,均支持SSL。目前CDN处于内测阶段,目前是免费的,套餐包0.01一个。3G流量(高防CDN)用完了继续续费或者购买升级包即可。有兴趣的可以看看,需要实名的。官方网站: :点击进入官网云南酷番云计算有限公司优惠方案流量3G,用完了不够再次购买或者升级套餐流量...
近日Friendhosting发布了最新的消息,新上线了美国迈阿密的云产品,之前的夏季优惠活动还在进行中,全场一次性45折优惠,最高可购买半年,超过半年优惠力度就不高了,Friendhosting商家的优势就是100Mbps带宽不限流量,有需要的朋友可以尝试一下。Friendhosting怎么样?Friendhosting服务器好不好?Friendhosting服务器值不值得购买?Friendho...