Skip to content

Latest commit

 

History

History
153 lines (83 loc) · 10.3 KB

一步一步学Spring Boot:微服务项目实战(第2版).md

File metadata and controls

153 lines (83 loc) · 10.3 KB

一步一步学Spring Boot:微服务项目实战(第2版)

黄文毅

前言

Spring Boot是近几年非常流行的微服务框架,相对于其他开发框架,Spring Boot不但使用更加简单,而且功能更加丰富,性能更加稳定和健壮。Spring Boot是在Spring框架基础上创建的一个全新的框架,其设计目的是简化Spring应用的搭建和开发过程,使得开发人员不仅能提高开发速度和生产效率,而且能够增强系统的稳定性和扩展性。因此,Spring Boot已经成为Java开发人员的必备技术。

此外还介绍了微服务的多环境与部署、微服务的容器化、微服务测试等当前微服务开发中的必备技术。

第1章 第一个Spring Boot项目

Spring Boot是目前流行的微服务框架,倡导“约定优先于配置”,其设计目的是用来简化新Spring应用的初始化搭建以及开发过程。Spring Boot提供了很多核心的功能,比如自动化配置、提供starter简化Maven配置、内嵌Servlet容器、应用监控等功能,让我们可以快速构建企业级应用程序。

1.1.3 安装Apache Maven

Apache Maven是目前流行的项目管理和构建自动化工具。

1.3.1 工程目录

• /src/main/resources/application.properties:配置文件,这个文件非常重要。Spring Boot默认支持两种配置文件类型(.properties和.yml)。

application.properties和application.yml配置文件的区别主要是书写格式不同,另外,application.ym

1.3.4 pom文件

Spring Boot项目下的pom.xml文件主要用来存放依赖信息

• spring-boot-starter-web:只要将其加入到项目的maven依赖中,我们就会得到一个可执行的Web应用。该依赖中包含许多常用的依赖包,比如spring-web、spring-webmvc等。这样,我们不需要做任何Web配置,便能获得相关Web服务。

• spring-boot-starter-test:这个依赖和测试相关,只要引入它,就会把所有与测试相关的包全部引入。

1.4.2 第三方类库升级

Spring Boot 2.x至少需要JDK8的支持,2.x应用了JDK8的许多高级新特性,所以当应用要升级到2.0版本时,先确认应用必须兼容JDK8。

1.6 思考题

  1. 什么是Spring Boot? 答:Spring Boot是Spring开源组织下的子项目,是Spring组件的一站式解决方案。Spring Boot主要是简化了使用Spring的难度,节省了繁重的配置,提供了各种启动器,使开发者能快速上手。

  2. Spring Boot的优点主要有哪些? 答:Spring Boot的优点非常多,如独立运行、简化配置、自动配置、无代码生成和XML配置、应用监控、健康检查、上手容易,等等。

2.2.1 引入依赖

• mysql-connector-java:MySQL连接Java的驱动程序。 • spring-boot-starter-jdbc:支持通过JDBC连接数据库。

2.5 HikariCP连接池

HikariCP是数据库连接池,而且号称史上最快的。在Spring Boot2.0版本中,由于HikariCP提供了卓越的性能,默认数据库池技术已从Tomcat Pool切换到HikariCP。spring-boot-starter-jdbc和spring-boot-starter-data-jpa默认解析HikariCP依赖,spring.datasource.type属性将HikariDataSource作为默认值。

3.1.1 Spring Data JPA介绍

JPA(Java Persistence API)是Sun公司官方提出的Java持久化规范。所谓规范是指只定义标准规则,不提供实现,而JPA的主要实现有Hibernate、EclipseLink、OpenJPA等。JPA是一套规范,不是一套产品,Hibernate是一套产品,如果这些产品实现了JPA规范,那么我们可以把它们叫作JPA的实现产品。

9.1 使用Quartz定时器

Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。Quartz定时器作用很多,比如定时发送信息、定时生成报表等。

17.1 多环境配置概述

Spring Boot支持通过外部配置覆盖默认配置项,具体优先级如下: (1)Java命令行参数。 (2)JNDI属性。 (3)Java系统属性(System.getProperties())。 (4)操作系统环境变量。

17.3 自定义属性与加载

17.3.1 自定义属性 在使用Spring Boot的时候,通常需要自定义一些属性,可以按如下方式直接定义。在src/main/resources/application.properties配置文件中加入:

17.4 部署

Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。在中小型系统和并发访问用户不是很多的场合下被普遍使用。Spring Boot默认使用Tomcat作为内嵌Servlet容器,查看spring-boot-starter-web依赖可知

17.6 思考题

  1. Spring Boot需要独立的容器运行吗? 答:可以不需要,因为已内置了Tomcat/ Jetty等容器。
  2. Spring Boot有哪几种读取配置的方式? 答:Spring Boot可以通过@PropertySource、@Value和@Environment、@ConfigurationProperties来绑定变量。

18.1.2 Docker的基本概念

  1. 镜像(Image) Docker镜像可以理解为一个Linux文件系统,Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

18.1.3 Docker架构

我们先来了解一下Docker引擎。Docker引擎可以理解为一个运行在服务器上的后台进程,其主要包括3大组件。

• Docker后台服务(Docker Daemon):长时间运行在后台的守护进程,是Docker的核心服务,可以通过dockerd命令与它交互通信。 • REST接口(REST API):程序可以通REST的接口来访问后台服务,或向它发送操作指令。 • 交互式命令行界面(Docker CLI):可以使用命令行界面与Docker进行交互,例如以docker为开头的所有命令的操作。而命令行界面又是通过调用REST的接口来控制和操作Docker后台服务的,如图18-1所示。

18.3.2 使用Dockerfile构建镜像

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。下面我们创建一个空白文件(文件名为Dockerfile),并学习Dockerfile指令。

ADD是复制文件指令,它有两个参数 和。source参数为宿主机的来源路径,destination是容器内的路径,必须为绝对路径。

ADD指令将自动解压来源中的压缩包,将解压后的文件复制到目标目录(/opt)中。

  1. RUN指令 RUN指令用来执行一系列构建镜像所需要的命令。如果需要执行多条命令,可以使用多条RUN指令

Dockerfile中每一个指令都会建立一层, RUN指令也不例外。每一个RUN的行为就和我们手工建立镜像的过程一样,即新建立一层,在其上执行这些命令,构成新的镜像。上面的这种写法,创建了多层镜像,但这是完全没有意义的,其结果就是产生非常臃肿、非常多层的镜像,不仅增加了构建部署的时间,也很容易出错。这是很多Docker初学者常犯的一个错误

  1. CMD指令 CMD指令提供了容器默认的执行命令。Dockerfile只允许使用一次CMD指令,使用多个CMD指令会抵消之前所有的指令,只有最后一个指令生效。

并不是每个步骤都会生成中间容器,但是每个步骤一定会产生中间镜像。这些中间镜像将加入到缓存中,当某一个构建步骤失败时,将停止整个构建过程,但是中间镜像仍然会存放在缓存中,下次再次构建时,直接从缓存中获取中间镜像,而不会重复执行之前已经构建成功的步骤。

19.1 Spring Boot单元测试

(1)基于公共标准的HTTP协议的 第一种以HTTP协议的微服务接口比如使用Spring Boot开发的服务,这样的服务测试工具有很多,比如Postman、Swagger是常用的工具。如果想为测试人员做点事情的话,可以根据服务注册中心做一个所有服务的列表

(2)基于私有的RPC调用协议 第二种是以私有协议暴露的服务测试,相对比较麻烦。为了打通服务接口和测试人员之间的屏障,以便让测试人员方便地测试到RPC协议的服务接口,为每个服务接口写一个客户端,将其转换为HTTP协议暴露,这是一种解决办法。但是,这样无形中增加了很多工作量,而且测试服务的质量还依赖于客户端编写的质量,明显是费力不讨好的工作。

21.6 降级、限流、拒绝服务

21.6.1 降级 在业务高峰时,为了保证服务的高可用,往往需要服务或者页面有策略地不处理或换一种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。这种技术在分布式微服务架构中称为服务降级。 例如在线购物系统,整个购买流程是重点业务,比如支付功能在流量高峰时,为了保证购买流程的正常运行,往往会关闭一些不太重要的业务(如广告业务等)。

降级方案可以这样设计:当秒杀流量达到10万/s时,把成交记录的获取从展示20条降级到只展示10条。“从20改到5”这个操作由一个开关来实现,也就是设置一个能够从开关系统动态获取的系统参数。

21.6.2 限流

限流是指通过对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致系统运行缓慢或宕机,限流的根本目的就是为了保障服务的高可用。当系统容量达到瓶颈时,我们需要通过限制一部分流量来保护系统,并做到既可以人工执行开关,也支持自动化保护的措施。限流是比降级更极端的一种保护措施。

21.7 避免单点

单点并不单指服务,也包括服务依赖的资源,比如数据库、缓存、消息中间件等。如图21-8所示是一个可变单点的集群服务。

21.8 总结

对于高并发读,引入Redis缓存可避免流量直接穿透到数据库,同时,引入消息中间件则可对流量进行削峰。除了技术上的设计,业务方法上使用答题/验证码、分时分段以及禁用秒杀按钮等措施,可将请求流量尽量拦截在上游。