云服务器降级是指云服务器的性能下降,从而导致应用程序或网站出现问题的情况。这可能是一个令人沮丧的问题,尤其是在它导致业务中断或数据丢失的情况下。不过,可以通过一些最佳实践来预防云服务器降级,并最大限度地减少性能问题的影响。
最佳实践
- 选择合适的云服务器提供商:选择一家提供可靠且高性能云服务器的提供商非常重要。阅读评论,比较不同提供商的功能,并选择最符合您需求的提供商。
- 选择合适的实例类型:确保为您的应用程序选择合适的实例类型。实例类型是云服务器的特定配置,具有不同的CPU、内存和存储容量。选择与您的应用程序需求相匹配的实例类型非常重要。
- 监控您的云服务器:定期监控您的云服务器以识别潜在问题非常重要。您可以使用监控工具来跟踪服务器的性能指标,例如CPU使用率、内存使用率和磁盘I/O。通过监控您的服务器,您可以及早发现问题并采取措施加以解决。
- 定期备份您的数据:定期备份您的数据非常重要,以防发生意外数据丢失。您可以使用备份工具或服务将您的数据备份到远程位置。通过定期备份,您可以确保即使云服务器发生故障,您的数据仍然是安全的。
- 实施故障转移策略:故障转移策略是一种确保在云服务器发生故障时您的应用程序能够继续运行的计划。故障转移策略可以包括将您的应用程序部署到多个云服务器或使用负载平衡器。通过实施故障转移策略,您可以最大限度地减少云服务器降级的影响。
云服务器降级教程
如果您遇到云服务器降级,可以使用以下步骤进行故障排除:
- 检查您的监控工具:查看您的监控工具以识别潜在问题。检查CPU使用率、内存使用率和磁盘I/O是否存在异常。
- 重新启动您的云服务器:有时,重新启动云服务器可以解决性能问题。重新启动服务器将清除内存并重新加载操作系统,这可能有助于解决问题。
- 联系您的云服务器提供商:如果您无法解决问题,请联系您的云服务器提供商。他们可以帮助您诊断问题并提供解决办法。
结论
通过遵循这些最佳实践,您可以预防云服务器降级并最大限度地减少性能问题的影响。定期监控您的云服务器,定期备份您的数据并实施故障转移策略,可以确保您的应用程序始终安全可靠地运行。
如何设计好的RESTful API
安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。
那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。
HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。
那么,您认为一个好的RESTful API应该具有哪些特征呢? 李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。
浏览器是最常见和最通用的REST客户端。
好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。
这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。
Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。
这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。
REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。
RESTful API建模的过程与面向对象建模类似,是以名词为核心的。
这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。
而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。
对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。
所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。
按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。
将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。
如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。
设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。
这个API应该是松耦合的。
RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。
正是这三个层次确保了RESTful API的松耦合性。
当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。
紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。
尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。
REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。
感兴趣的读者可以参考《REST实战》。
这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。
资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。
GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。
这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。
所以除非有很合理的要求,通常不需要使用自定义的私有格式。
使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。
响应状态代码分成两部分:status code和reason phase。
两部分都是可定制的,也可以使用标准的status code,只定制reason phase。
如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。
这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。
HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。
而在整个HTTP通信链条的很多位置,都可以设置缓存。
HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。
如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。
李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。
我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。
比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。
HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。
再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。
而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。
丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。
马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。
包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。
但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。
提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。
InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。
那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。
要求接入方的请求中必须加上签名参数。
这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。
其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。
使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。
HTTP Digest身份认证可以单独使用,具备中等程度的安全性。
HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。
不过插入自定义加密算法在面向互联网的API中用的不是很多。
这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。
优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。
在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。
HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。
缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。
使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。
其中的加密机制与HTTP Digest身份认证相比,安全性更高。
需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。
OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。
如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。
对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。
仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。
身份认证之后的授权,主要是由应用来控制。
通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。
李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。
当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。
但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。
至于WS-族的协议,我不太了解,不太能参与讨论。
丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。
例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。
在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。
如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。
马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。
InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。
另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。
不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。
李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。
丁雪丰:个人认为最好的版本化,就是没有明显的版本。
在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。
例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。
如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。
也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。
马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。
另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 或者 /v1/ 这样。
InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。
如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。
CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。
HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。
我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。
如果在资源上定义的操作过多,我们会选择拆分出更多的资源。
李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。
但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。
另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。
基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。
丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。
其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。
如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。
马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。
InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。
我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。
b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。
c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。
这三部分的内容对于开发者来说都很有用。
遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。
李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。
InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。
李锟:这个问题我就不详细回答了。
不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。
开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。
保持多样性是繁荣生态环境的基础。
像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。
这些框架目前都做的不错。
我对框架的选择没有倾向性。
RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。
李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。
REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。
当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。
另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。
丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。
如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。
如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。
REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。
马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。
轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。
InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。
HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。
兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。
改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。
更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。
应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。
废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。
增加更多的动词,以适应除CRUD之外的其他场景。
HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。
HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。
在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。
丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。
马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。
深信服成为国内首批一云多芯稳定性工作组成员
12月19日,中国信通院、混沌工程工作室举办“稳保行动”线上沙龙,会上正式宣布成立“一云多芯稳定性工作组”,深信服作为国内资深的云基础设施服务商,凭借在一云多芯稳定性方面的技术沉淀与产品积累,成功选入工作组首批成员单位。
深信服可靠性专家汤洪亮受邀出席了本次沙龙,并进行了《信服云系统稳定性》的演讲,基于系统稳定性建设分享了深信服的实践经验。
信服云“一云多芯”场景汤洪亮认为,近年来信创产业虽然发展快速,但信创产品从“能用”到“好用”仍然有一定的差距。
拿信服云的一云多芯稳定性工作来说,如何快速地兼容各类国产软硬件,建立一个稳定的软硬件生态?云平台如何在中间尽量发挥硬件最大性能?如何快速填补信创场景下的可靠性差距?这些都是需要不断解决和优化的问题。
汤洪亮介绍,信服云致力于打造兼容各种国产软硬件的可靠基础资源平台,帮助用户实现国产化软硬件的改造,发挥IT基础设施的优异性能,构建业务系统平稳运行的优质体验。
在性能调优上,信服云基于多年的现网运行经验,沉淀出各类的软硬件故障场景,并进行深度分析与专项改进。
包括使用FMEA方法分析产品级故障模式,沉淀800+个通用云故障模式,支持300+个信创OS软件及硬件测试场景;自研故障注入工具ChaosArsenal,提供200+个原子故障注入能力,可以发现并解决大部分集中在系统资源加压下的软硬件兼容性、软硬件结合导致的宕机等问题。
同时还支持X86、ARM架构下信创操作系统故障注入,包括硬件、操作系统、虚拟化、容器、中间件、业务等,覆盖度达到75%。
在体验创新上,信服云力求打造真正优质的“双栈”体验。
特别在“一云多芯”场景中,尽可能发挥出cpu和OS的性能潜力和调度能力,追求更大限度地屏蔽底层硬件体系的差异,并不是简单兼容性适配多cpu架构和多种操作系统的补丁式的“一云多芯”,做到不阉割功能、不妥协质量、不降级性能、不锁服务器,真正把用户体验做到双栈一致。
在信创生态建设上,信服云已与国内主流cpu、操作系统、中间件、数据库、办公OA、邮箱等应用完成全系列产品的深度适配,并在全国落地了1000+个信创安全、信创云项目实践,与60+信创生态伙伴达成战略合作共筑信创生态。
汤洪亮在演讲最后表示,信服云未来会继续在信创领域深耕,积极推进信创软硬件上下游生态的融合发展,持续打造信创性能和体验创新最佳实践,为用户提供使用更简单、体验更流畅的信创数字化解决方案。
什么是DevOps
什么是DevOps?
DevOps 是一套实践、工具和文化理念,可以实现软件开发团队和 IT 团队之间的流程自动化和集成。
它强调团队赋能、跨团队沟通和协作以及技术自动化。
DevOps 运动始于 2007 年左右,当时软件开发和 IT 运营社区开始担忧传统的软件开发模式。
在此模式下,编写代码的开发人员与部署和支持代码的运营人员会独立工作。
DevOps 这一术语由“开发”和“运营”两个词构成,它反映了将这些领域整合为一个持续流程的过程。
DevOps 如何运作?
DevOps 团队包括开发人员和 IT 运营人员,他们在整个产品生命周期中进行协作,以提高软件部署的速度和质量。
这是一种全新的工作方式,也是一种文化转型,对团队及其工作的组织具有重大影响。
在 DevOps 模式下,开发和运营团队不再是“孤立”的。
有时,这两个团队会合并为一个团队,合并后工程师会参与整个应用生命周期中的工作(从开发和测试到部署和运营),并具备多学科的技能。
DevOps 团队使用工具实现流程自动化,并加速流程,这有助于提高可靠性。
DevOps 工具链可帮助团队处理重要的 DevOps 基础事项,包括持续集成、持续交付、自动化和协作。
DevOps 的价值有时也会应用于开发团队以外的团队。
当安全团队采用 DevOps 方法时,安全性则成为开发过程中一个活跃的组成部分。
这就是所谓的 DevSecOps。
DevOps 生命周期
由于 DevOps 的连续性,从业人员使用无限循环来展示 DevOps 生命周期各个阶段之间的相互关系。
尽管看似是按顺序进行的,但此循环实际表示需要在整个生命周期进行持续协作和迭代改进。
DevOps 生命周期由六个阶段组成,它们分别代表开发(循环的左半部分)和运营(循环的右半部分)所需的流程、功能和工具。
团队会在每个阶段进行协作和沟通,以保持一致性、速度和质量。
规划
DevOps 团队应采用敏捷开发实践来提高速度和质量。
敏捷开发是一种用于项目管理和软件开发的迭代方法,可帮助团队将工作分解成更小的部分,从而提供增量价值。
构建
Git 是一个免费的开源版本控制系统。
Git 可为分支、合并和重写存储库历史记录提供出色的支持,而这已为开发构建流程带来了众多极具创新且功能强大的工作流和工具。
持续集成和交付
CI/CD可让团队频繁且可预测地发布高品质产品,其范围涵盖从源代码存储库到使用自动化工作流的生产环节。
团队可以频繁地合并代码变更、部署功能标记以及集成端到端测试。
监控和警报
快速识别并解决影响产品正常运行时间、速度和功能的事务。
自动通知您团队有关变更、高风险操作或故障的信息,以便保持服务的运行。
运维
管理面向客户的端到端 IT 服务交付。
这包括设计、实施、配置、部署和维护支持组织服务的所有 IT 基础架构过程中涉及的实践。
持续反馈
DevOps 团队应对每个版本进行评估,并生成报告以改进未来版本。
通过收集持续反馈,团队可以改进其流程,并采纳客户反馈以改进下一个版本。
DevOps 工具
DevOps 工具可应对 DevOps 生命周期的关键阶段。
它们通过帮助改进协作、减少上下文切换、引入自动化以及实现可观察性和监控功能来支持 DevOps 实践。
DevOps 工具链通常遵循两种方法:一体化或开放式工具链。
一体化工具链提供完整的解决方案,通常不会与其他第三方工具集成。
开放式工具链则允许使用不同工具进行自定义。
这两种方法各有优缺点。
DevOps 有哪些优势?
有“2020 年 DevOps 趋势调查”表明,99% 的调查对象表示 DevOps 对他们的组织产生了积极影响。
DevOps 的优势包括更快且更轻松的发布、团队效率、更高的安全性、更高品质的产品,以及更高的团队和客户满意度。
速度
更频繁地实践 DevOps 发布可交付成果的团队具有更高的品质和稳定性。
事实上,DORA 2019 年 DevOps 状况报告发现,精英团队的部署频率和速度分别比表现不佳的团队高出 208 倍和 106 倍。
持续交付使得团队可以使用自动化工具来构建、测试和交付软件。
改进协作
DevOps 的基础是开发人员和运营团队之间的协作文化,他们会分担责任,协调工作。
此举可以提高团队的效率,并省去工作交接和编写专为其运行环境而设计的代码的时间。
快速部署
通过提高发布的频率和速度,DevOps 团队可以快速地改进产品。
快速发布新功能和修复缺陷有助于获得竞争优势。
质量和可靠性
持续集成和持续交付等实践可确保变更正常运行且安全无误,从而提高软件产品的质量。
监控则有助于团队实时了解性能。
安全性
通过将安全性集成到持续集成、持续交付和持续部署管道中,DevSecOps 成为开发过程中一个活跃的组成部分。
通过将主动安全审计和安全测试集成到敏捷开发和 DevOps 工作流中,可将安全性植入产品内。
采用 DevOps 会面临哪些挑战?
原有的习惯很难改变。
深陷孤立工作方式的团队可能会难以应对,甚至抗拒彻底改变团队结构以采用 DevOps 实践。
某些团队可能会错误地认为有了新工具就足以采用 DevOps。
但是,DevOps 是人员、工具和文化的结合。
DevOps 团队的每一个人都必须了解整个价值流,从构思、开发到最终用户体验。
它要求打破孤岛,以便在整个产品生命周期中进行协作。
Devops 不是任何一个个人的工作,而是每个人的工作。
从传统的基础架构转向使用基础架构即代码 (IaC) 和微服务可以加快开发和创新速度,但增加的运营工作量可能极具挑战性。
最好为自动化、配置管理和持续交付实践奠定坚实的基础,以帮助减负。
过度依赖工具会使团队偏离 DevOps 的必要基础:团队和组织结构。
一旦建立了结构,就应该建立流程和团队,然后确定工具。
如何采用 DevOps?
首先,采用 DevOps 需要致力于评估且可能更改或删除组织当前所用的所有团队、工具或流程。
这表示需要构建必要的基础架构,以便团队能够自主构建、部署和管理其产品,而不必过分依赖于外部团队。
DevOps 文化
DevOps 文化是指团队采用新工作方式(包括加强合作和沟通)的环境。
这是人员、流程和工具的协调一致,以实现更加统一的客户导向服务。
多学科团队负责产品的整个生命周期。
持续学习
在 DevOps 方面表现良好的组织鼓励进行实验和一定程度的冒险。
在这些组织中,跳出固有思维模式是常态,而失败则被理解为学习和进步的自然组成部分。
敏捷
敏捷开发方法在软件行业中非常受欢迎,因为它们赋予了团队内在的灵活性、出色的有序性以及响应变化的能力。
DevOps 是一种文化转型,可促进软件构建和维护人员之间的协作。
搭配使用敏捷开发和 DevOps 时,可提高效率和可靠性。
DevOps 实践
持续集成
持续集成是将代码更改自动集成到软件项目中的实践。
它允许开发人员频繁地将代码更改合并到执行构建和测试的中央存储库中。
这有助于 DevOps 团队更快速地修复缺陷、提高软件质量以及缩短验证和发布新软件更新所需的时间。
持续交付
持续交付通过自动将代码更改部署到测试/生产环境中来扩展持续集成。
它会沿着持续交付管道推进。
而在此管道内,自动化构建、测试和部署会被编排为一个发布工作流。
情境意识
对于组织中的每个成员来说,能够访问他们需要的数据以尽可能高效和快速地完成他们的工作可谓至关重要。
团队成员需收到部署管道中的故障警报(无论是系统性故障还是由于测试失败引起的故障),并及时收到在生产中所运行应用的运行状况和性能的最新信息。
指标、日志、跟踪、监控和警报都是团队了解其工作进展所需的重要反馈来源。
自动化
自动化是其中一个最重要的 DevOps 实践,因为它能让团队更快速地完成高品质软件的开发和部署流程。
利用自动化,将代码变更推送到源代码存储库的一个简单操作便可触发构建、测试和部署流程,从而大大减少这些步骤所花的时间。
基础架构即代码
无论您的组织是拥有本地数据中心,还是完全托管在云中,能快速、一致地调配、配置和管理基础架构是成功采用 DevOps 的关键。
基础架构即代码 (IaC) 不仅仅是编写基础架构配置脚本,它还将基础架构定义视为实际代码:使用源控制、代码审查、测试等。
微服务
微服务是一种架构技术。
在此技术中,应用被构建为一系列可以相互独立部署和运行的小型服务。
每个服务都有其自己的流程,并通过接口与其他服务通信。
这种关注点分离和剥离的独立功能支持 DevOps 实践,例如:持续交付和持续集成。
监控
DevOps 团队监控从规划、开发、集成和测试、部署到运营的整个开发生命周期。
如此一来,团队就能迅速、自动地对客户体验中的任何降级做出响应。
更重要的是,它允许团队“左移”至开发的早期阶段,并最大程度地减少具有破坏性的生产变更。
开始使用 DevOps
开始使用 DevOps 的最简方法就是识别小型价值流(例如:小型支持应用或服务),然后开始尝试一些 DevOps 实践。
与软件开发一样,与一小群利益相关者一起转换单个数据流比尝试在组织内一次性过渡至全新的工作方式要容易得多。