欢迎访问Spring Cloud中国社区

《重新定义Spring Cloud实战》由Spring Cloud中国社区倾力打造,基于Spring Cloud的Finchley.RELEASE版本,本书内容宽度足够广、深度足够深,而且立足于生产实践,直接从生产实践出发,包含大量生产实践的配置。欢迎加微信Software_King进群答疑,国内谁在使用Spring Cloud?欢迎登记

使用Spring Boot和Spring Cloud构建微服务-第一部分,总览

sluk3r · 7月前 · 1737 ·

在服务开发领域,微服务是近年来很热的技术名词,很多公司也都优先使用微服务架构方式。其中在Java社区,Spring Boot是广泛使用的开源框架,不管是单体架构还是微服务架构都是如此。接下来,我计划写一个系列文章来介绍怎么使用Spring Boot和Spring Cloud来构建微服务。

本篇文章中,我们将介绍下面的话题:

  • 单体架构及坏处
  • 微服务是个啥?
  • 微服务的好处
  • 微服务带来的挑战
  • 为什么说,Spring Boot和Spring Cloud是构建微服务的最好选择
  • 关于应用的介绍

单体架构及坏处

通常,我们在设计大型软件系统时, 会采用模块化方式,不过,会把这个系统部署在一个单元中(如EAR或WAR)。这种方式就中单体应用。

围绕单体应用有很多问题,如:

  • 随时时间的增长,代码库乱得一团糟。
  • 多个团队共用同一套代码,不方便管理
  • 很不方便针对应用中某些部分做针对性的扩容。
  • 技术重构成本太高

不过,在我看来,相比于微服务架构,单体架构的系统更方便部署和监控。

通俗来讲,微服务是针对某个特定的业务功能构建的服务单元,这个服务可以独立部署。随着这样的设计思路,针对原来的大型应用系统,我们逐个视别出核心业务领域下的子领域,并使用DDD理念来设计。最终,我们再把这些微服务使用某种方式集成,这样终端用户看来,似乎还是一个应用。

微服务是个啥?

  • 代码库范围小了很多,理解更容易。
  • 我们可以方便地针对单个高频使用的微服务应用扩容。
  • 每个团队只集中在一两个微服务系统上,更容易精深管理。
  • 技术重构更为简单。

微服务带来的挑战

  • 在刚开始找微服务边界时,很不容易。
  • 团队中需要高水平的工程师来处理分布式系统带来的复杂度升级
  • 如果没有适合的DevOps支撑的话,管理微服务架构的应用系统难度极大。
  • 为了跨服务地测试,搭建一套本地环境会比以前复杂,尽管通过使用Docker/Kubernetes ,这个问题会一程度地缓解。

为什么说,Spring Boot和Spring Cloud是构建微服务的最好选择

在构建微服务架构应用方面,Sprint Boot最为流行。现在,很多公司会优先往云环境中部署,而不再是传统方式地维护自己的数据中心。不过,跟这种转变相对应的是,我们需要解决这些云应用系统本地化的众多问题。这时Spring Cloud的美体现出来了。

从本质上讲,Spring Cloud,是围绕云应用系统本地化问题设计模式的具体实现。为了避免自己重新搞一套,我们可以方便地使用Spring Cloud模块,集中到核心业务问题上,而不必再担心基础设施问题。

下面是Spring Cloud的部分模块,及其要解决的分布式问题。

  • Spring Cloud Config Server: 为了把众多应用系统的配置内容抽取出来集中管理,附带的一个特性是配置更新后,不再需要重启应用系统。我们可以结合使用git, Consul或ZooKeeper来达到配置管理抽取的目标。
  • Service Registry and Discovery:在微服务环境下,我们有N多个服务系统,针对些系统,需要方便地动态扩容或缩容。这时,需要服务注册和发现机制,这样,服务调用时,不再需要重复地配置hostname和端口。在Spring Cloud中, 我们只需简单地配置,就可以搭建起基于Eureka的服务注册发现功能。当然,基于接口设计的Spring Cloud,也可以方便地使用Consul或ZooKeeper。
  • Circuit Breaker: 微服务部署中,某个服务可能依赖其它服务,这种设计情况下,如果一个服务Down掉,会级联引起直接或间接依赖的服务不可用。Spring Cloud提供了Hystrix,以融断的理念来解决此服务依赖中异常问题。
  • Spring Cloud Data Streams: 应用系统中,我们经常会对接Kafka或Spark的巨量数据处理能力。Spring Cloud Data Streams提供了更高一层的抽象,以方便我们在框架层面对接巨量数据处理能力.
  • Spring Cloud Security:某些服务只能对特定用户开放,或者大多数情况下,我们也想使用页面系统中常用的单点登录功能,来方便地管理跨服务鉴权问题。Spring Cloud使用OAuth2解决这个问题。
  • Distributed Tracing:微服务环境中的另一个问题是怎么排查线上bug。终端用户一个操作,可能会触发一连串的微服务调用;针对此调用特征,为了排查问题方便,我们需要服务调用的跟踪机制。针对这个问题,Spring Cloud贴心地提供了基于Zipkin的Sleuth模块。
  • Spring Cloud Contract: 在实际工程方面,不同的微服务系统由不同的团队负责。此种情况下,我们需要一个机制来协调多个微服务API定义问题,以方便每个团队独立开发自己部分功能。Spring Cloud Contract帮助我们创建并验证API定义的业务规范。

上面提到的只是Spring Cloud的部分特征,更多功能请移步https://spring.io/projects/spring-cloud。

学习方面,我强烈推荐参照例子的学习模式。所以我们将通过搭建一个具体微服务例子应用来学习Spring Boot和Spring Cloud。这个例子中, 我特意保持业务逻辑的精简,以更关注怎么理解Spring Boot和Spring Cloud的功能。

选中的例子也是跟大家熟知的电商购物车场景,具体来看,有下面的业务模块:

  • catalog-service: 本服务提供REST接口, 对外输出商品的品类信息。
  • inventory-service: 本服务提供REST管理库存接口。
  • cart-service: 本服务提供REST管理用户购物车细节接口。
  • order-service: 本服务提供REST管理订单接口。
  • customer-service: 本服务提供REST管理用户接口。
  • shoppingcart-ui: 这是一个面向客户的前端Web应用。

接下来的文章中,随着串讲微服务概念,我们将构建上面这些业务服务和REST接口。

请帮助继续关注,下一篇,我们将创建catalog-service,期间将使用spring-cloud-config模块来集中管理配置信息。


本文原始博客地址是使用Spring Boot和Spring Cloud构建微服务-第一部分,总览, 转载请标明。