精华内容
下载资源
问答
  • 什么是原生APP首先说明下什么是原生APP?原生APP又称Native App,开发针对苹果IOS封闭、Android开源等不同的手机操作系统用不同语言进行开发,如C语言java等,安卓手机需要针对上千款品牌手机型号的参数大小来调控...

    什么是原生APP

    首先说明下什么是原生APP?原生APP又称Native App,开发针对苹果IOS封闭、Android开源等不同的手机操作系统用不同语言进行开发,如C语言java等,安卓手机需要针对上千款品牌手机型号的参数大小来调控按键所在位置避免误差,测试调试的工作量较大,然而这种APP通常是由“云服务器数据+APP应用客户端”两部份构成,APP应用所有的UI元素、数据内容、逻辑框架均安装在手机终端上。

    原生APP功能更强大

    原生APP是系统性的应用程序,可以地用手机终端的硬件设备,比如语音、短信、GPS、蓝牙、重力感应和摄像头等,但是webAPP是不可以做到这些的。所以如果你想做一个可扩展性强,而且后期功能不断完善的APP,一定要考虑原生的。

    原生APP加载速度更快

    原生APP是由 “云服务器数据+APP应用客户端” ”两部分构成,APP应有所有的UI元素、数据内容、逻辑框架都是安装在手机里的。所以用户在使用APP的时候,不需要重新加载数据,因为这些内容都安装在手机中了,虽然第一次安装的时候有点复杂,但是在实际使用会方便很多。

    但是web APP打开每一个页面,都需要重新加载,虽然现在网络情况很好了,但是在实际中可能会有各种问题,比如流量用完了、所在区域网络不好或出了问题,就很大可能出现加载慢或者加载不出来的问题,加载多了很容易出现卡死错乱的情况,用户的体验就会很差。因此考虑到用户体验和加载速度方面,原生APP的性能要远远优于web。

    原生APP稳定性更好

    目前市场的web版的APP多为模板,这种模板价格便宜,但是功能无法拓展,而且随着市场上浏览器、技术的进步,会逐步出现各种问题,稳定性根本无法保证。相比而言原生的APP技术更加成熟,而且功能可以拓展性更强。

    原生APP和web相比有很多优势,web的好处就是拿别人的直接用,工期上可以很快,而原生的则需考虑功能实现、兼容等问题,这也是价格差别的重要原因。视频加密使用原生APP开发可以做到安全等级更高,点盾云采用的就是原生开发,功能更强大,操作快捷,加密更安全!

    展开全文
  • 什么是原生

    2021-03-20 20:54:38
    1,什么是原生: 1.1 CNCF组织 CNCF,即云原生计算基金会,2015年由谷歌牵头成立,基金会成员目前已有一百多企业与机构,包括亚马逊、微软。思科等巨头。 1.2 云原生 CNCF给出了云原生应用的三大特征: 容器...

    一下内容参考自:

    http://dockone.io/article/2991

    https://zhuanlan.zhihu.com/p/74483850

    没有什么新东西,主要是手写一下,加深记忆

     

    1,什么是云原生:

    1.1 CNCF组织

    CNCF,即云原生计算基金会,2015年由谷歌牵头成立,基金会成员目前已有一百多企业与机构,包括亚马逊、微软。思科等巨头。

    1.2 云原生

    CNCF给出了云原生应用的三大特征:

    • 容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
    • 动态管理:通过集中式的编排调度系统来动态的管理和调度。
    • 面向微服务:明确服务间的依赖,互相解耦。

    云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务软件。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。

    这边引用网上关于云原生所需要的能力和特征总结,如下图。

     

     

    1.3 The Twelve Factors

    12-Factors经常被直译为12要素,也被称为12原则,12原则由公有云PaaS的先驱Heroku于2012年提出(https://12factor.net/),目的是告诉开发者如何利用云平台提供的便利来开发更具可靠性和扩展性、更加易于维护的云原生应用。具体如下:

    • 基准代码
    • 显式声明依赖关系
    • 在环境中存储配置
    • 把后端服务当作附加资源
    • 严格分离构建、发布和运行
    • 无状态进程
    • 通过端口绑定提供服务
    • 通过进程模型进行扩展
    • 快速启动和优雅终止
    • 开发环境与线上环境等价
    • 日志作为事件流
    • 管理进程


    另外还有补充的三点:

    • API声明管理
    • 认证和授权
    • 监控与告警


    距离12原则的提出已有多年,12原则的有些细节可能已经不那么跟得上时代,也有人批评12原则的提出从一开始就有过于依赖Heroku自身特性的倾向。不过不管怎么说,12原则依旧是业界最为系统的云原生应用开发指南。

     

     

    2. 容器化封装

    最近几年Docker容器化技术很火,经常在各种场合能够听到关于Docker的分享。Docker让开发工程师可以将他们的应用和依赖封装到一个可移植的容器中。Docker背后的想法是创建软件程序可移植的轻量容器,让其可以在任何安装了Docker的机器上运行,而不用关心底层操作系统。

    Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。其优势包括:

    • 隔离应用依赖
    • 创建应用镜像并进行复制
    • 创建容易分发的即启即用的应用
    • 允许实例简单、快速地扩展
    • 测试应用并随后销毁它们


    自动化运维工具可以降低环境搭建的复杂度,但仍然不能从根本上解决环境的问题。在看似稳定而成熟的场景下,使用Docker的好处越来越多。

     

    3. 服务编排

    笔者看到Jimmy Song对云原生架构中运用服务编排的总结是:

    Kubernetes——让容器应用进入大规模工业生产。

    这个总结确实很贴切。编排调度的开源组件还有:Kubernetes、Mesos和Docker Swarm。
     

    Kubernetes是目前世界上关注度最高的开源项目,它是一个出色的容器编排系统。Kubernetes出身于互联网行业的巨头Google公司,它借鉴了由上百位工程师花费十多年时间打造Borg系统的理念,通过极其简易的安装,以及灵活的网络层对接方式,提供一站式的服务。
    Mesos则更善于构建一个可靠的平台,用以运行多任务关键工作负载,包括Docker容器、遗留应用程序(例如Java)和分布式数据服务(例如Spark、Kafka、Cassandra、Elastic)。Mesos采用两级调度的架构,开发人员可以很方便的结合公司业务场景自定制MesosFramework。

    他们为云原生应用提供的强有力的编排和调度能力,它们是云平台上的分布式操作系统。在单机上运行容器,无法发挥它的最大效能,只有形成集群,才能最大程度发挥容器的良好隔离、资源分配与编排管理的优势,而对于容器的编排管理,Swarm、Mesos和Kubernetes的大战已经基本宣告结束,Kubernetes成为了无可争议的赢家。

     

    4. 微服务架构

    传统的Web开发方式,一般被称为单体架构(Monolithic)所有的功能打包在一个WAR包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了DO/DAO,Service,UI等所有逻辑。其架构如下图所示。

     

     

     单体架构进行演化升级之后,过渡到SOA架构,即面向服务架构。近几年微服务架构(Micro-Service Archeticture)是最流行的架构风格,旨在通过将功能模块分解到各个独立的子系统中以实现解耦,它并没有一成不变的规定,而是需要根据业务来做设计。微服务架构是对SOA的传承,是SOA的具体实践方法。微服务架构中,每个微服务模块只是对简单、独立、明确的任务进行处理,通过REST API返回处理结果给外部。在微服务推广实践角度来看,微服务将整个系统进行拆分,拆分成更小的粒度,保持这些服务独立运行,应用容器化技术将微服务独立运行在容器中。过去设计架构时,是在内存中以参数或对象的方式实现粒度细化。微服务使用各个子服务控制模块的思想代替总线。不同的业务要求,服务控制模块至少包含服务的发布、注册、路由、代理功能。

    容器化的出现,一定程度上带动了微服务架构。架构演化从单体式应用到分布式,再从分布式架构到云原生架构,微服务在其中有着不可或缺的角色。微服务带给我们很多开发和部署上的灵活性和技术多样性,但是也增加了服务调用的开销、分布式系事务、调试与服务治理方面的难题。

     

    微服务架构图如下

     

     

    Spring Cloud和Kubernetes有很大的不同,Spring Cloud和Kubernetes处理了不同范围的微服务架构技术点,而且是用了不同的方法。Spring Cloud方法是试图解决在JVM中的微服务架构要点,而Kubernetes方法是试图让问题消失,为开发者在平台层解决。Spring Cloud在JVM中非常强大,Kubernetes管理那些JVM很强大。看起来各取所长,充分利用这两者的优势是自然而然的趋势了。

    5.png

     

     

    展开全文
  • \n前言\n\n特别指出:这次分享主要希望起到抛砖引玉的作用,让大家更多的参与到云原生这个话题的讨论,希望后面有更多更好的分享。我们笨鸟先飞,起一个头。\n\n内容主要围绕这几个问题,上半场我们将围绕前三个...

    今天和大家一起聊一聊云原生这个话题,内容来自蚂蚁金服中间件服务与容器团队。

    \n

    由于内容比较多,我们分为上下两个半场。

    \n

    前言

    \n

    \"\"

    \n

    特别指出:这次分享主要是希望起到抛砖引玉的作用,让大家更多的参与到云原生这个话题的讨论,希望后面有更多更好的分享。我们笨鸟先飞,起一个头。

    \n

    \"\"

    \n

    内容主要围绕这几个问题,上半场我们将围绕前三个问题。

    \n

    如何理解云原生?

    \n

    第一个话题:如何理解“云原生”?之所以将这个话题放在前面,是因为,这是对云原生概念的最基本的理解,而这会直接影响到后续的所有认知。

    \n

    每个人对云原生的理解都可能不同,就如莎士比亚所说:一千个人眼中有一千个哈姆雷特。

    \n

    \"\"

    \n

    我们来快速回顾一下云原生这个词汇在近年来定义的变化。

    \n

    \"\"

    \n

    先看Pivotal,云原生的提出者,是如何定义云原生的。

    \n

    \"\"

    \n

    这是2015年,云原生刚刚开始推广时,Matt Stine给出的定义。

    \n

    \"\"

    \n

    两年之后,同样是Matt Stine。

    \n

    \"\"

    \n

    而这是Pivotal最新官方网站的描述。可见Pivotal对云原生的定义一直在变。

    \n

    \"\"

    \n

    再来看看目前云原生背后最大的推手,CNCF,这是2015年CNCF刚成立时对云原生的定义。

    \n

    \"\"

    \n

    2018年CNCF更新了云原生的定义。

    \n

    \"\"

    \n

    这是新定义中描述的代表技术,其中容器和微服务两项在不同时期的不同定义中都有出现,而服务网格这个在2017年才开始被社区接纳的新热点技术被非常醒目的列出来,和微服务并列,而不是我们通常认为的服务网格只是微服务在实施时的一种新的方式。

    \n

    \"\"

    \n

    云原生自身的定义一直在变,这让我们该如何才能准确的理解云原生呢?

    \n

    \"\"

    \n

    这里我们尝试,将Cloud Native这个词汇拆开来理解,先看看什么是Cloud。

    \n

    \"\"

    \n

    快速回顾一下云计算的历史,来帮助我们对云有个更感性的认识。

    \n

    \"\"

    \n

    云计算的出现和虚拟化技术的发展和成熟密切相关,2000年前后x86的虚拟机技术成熟后,云计算逐渐发展起来。

    \n

    \"\"

    \n

    基于虚拟机技术,陆续出现了IaaS/PaaS/FaaS等形态,以及他们的开源版本。

    \n

    \"\"

    \n

    2013年docker出现,容器技术成熟,然后围绕容器编排一场大战,最后在2017年底,kubernetes胜出。2015年CNCF成立,并在近年形成了cloud native生态。

    \n

    \"\"

    \n

    这是云的形态变化,可以看到:供应商提供的功能越来越多,而客户或者说应用需要自己管理的功能越来越少。

    \n

    \"image\"

    \n

    当云发生如此之大的变化时,云上的应用要如何适应?

    \n

    \"image\"

    \n

    在回顾完云计算的历史之后,我们对Cloud有更深的认识,接着继续看一下:什么是Native?

    \n

    \"image\"

    \n

    这是从字典中摘抄下来的对Native词条的解释,注意其中标红的关键字。

    \n

    \"image\"

    \n

    Native,总是和关键字 Born 联系在一起。

    \n

    \"image\"

    \n

    那Cloud和native和在一起,又该如何理解?

    \n

    \"image\"

    \n

    这里我们抛出一个我们自己的理解:云原生代表着原生为云设计。详细的解释是:应用原生被设计为在云上以最佳方式运行,充分发挥云的优势。

    \n

    这个理解有点空泛,但是考虑到云原生的定义和特征在这些年间不停的变化,以及完全可以预料到的在未来的必然变化,我觉得,对云原生的理解似乎也只能回到云原生的出发点,而不是如何具体实现。

    \n

    云原生应用应该是什么样子?

    \n

    \"image\"

    \n

    那在这么一个云原生理解的背景下,我再来介绍一下我对云原生应用的设想,也就是我觉得云原生应用应该是什么样子。

    \n

    \"image\"

    \n

    在云原生之前,底层平台负责向上提供基本运行资源。而应用需要满足业务需求和非业务需求,为了更好的代码复用,通用型好的非业务需求的实现往往会以类库和开发框架的方式提供,另外在SOA/微服务时代部分功能会以后端服务的方式存在,这样在应用中就被简化为对其客户端的调用代码。

    \n

    然后应用将这些功能,连同自身的业务实现代码,一起打包。

    \n

    \"\"

    \n

    这是传统非云原生应用的一个形象表示:在业务需求的代码实现之后,包裹厚厚的一层非业务需求的实现(当然以类库和框架的形式出现时代码量没这么夸张)。

    \n

    \"\"

    \n

    而云的出现,可以在提供各种资源之外,还提供各种能力,从而帮助应用,使得应用可以专注于业务需求的实现。

    \n

    \"\"

    \n

    在我们设想中,理想的云原生应用应该是这个样子:业务需求的实现占主体,只有少量的非业务需求相关的功能。

    \n

    \"\"

    \n

    非业务需求相关的功能都被移到云,或者说基础设施中去了,以及下沉到基础设施的中间件。

    \n

    \"image\"

    \n

    以服务间通讯为例:需要实现上面列举的各种功能。

    \n

    \"image\"

    \n

    SDK的思路:通过一个胖客户端,在这个客户端中实现各种功能。

    \n

    \"image\"

    \n

    Service Mesh的思路,体现在将SDK客户端的功能剥离出来,放到Sidecar中。

    \n

    \"image\"

    \n

    通过这种方式,实现应用的轻量化。此时绝大部分的功能都在剥离,应用中只留下一个轻量级的客户端。这个轻量级客户端中还保留有少数功能和信息,比如目标服务的标识(指出要调用的目标),序列化的实现。

    \n

    这里特别指出,有一个功能是我们努力尝试但是始终没有找到办法的:业务动态配置的客户端。也就是如何获取和应用业务逻辑实现相关的动态配置信息。如果有哪位同学对此有研究,希望可以指教。

    \n

    \"image\"

    \n

    我们的想法,云原生应用应该超轻量化的方向努力,尽量将业务需求之外的功能剥离出来。当然要实现理想中的状态还是比较难的,但是及时是比较务实的形态,也能比非云原生下要轻量很多。

    \n

    \"image\"

    \n

    在这里举一个效果比较理想的实际案例,在service mesh中实现密文通讯。

    \n

    由于客户端和服务器端两个sidecar的存在,因此我们可以通过Sidecar之间的协商与合作分别实现加密和解密,从而实现远程通讯的密文传输,而这个加密和解密的过程对于原有应用是透明的。

    \n

    云原生下的中间件该如何发展?

    \n

    \"image\"

    \n

    云原生涉及到的面非常广,对开发测试运维都会有影响,我们这里将聚焦在中间件,给出我们的一些粗浅的想法,因为我们来自中间件部门。大家也可以将中间件自行替换为自己关心的领域,尝试思考一下这个问题。

    \n

    \"image\"

    \n

    前面我们讲到云原生应用的理想形态和轻量化方向,这里隐含了一个前提:不管云原生应用的形态如何变化,云原生应用最终对外提供的功能应该是保持一致的。

    \n

    \"image\"

    \n

    而要实现这一点,应用需要依赖于云提供的能力,来替换因应用轻量化而剥离的原有能力,云提供的能力是应用形态演变的基础和前提。

    \n

    \"image\"

    \n

    理想状态下,我们期望云能够提供应用需要的所有能力,这样应用就可以以最原生化的形态出现。但是现实是这一点远还没有做到,我们依然需要在云之外额外提供一些功能,比如原有中间件的功能。

    \n

    \"image\"

    \n

    在云原生之前,中间件的做法通常是以类库和框架的形式出现,近年来也有服务形式。而在云原生时代,我们的想法是让中间件下沉到基础设施,成为云的一部分。

    \n

    \"image\"

    \n

    在这里解释一下,在前面就提到了“下沉”,什么是下沉?

    \n

    \"\"

    \n

    我们的想法是:云原生下的中间件,功能应该继续提供,但是中间件给应用的赋能方式,应该云原生化:

    \n
    • \n
    • 在云原生之前,应用需要实现非常多的能力,即使是以通过类库和框架的方式简化,其思路是加强应用能力,方式如左图所示,通过提供更大更厚的衣物来实现御寒御寒能力。\n
    • 云原生则是另外的思路,主张加强和改善应用运行环境(即云)来帮助应用,如右图所示,通过提供温暖的阳光,来让轻量化成为可能。\n
    \n

    \"image\"

    \n

    我们以Service Mesh模式为例来详细讲解,首先我们以白盒的视角来看Service Mesh的工作原理:

    \n
    1. \n
    2. 以原生模式开发应用:应用只需具备最基本的能力,如客户端简单发一个请求给服务器端\n
    3. 部署时动态插入Sidecar:当我们将开发的云原生应用部署到云上,具体说是部署在k8s的pod中时,我们会自动在pod中再部署一个Sidecar,用于实现为应用赋能\n
    4. 在运行时,我们会改变云原生应用的行为:如前面所说客户端简单发一个请求给服务器端,在这里会被改变为将请求劫持到Sidecar,注意这个改变对应用而言是透明无感知的\n
    5. 在Sidecar中实现各种功能:Sidecar里面就可以实现原有SDK客户端实现的各种功能,如服务发现,负载均衡,路由等等\n
    6. Sidecar在实现这些功能时,可以对接更多的基础设施,也可以对接其他的中间件产品,这种情况下,Service Mesh产品会成为应用和基础设施/中间件之间的桥梁\n
    7. 可以通过控制平面来控制Sidecar的行为,而这些控制可以独立于应用之外\n
    \n

    \"image\"

    \n

    我们再以应用的视角,将云和下沉到云中的Service Mesh产品视为黑盒,来看Service Mesh模式:

    \n
    1. \n
    2. 以原生模式开发应用\n
    3. 以标准模式部署应用:底下发生了什么不关心\n
    4. 客户端简单发一个请求给服务器端:底下是如何实现的同样不关心,应用只知道请求最终顺利发送完成\n
    \n

    Service Mesh产品的存在和具体工作模式,对于运行于其上的云原生应用来说是透明无感知的,但是在运行时这些能力都动态赋能给了应用,从而帮助应用在轻量化的同时依然可以继续提供原有的功能。

    \n

    \"image\"

    \n

    Mesh模式不仅仅可以用于服务间通讯,也可以应用于更多的场景:

    \n
    • \n
    • Database mesh:用于数据库访问\n
    • Message mesh:用于消息系统\n
    \n

    \"image\"

    \n

    中间件下沉到基础设施的方式,不只是有Mesh模式一种,而且也不是每个中间件都需要改造为Mesh模式,比如前面我们提到有些中间件是可以通过与Mesh集成的方式来间接为应用提供能力,典型如监控,日志,追踪等。

    \n

    我们也在探索mesh模式之外的更多模式,比如DNS模式,目前还在探索中。

    \n

    简单归纳一下我们目前总结的云原生赋能(Cloud Empower)的基本工作原理:

    \n
    • \n
    • 首先要将功能实现从应用中剥离出来:这是应用轻量化的前提和基础\n
    • 然后在运行时为应用 动态赋能:给应用的赋能方式也要云原生化,要求在运行时动态提供能力,而应用无感知\n
    \n

    本次畅谈云原生分享的上半场内容就到这里结果了,欢迎继续观看下半场内容。

    \n

    如开头所说,这次分享是希望起到一个抛砖引玉的作用,期待后面会有更多同学出来就云原生这个话题进行更多的分享和讨论。也希望能有同学介绍更多云原生的实现模式,更多云原生的发展思路,拭目以待。

    \n
    展开全文
  • 什么是原生应用

    2020-03-19 16:34:24
    作者:成富,资深架构师,拥有多年一线开发经验,曾就职于IBM,后...*本文经作者授权整理发布,内容选自《云原生微服务架构实战精讲》 云原生应用的概念 顾名思义,云原生应用的概念由云和原生两个部分组成...

     

    作者:成富,资深架构师,拥有多年一线开发经验,曾就职于IBM,后移居海外创业,现任公司首席软件工程师,负责基于微服务架构的云原生产品研发。资深技术作家,著有多部中英文技术书籍:《深入理解 Java7 》《Exploring Java9》等。

    *本文经作者授权整理发布,内容选自《云原生微服务架构实战精讲》

     

    云原生应用的概念

     

    顾名思义,云原生应用的概念由云和原生两个部分组成,云在这里指的是云平台,也就是平台即服务(Platform as a Service,PaaS);原生应用指的是专门针对云平台而设计和实现的,充分利用了云平台的特性。应用的微服务可以专注于实现业务逻辑,而把微服务架构的复杂度交给云平台来解决。

     

    原生这个词在软件开发中有它独特的含义。原生通常意味着高效和难以移植,也意味着针对特定的平台而设计,可以充分利用平台的特性,因此运行起来非常高效;同样意味着与特定平台的深度绑定,很难移植到其他平台。云原生应用同样具有这两个特征,对于云原生应用来说,难移植并不是一个问题,毕竟迁移到云平台之后,不会再想迁移回去。

     

    云原生应用的特征

    与其他应用相比,总结起来,云原生应用有如下 15 个特征:

     

    1、单一代码库

    云原生应用必须有单一的代码库,并在版本管理系统中进行追踪。单一代码库可以是一个版本库,也可以是共享同一根目录的多个版本库,其重要性在于每一个代码提交(Commit)都会对应一个不可变的构建版本。在每次代码提交之后,持续集成流程会被触发,最终产生一系列的应用容器镜像,这就在代码提交和构建版本之间建立了一对一的对应关系,这种一对一的关系保证了每个构建版本都是可追踪的,可以比较不同版本之间的代码变化。

     

    对于微服务架构的应用来说,每个应用由多个服务组成,这些服务应该由单一的代码库进行管理,这保证了构建版本的稳定性。如果一个改动涉及到多个服务,则这个改动应该在一次代码提交中完成对所有相关服务的修改;如果服务的代码分散在多个代码库中,则一个改动会被分成多个代码提交,每个代码提交都会触发一次持续集成流程,产生对应服务的构建版本,这些服务的构建版本只包含了部分改动,是不完整的。在应用部署时,有的服务可能包含了部分改动,而有的服务则没有,这使得部署的应用实际上是不能工作的。因此,微服务架构的应用应该使用单一代码库。

     

    2、API 优先

    云原生应用应该采用 API 优先的设计策略。微服务架构的应用使用公开 API 来作为服务的对外接口,API 屏蔽了服务的内部实现细节。API 优先的设计策略指的是在设计阶段,应该首先设计 API 并确定 API 的细节。API 的设计过程需要多个团队的参与,包括 API 的实现者和可能的使用者,这些团队在充分讨论中最终完成了 API 的定义。API 可以使用 OpenAPI 规范描述,从该规范中可以生成 API 文档和模拟服务器。

     

    API 优先的策略保证了 API 的稳定性,同时可以减少不必要的后期修改。因为 API 是服务之间的接口,修改 API 就意味着相关的内部实现、测试用例和 API 的使用者都需要进行修改,如果在应用开发中出现了必须修改 API 的情况,那造成的影响是很大的。API 优先确保了尽可能减少在开发中对 API 进行修改。

     

    API 优先的另外一个好处是可以提高开发效率。API 确定之后,可以利用工具生成文档和模拟服务器,API 的使用者可以根据文档来编写使用 API 的代码。测试人员可以编写 API 相关的测试用例,并用模拟服务器运行测试。不同的团队可以并行工作,从而提高效率。

     

    3、依赖管理

    云原生应用应该管理自己的依赖,Java 开发人员对依赖管理应该并不陌生,常用的 Java 构建工具 Maven 和 Gradle 都提供了依赖管理的支持。在开发过程中,只需要利用构建工具的支持即可;在管理依赖时,则需要区分应用自带的依赖和运行环境提供的依赖。云原生应用通常会包含全部所需的依赖,尤其是以容器形式运行的应用,典型的例子是微服务的 REST API。云原生应用会自带嵌入式的 Tomcat 这样的服务器来提供 HTTP 服务。

     

    4、设计、构建、发布和运行

    云原生应用应该有完整的设计、构建、发布和运行流程,如下图所示。

     

     

    设计

    设计在云原生应用的开发中必不可少。传统应用通常采用瀑布式的开发流程,瀑布式的开发流程中会分配足够的时间进行设计。云原生应用一般采用敏捷软件开发流程,但是这并不意味着设计变得不再重要,只不过设计过程变成了一个迭代的过程,而且每次设计的范围较小,通常只需要对某些新特性进行设计。

     

    构建

    构建阶段从单一代码库中创建出带版本号的二进制工件,构建过程通常由持续集成服务器来完成,每个构建都必须有唯一不变的版本号,构建出来的二进制工件也是不可变的。这就保证了同一个构建版本在经过测试之后,被部署的版本与测试过的版本保持一致。

     

    发布

    把构建出来的工件推送到云平台之上,就得到了一个发布版本,发布版本中包含与部署环境相关的配置信息。云原生应用在部署时,通常有开发、测试和生产 3 个环境,在每个环境上的配置信息都不尽相同。发布版本也是不可变的,有唯一的发布号,每一个构建版本都可能对应多个发布版本。

     

    运行

    运行阶段在云平台之上运行应用,运行的方式取决于云平台,可以是虚拟机或容器。云平台负责管理应用的运行,包括监控应用运行状态、处理失败的情况和动态水平扩展等。

     

    5、代码、配置和凭据

    代码、配置和凭据是云原生应用开发中创建的三种不同类型的实体。代码包括源代码和相关资源文件;配置是与部署环境相关的配置信息,通常以 XML、YAML、JSON 或属性文件的形式出现,配置中包含的信息包括第三方服务的连接方式、数据库连接信息和应用自身的配置属性等;凭据指的是密码、私钥和 API 密钥等敏感信息。

     

    代码和配置的区别在于,代码不会随着部署环境而变化,而配置则相反。在实践中,应该尽可能把配置从应用中分离出来,进行外部化管理,构建出来的二进制工件中不包含任何配置信息,实际的配置值在部署时根据环境来确定。在运行时,一般使用环境变量来传递配置值,还可以使用类似 Spring Cloud Config 这样的专门配置服务器来管理配置值,凭据都应该从源代码仓库中删除。

     

    6、日志

    日志是应用开发中不可或缺的部分。与传统应用不同的是,云原生应用并不需要对日志的输出方式进行很多配置,只是简单地把日志写到标准输出流(stdout)和标准错误流(stderr)。日志的收集和处理由云平台上的其他服务来提供,这把应用开发人员从日志管理相关的任务中解放出来。云平台上的日志管理服务非常多,开源的典型实现包括 Elastic 技术栈(ElasticSearch + LogStash + Kibana)和 Fluentd。

     

    7、随时可丢弃

    云原生应用的生命周期可能是短暂的,随时可能被终止。云平台可能会随时启动和停止应用的实例,这就要求云原生应用的启动和停止速度都要非常快。当应用的负载突然增大时,可以快速地启动新的实例来处理请求;当应用的实例出现问题时,可以快速启动一个新的实例作为替代。快速停止应用和快速启动应用一样重要,快速停止应用保证了资源可以被及时释放。

     

    8、支撑服务

    云原生应用的运行离不开支撑服务。支撑服务是一个宽泛的概念,包括数据库、消息中间件、缓存、用户认证和授权、存储等。连接这些支撑服务的配置信息应该被抽离出来,在运行时根据部署环境提供实际值。

     

    9、环境等同

    云原生应用的不同部署环境是等同的。开发、测试和生产环境之间不应该有差异,环境的等同性保证了云原生应用可以快速的进行部署,这一特征与构建工件的不变性是相辅相成的,两者缺一不可。有了这两个特征之后,每一个唯一版本的构建工件可以被依次部署到不同的环境,在测试环境上经过测试的版本,可以直接部署到生产环境。我们可以确定应用在生产环境上的行为与测试环境中一样。

     

    10、管理任务

    云原生应用运行中可能会需要执行一些管理任务,比如生成报表或者执行一次性的数据查询等,这些任务通常并不属于业务流程的一部分,更多的是为了管理和运维的需要。这些任务在执行中会用到云原生应用所依赖的支撑服务,对于这些任务,应该创建独立的应用,并在同样的云平台上运行。对于定期执行的任务,可以充分利用云平台的支持,比如,Kubernetes 提供了对定时任务(CronJob)的支持。

     

    以生成报表为例,可以创建一个独立的应用来读取数据库并生成报表,该应用可以有自己独立的容器镜像。如果报表生成是手动触发的,该应用应该独立运行,并提供一个 API 接口来允许外部触发。如果报表生成是定期的,应用部署时可以创建相应的定时任务来运行容器,在容器启动时自动生成报表,生成完毕之后,容器运行结束。下图说明了这两种触发方式的区别,圆角矩形的边框表示应用的边界。

     

     

    11、端口绑定

    云原生应用在运行时并不负责管理实际的端口绑定,而是由云平台统一管理。比如,一个基于 Spring Boot 的微服务应用通常在 8080 端口运行 HTTP 服务,当应用运行在云平台上时,这个端口只是虚拟机或容器内的端口,并不是外部用户或其他服务访问时的实际端口。云平台对网络进行统一管理,负责分配实际的端口,云平台同时提供了相应的机制来发现访问服务的实际地址和端口。

     

    12、无状态进程

    云原生应用应该是无状态的。所有的状态信息都应该从应用中抽离出来,并保存在支撑服务中,比如数据库中。正因为应用是无状态的,才可以由云平台快速的启动和停止,并进行垂直或水平扩展。

     

    13、并发性

    云原生应用使用水平扩展来并发运行多个实例,使用负载均衡来把请求分配到某个实例进行处理。

     

    14、遥测数据

    云原生应用需要收集一系列遥测数据,包括应用性能指标、运行状态和日志等,这些遥测数据,对于云平台和应用来说同等重要。云平台可以用性能指标来进行自动水平扩展,比如,Kubernetes 支持 Pod 的自动水平扩展,当 CPU 的利用率超过预定的阈值时,会自动启动新的 Pod 来处理请求。性能指标分成两类:一类是业务无关的,比如请求的数量、请求的处理速度、以及平均的请求处理时间等;第二类是业务相关的,需要应用根据业务需求进行收集,比如处理的订单数量和不同商品的销售情况等。云原生应用通常会创建仪表盘来实时展示整体的运行状态,方便运维人员进行监控。

     

    15、认证和授权

    云原生应用应该是安全的,安全应该在应用的设计阶段就充分考虑。在实现中,可以使用基于角色的访问控制(RBAC)来保护 API,已经有大量的开源框架来帮助实现认证和授权。

     

    在理想情况下,云原生应用应该具备上述全部 15 个特征,但是在实际的开发中,不一定能够做到。开发团队可以根据需要,选择对应用最重要的特征来实现。

     

    关于微服务架构云原生应用的开发,在我的专栏《云原生微服务实战架构精讲》中,有更详细的阐述。在这个专栏中,我将借助一个类似优步、滴滴打车的后台服务,一步一步实践一个微服务云原生应用的开发、部署和上线,过程中涉及的实战进阶内容,都会做详细解读,比如微服务之间的异步消息传递、使用 Saga 模式进行跨服务的协作、基于 Istio 的服务网格实现等,另外,重要功能的详细示例代码,我也会发布在 GitHub 上提供更新。

     

    如果你对微服务架构在云平台的落地有兴趣,欢迎你来收听我的课程:《云原生微服务实战架构精讲》

     

    展开全文
  • 原生APP的开发模式所针对的事Android、IOS等不同的手机操作系统,要采用不同的框架和语言来进行开发,专门用来针对不同设备而开发出的版本,现在我们大部分接触的都苹果和安卓两个版本,也都直接安装到谁被里...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,303
精华内容 521
关键字:

原生内容是什么