微信号:david-share

介绍:乐于分享,才有进步.

现代应用的发展与Spring Boot起源 | 云原生应用开发系列1

2018-12-01 00:00 魏新宇

声明

  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;

  • 鼓励读者购买红帽培训获得更多系统性的培训。

  • 由于篇幅有限,文章中的步骤仅展现了关键的部分。



一、现代应用的发展


截至2014年,典型的App Server由一个框架或一组API组成,允许开发人员使用安全、事务、数据访问和消息传递等中间件服务。App Server还为操作环境提供了丰富的功能,包括负载平衡、故障转移、管理和监视、分布式部署和配置。


在Java系,Java EE和Spring是主要的应用框架。 它们是基于标准的这一事实,允许API的不同实现以及运行基于标准的应用程序的应用程序服务器的选择。




上图现代app dev市场的现状。

在图的左下角,您可以看到传统App Server的增长很慢。


在图表的右上角,可以看到基于PaaS相关的市场增长很快。 PaaS与微服务很好地兼容,PaaS是部署和管理微服务的理想平台。


现在,软件开发领域正在发生变化。


流程方面

  • 始于传统的瀑布项目开发。 瀑布式开发存在一些局限性和问题。

  • 随后是敏捷开发。 敏捷解决了瀑布式开发的一些问题。 此外,通过瀑布式开发,团队能够在短时间冲刺中更快地构建和发布软件。

  • 现在DevOps正在崛起 - 开发团队和Ops团队正在共同开发和部署软件。


基础设施方面

  • 最初,应用程序部署在企业数据中心。 

  • 然后,应用程序在托管环境中异地运行。 

  • 现在,应用程序正在部署到云中的混合环境中。


最后,这些变化正在进入应用程序架构。 传统上,应用程序是作为整体开发的。 然后是n层开发。 最近,微服务等新兴技术发展很快。


现在通过开发,应用程序开发人员拥有比以往更多的选择。

他们可以继续在现有的应用服务器环境中进行本地开发。

这些应用服务器也可以使用各种云主机部署在云中。


在图的顶部,开发人员开始部署Serverless应用程序。这些是在不维护服务器的情况下利用服务和功能的应用程序。开发人员创建一段代码功能并部署到无服务器提供商。目前无服务器提供商是Amazon Lambda,OpenWhisk和Funktion。


轻量级、可嵌入的App Server开始变得越来越重要。现代框架不是单独运行应用服务器,而是提供可嵌入服务器。一些示例包括Vert.x,Wildfly Swarm,Spring Boot和Node.js.


最后,开发人员正在跳过传统的单片应用程序并从一开始就创建云原生应用程序。这些应用程序可以使用Spring Boot和Netflix开源软件。


如您所见,开发人员可以使用许多选项。


展望未来,可以看到应用程序将开始利用嵌入式服务器。 这些嵌入式服务器实质上为应用程序和微服务提供运行时。


这些应用和服务将在云平台上运行。 云平台将提供常见功能,例如构建、部署、调度、扩展、弹性、指标和日志记录。


OpenShift已经为这些服务提供支持。




今天,开发人员可以利用云平台的通用服务。 但是,他们仍然需要为消息传递,安全性和可嵌入服务器添加自己的支持。


如果他们想要支持微服务功能以进行配置、服务发现、运行状况检查等,他们必须开发特定于给定云平台的自定义代码。


这限制了其应用的可移植性。 如果他们想迁移到另一个云平台,他们必须改进他们的代码以使用新的云平台的配置,服务发现,健康检查等。


结果,他们有供应商锁定,这是不理想的。

客户希望开发微服务、利用DevOps、并在云中部署应用程序。所有代码都应在容器内运行,以实现安全性和可伸缩性。


对于微服务,云平台应具有以下功能:

  • Polyglot  - 支持多种编程语言

  • Asnyc /被动 - 用于创建响应迅速,大批量的应用程序

  • 弹性 - 优雅地从故障中恢复

  • 单微迁移 - 可以部署单一的应用程序,也支持从单片到微服务的迁移


就DevOps而言,云平台应具有以下功能:

  • 持续集成和持续部署(CI / CD),用于频繁/快速部署。

  • Containerized  - 容器支持微服务的部署。小型无状态微服务比有状态的整体应用程序更容易扩展。此外,服务可以独立扩展。

  • 自动化 - 平台自动构建和部署。这支持可由团队中的任何人或通过系统触发事件启动的可重复过程的概念。

  • 自助服务 - 开发人员可以自行配置新的虚拟环境。他们不再需要等待IT人员为他们设置服务器。这使开发人员可以自由地创建测试环境并尝试新功能。最后,通过利用自助服务节省了时间。

  • 可观察 - 构建和部署的结果是可观察的。这可以像提供带有结果的部署的仪表板视图一样简单。


就云计算而言,云平台应具有以下功能:


  • 公共/私有 - 团队可以决定是否要在外部管理的公共云中托管,或者在由他们自己的公司或合作伙伴管理的数据中心的私有云中托管。

  • 开放混合 - 开放式混合云允许团队在公共云中部署其部分资产,并在私有云中部署其他组件。或者部分应用程序可以托管在传统的数据中心中。

  • 弹性 - 应用程序扩展使应用程序能够对流量变化做出反应,并自动分配必要的资源来处理当前需求。云平台应监控传入的Web流量,并自动添加或删除资源以处理请求量的变化。

  • “Everything-aaS”意味着“一切都是服务”。您可以部署微服务以支持业务流程管理,企业集成和移动后端。



这些是未来云平台的主要要求。




微服务的发展


在2014年,微服务的构建是“自己动手”。 该应用程序包含微服务业务逻辑。 微服务还必须支持客户端负载平衡、服务注册、断路器和分布式跟踪。


目前,这些功能中的一部分正在向下移动到堆栈。 例如,云平台现在提供对服务注册和客户端负载平衡的支持。 结果,微服务不再需要支持这些服务。


在未来,Red Hat预测微服务将发展到仅提供微服务业务逻辑的程度。 所有依赖服务都将由云平台提供。 这包括客户端负载平衡、服务注册、断路器和分布式跟踪。



二、什么是Spring?


Spring是Java开发的开源框架。 2003年6月首次发布 。Spring主要用作Enterprise Java Beans 1.0和2.0的替代品。 开发人员在Enterprise Java Bean中遇到了很多问题。 Spring是出于对EJB的挫折而创建的。


它的一些特点如下:

  • 框架,模式和模板的集合

  • IoC  - 使用bean,上下文和核心反转控制支持

  • 与流行的对象关系映射(ORM)技术集成,如Hibernate和JPA规范

  • 内置支持持久性和事务

  • 面向方面编程(AOP),用于处理横切关注点

  • 用于构建Java Web应用程序的基于Web的模型 - 视图 - 控制器(MVC)

  • 消息传递,测试 - 支持异步消息传递和单元测试



Spring Framework运行时可以分为以下几个部分:

  • Data access/integration

  • Web

  • AOP and Aspects(AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 Spring Aspects:Spring提供的对AspectJ框架的整合

  • Instrumentation

  • Messaging

  • Core container

  • And test support, provided as part of the framework to support test-driven development



Spring的Bean容器

  • 创建为更重的企业Java技术(EJB 2.0)的替代方案

  • 赋予普通旧Java对象(POJO)的权力

  • 与EJB 3.0类似

  • 生命周期由Spring容器管理


基于四种不同的策略:

Lightweight and minimally invasive

Loose coupling

Declarative programming 声明式程序设计

Elimination of boilerplate code



Beans

  • 它是一个Java类,它提供了一种非常简单直接的公共方法。

  • 一个普通的旧Java对象(POJO)。

  • 此类不需要扩展基类或实现任何特殊接口。



  • 创建bean后,可以使用XML在Spring容器中对其进行配置。

  • 在该示例中,bean ID是helloworldbean。 对于类条目,请提供所需bean的类名。

  • 作为使用XML配置的替代方法,您以使用纯Java。

  • 由于@Configuration批注,此类被注释为配置类。

  • 使用@Bean批注在Spring应用程序上下文中注册bean。



  • 对于XML配置和@Bean批注的另一种替代方法,可以使用@ComponentScan批注。

  • Spring可以扫描Spring bean和组件的各种包。


使用@Component注释定义Spring组件。 使用组件扫描时,使用其默认Bean ID注册Bean。 默认的bean ID基于类名。

对于依赖注入,可以注入组件或bean。


这里显示了注入bean的两种不同方式。 一种方法是使用@Autowired。 另一种方法是使用@Inject。 从较高的层面来看,这些注释提供了类似的功能。


两者之间的主要区别在于@Autowired是一个特定于Spring的注释,而@Inject是Java EE规范的一部分。


使用Spring时,可以使用注释进行依赖注入。




外部配置

允许相同的应用程序在不同的环境中工作

配置的格式可以是:

  • Properties file

  • YAML file

  • Environment variables

  • Command-line arguments

  • Can also be managed in configuration service (Spring Cloud Config)

这是在Spring组件中使用配置值的示例。

请注意@Value注释的使用。 这会处理将属性值注入Spring组件。


在此示例中,如果配置文件/服务中缺少该属性,则会提供默认值。

在application.properties中定义值

在application.properties中创建默认值


特定于配置文件的值在application- <profile> .properties中定义

特定于配置文件的值会覆盖默认值:

  • application.properties:current-env = default

  • application-dev.properties:current-env = development

  • application-prod.properties:current-env = production





三、什么是Spring Boot?


  • 使用Spring和第三方库启动项目是一种方便而简单的方法。

  • Spring Boot对使用哪些库及其配置方式持有一种看法,可以快速创建几乎为零的项目。

  • Spring Boot还创建了一个可启动的fat jar。 这消除了对应用程序容器的需要。

  • fat bean中包含哪些功能是通过pom.xml依赖项指定的。 例如,spring-boot-starter-web为您提供Web服务器(默认为Tomcat)。



以下是经过认证和测试以与OpenShift Application Runtimes一起使用的Spring Boot启动器列表。


Spring Boot modules certified for the 1.4.1.RELEASE:

  • spring-boot-starter-parent

  • spring-boot-starter-web

  • cxf-spring-boot-starter-jaxrs

  • spring-boot-starter-test

  • spring-boot-starter-logging

  • spring-boot-starter-data-jpa

  • spring-boot-starter-data-rest

  • spring-boot-starter-actuator

  • spring-boot-starter-jdbc

  • spring-cloud-starter-hystrix and spring-cloud-starter-ribbon



总结:

  • XML wiring of beans rarely used anymore in Spring 

     bean的XML连接在Spring中很少使用

  • CDI and Spring Bean container very similar from development perspective


    从开发角度来看,CDI和Spring Bean容器非常相似

  • Spring Boot provides simple way for developers to build, test, and run applications

    Spring Boot为开发人员提供了构建,测试和运行应用程序的简单方法

    • Vastly simpler than classic Java EE containers







四、什么是Spring Data?


Spring Data的使命是:为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性。


Spring Data可以轻松使用数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务。

Module

Description

Spring Data Commons

Core Spring concepts underpinning every Spring Data project

Spring Data Gemfire

Provides easy configuration and access to GemFire from Spring applications

Spring Data JPA

Makes it easy to implement JPA-based repositories

Spring Data KeyValue

Map-based repositories and SPIs to easily build Spring Data module for key-value stores

Spring Data LDAP

Provides Spring Data repository support for Spring LDAP

Spring Data MongoDB

Spring-based object-document support and repositories for MongoDB

Spring Data REST

Exports Spring Data repositories as hypermedia-driven RESTful resources

Spring Data Redis

Provides easy configuration and access to Redis from Spring applications

Spring Data for Apache Cassandra

Spring Data module for Apache Cassandra

Spring Data for Apache Solr

Spring Data module for Apache Solr

为避免将应用程序与任何特定的数据访问策略耦合,正确编写的存储库应通过接口公开其功能。 该图显示了设计数据访问层的正确方法。


如您所见,服务对象通过接口访问存储库。 这有积极的后果。 它使您的服务对象易于测试,因为它们没有耦合到特定的数据访问实现。 实际上,您可以创建这些数据访问接口的模拟实现。 这使您可以在不必连接到数据库的情况下测试服务对象,从而显着加快单元测试并排除由于数据不一致导致测试失败的可能性。

Spring JPA允许您定义Java EE中的实体。


它为许多基本CRUD操作提供了数据访问的实现细节。

如果您想要给定实体的CRUD访问权限,那么您可以使用JpaRepositry。


您提供实体类和实体主键的类型。


在此示例中,将为产品实体创建产品存储库。 产品实体的主键是长整数。


此存储库自动为以下常见CRUD方法提供支持:

  • find

  • findAll

  • save

  • update

  • delete

开发人员指定方法readByNameIgnoringCaseOrderByPrice。


Spring Data执行查询以按名称查找产品列表并忽略价格。 它还以默认的升序方式按价格订购。


Spring MVC是一个用于构建基于Spring的Java Web应用程序的框架。


此图显示了Web请求的处理方式。


在步骤1中,请求被传递到Spring调度程序servlet。


在步骤2中,servlet读取Web请求并确定要使用的处理程序映射。


在步骤3中,Dispatcher servlet调用适当的控制器类来处理Web请求。


在步骤4中,控制器将控制权返回给servlet。 控制器还指定用于呈现的视图页面的名称。


在步骤5中,视图解析器确定谁应该呈现视图页面。


在步骤6中,呈现视图页面。


最后,在步骤7中,视图返回到浏览器。

这是Spring MVC控制器的一个例子。


该控制器定义路径“/ productlist”的请求映射。 此请求映射支持HTTP GET方法。


该方法接受模型,该模型是用于在控制器和视图之间交换数据的容器。


在此控制器中,它只返回视图页面的名称。


视图页面的实际位置是通过添加前缀,逻辑视图名称和后缀来确定的。

这是使用模型的控制器的另一个示例。


如前所述,Model对象是一个容器对象,用于在控制器和视图之间交换数据。


在此示例中,模型使用来自存储库的数据填充。 它包括产品列表。


控制器方法返回视图页面名称“productList”。 最终,此视图页面呈现产品列表。





魏新宇

  • "大魏分享"运营者、红帽资深解决方案架构师

  • 专注开源云计算、容器及自动化运维在金融行业的推广

  • 拥有MBA、ITIL V3、Cobit5、C-STAR、TOGAF9.1(鉴定级)等管理认证。

  • 拥有红帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、AIX、HPUX等技术认证


 
大卫分享 更多文章 白话中台战略-1开篇:中台是个什么鬼? OpenShift 网络分析-(容器网络选型和方案建议) 设计一个应用集成的路由:构建以API为中心的敏捷集成系列-第五篇 红帽新一代Linux操作系统-RHEL8 Beat版本初体验! AMQ与Restful API的集成-数据库与Restful API的对接:构建以API为中心的敏捷集成系列
猜您喜欢 2017已经过去了一半,是时候来波年中总结了 基于Ansible &amp; Docker的分布式系统(下) 直播礼物系统设计要点 如果代码按行付费,会有什么好玩的事情发生? 程序员最害怕听到的一句话是?