玩转Spring全家桶(下)

851 阅读13分钟

点击跳转上篇: 玩转Spring全家桶(上)

玩转Spring全家桶(下)

九. 重新认识Spring Boot

9.1 认识Spring Boot的组成部分

  • Spring Boot

    1. 它是什么: 它是一个能够更快更好的帮助大家构建一个Spring框架的应用程序。
    2. 它不是什么:
      1. 不是应用服务器
      2. 不是Java EE之类的规范
      3. 不是代码生成器
      4. 不是Spring Framework的升级版
  • Spring Boot的特性

    1. 方便地创建可独立运行的Spring应用程序
    2. 直接内嵌Tomcat、Jetty或Undertow
    3. 简化了项目的构建配置
    4. 为Spring 及第三方库提供自动配置
    5. 提供生产级特性
    6. 无需生成代码或进行xml配置
  • Spring Boot的四大核心

    • 自动配置- Auto Configuration
    • 起步依赖- Starter Dependency
    • 命令行界面- Spring Boot CLI
    • Actuator

9.2 了解自动配置的实现原理

  • 自动配置
    1. 基于添加的JAR依赖自动对Spring Boot应用程序进行配置
    2. Spring-boot-autoconfiguration
  • 开启自动配置
    1. @EnableAutoConfiguration
      1. exclude = Class<?>[]
    2. @SpringBootApplication

      这个启动类上的注解就已经自带上面的自动配置注解了。

  • 自动配置的实现原理:
    • 条件注解: 在这里插入图片描述
  • 了解自动配置的情况
    • 观察自动配置的判断结果
      • debug
    • ConditionEvaluatinReportLoggingListener
      • Positive matches
      • Negative matches
      • Exclusions
      • Unconditional classes

9.3 动手实现自己的自动配置

  • 条件注解大家庭
    • 条件注解: @Conditional
    • 类条件:
      • @ConditionalOnClass
      • @ConditionalOnMissingClass
    • 属性条件
      • @ConditionalOnProperty
    • Bean条件注解:
      • @ConditionalOnBean
      • @ConditionalOnMissingBean
      • @ConditionalOnSingleCandidate
    • 资源条件:
      • @ConditionalOnResource
    • Web应用条件
      • @ConditionalOnWebApplication
      • @ConditionalOnNotWebApplication
    • 其他条件
      • @ConditionalOnExpression
      • @ConditionalOnJava
      • @ConditionalOnJndi
  • 条件注解代码演示: 在这里插入图片描述

9.4 如何在低版本Spring中快速实现类似自动配置的功能

  • 需求与问题: 在这里插入图片描述

  • 核心解决思路: 在这里插入图片描述

  • Spring的两个扩展点: 在这里插入图片描述

  • 关于Bean的一些定制: 在这里插入图片描述

  • 一些常用操作: 在这里插入图片描述

  • 关于Maven依赖管理的一些小技巧

    • 了解你的依赖:
      • mvn dependency:tree
      • IDEA Maven Helper 插件
    • 排除特定依赖
      • exclusion
    • 统一管理依赖
      • dependencyManagement
      • Bill of Materials - bom

9.5 了解起步依赖及其实现原理

  • Starter Dependencies
    • 直接面向功能
    • 一站获得所有相关依赖,不再复制粘贴
  • 官方的Starters
    • spring-boot-starter-*

    通过自动配置和maven的依赖,能够直接引入这些依赖。

9.6 定制自己的起步依赖

  • 主要内容:
    • autoconfigure模块,包含自动配置代码
    • starter模块,包含指向自动配置模块的依赖及其其他相关依赖
  • 命名方式:
    • xxx-spring-boot-autoconfigure
    • xxx-spring-boot-starter
  • 一些注意事项
    1. 不要使用spring-boot作为依赖的前缀
    2. 不要使用spring-boot的配置命名空间
    3. starter中仅添加必要的依赖
    4. 声明对spring-boot-starter的依赖

9.7 深挖Spring Boot的配置加载机制

  • 外化配置加载顺序 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    properties优先于yml,文件也是从上往下。

  • application.properties
    • ./config
    • ./
    • CLASSPATH中的 /config
    • CLASSPATH中的/
  • 修改名字或路径:
    • spring.config.name
    • spring.config.location
    • spring.config.additional-location
  • Relaxed Binding 在这里插入图片描述
  • 示例: 在这里插入图片描述

    官网地址

9.8 理解配置背后的PropertySource抽象

  • PropertySource: 在这里插入图片描述
  • SpringBoot 中的@ConfigurationProperties
    • 可以将属性绑定到结构化对象上
    • 支持Relaxed Binding
    • 支持安全的类型转换
    • @EnableConfigurationProperties
  • 定制PropertySource
    • 主要步骤:
      1. 实现PropertySource
      2. 从Environment取得PropertySources
      3. 将自己的PropertySource添加到合适的位置
    • 切入位置:
      • EnvironmentPostProcessor
      • BeanFactoryPostProcessor

十. 运行中的Spring Boot

10.1 认识Spring Boot的各类Actuator Endpoint

  • Actuator

    • 目的
      • 监控并管理应用程序
    • 访问方式:
      • HTTP
      • JMX
    • 依赖:
      • Spring-boot-starter-actuator
  • 一些常用Endpoint

    • 在这里插入图片描述
  • 如何访问Actuator Endpoint 在这里插入图片描述

  • 如何访问Actuator Endpoint 在这里插入图片描述

10.2 动手定制自己的Health Indicator

  • Spring Boot自带的Health Indicator 在这里插入图片描述 在这里插入图片描述
  • 自定义Health Indicator 在这里插入图片描述

10.3 通过Micrometer获取运行数据

  • 官网描述: 在这里插入图片描述

  • 认识Micrometer

    • 特性:
      • 多维度度量
        • 支持Tag
      • 预置大量探针
        • 缓存、类加载器、GC、CPU利用率、线程池
      • 与Spring深度整合
  • 支持多种监控系统: 在这里插入图片描述

  • 一些核心度量指标: 在这里插入图片描述

  • Micrometer in Spring Boot 2.x 在这里插入图片描述

    Spring官方文档57章有说明 在这里插入图片描述

  • 自定义度量指标 在这里插入图片描述

10.4 通过Spring Boot Admin了解程序的运行状态

  • Spring Boot Admin 在这里插入图片描述
  • 快速上手
    • 在这里插入图片描述
  • 安全控制: 在这里插入图片描述 在这里插入图片描述

10.5 如何定制Web容器的运行参数

  • 内嵌Web容器 在这里插入图片描述
  • 修改容器配置 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

10.6 如何配置容器支持HTTP /2

  • 配置HTTPS支持: 在这里插入图片描述

  • 生成证书文件:

    • 在这里插入图片描述
  • 客户端HTTPS支持 在这里插入图片描述

  • 配置HTTP/2支持: 在这里插入图片描述

  • 客户端HTTP/2支持: 在这里插入图片描述

10.7 如何编写命令行运行的程序

  • 关闭Web容器 在这里插入图片描述 在这里插入图片描述
  • 常用工具类: 在这里插入图片描述

10.8 了解可执行Jar背后的秘密

  • 认识可执行Jar 在这里插入图片描述

  • 如何找到程序的入口: 在这里插入图片描述

  • 再进一步:可直接运行的Jar 在这里插入图片描述

  • 默认脚本中的一些配置项 在这里插入图片描述

10.9 如何将Spring Boot应用打包成Docker镜像文件

  • 什么是Docker镜像?

    • 镜像是静态的只读模板
    • 镜像中包含构建Docker容器的指令
    • 镜像是分层的
    • 通过Dockerfile来创建镜像
  • Dockerfile: 在这里插入图片描述

  • 通过Maven构建Docker镜像 在这里插入图片描述

  • dockerfile-maven-plugin 在这里插入图片描述

  • 执行构建代码示例:

    1. 构建: 在这里插入图片描述
    2. 构建完成后发现镜像已经生成出来了: 在这里插入图片描述
    3. 使用docker命令运行构建好的镜像并打印日志: 在这里插入图片描述

十一. Spring Cloud及Cloud Native概述

11.1 简单理解微服务

  • 定义: 微服务就是一些协同工作的小而自治的服务
  • 微服务的优点:
    • 异构性:语言、存储...
    • 弹性: 一个组件不可用,不会导致级联故障
    • 单体服务不易扩展,多个较小的服务可以按需扩展
    • 易于部署
    • 与组织结构对齐
    • 可组合性
    • 可替代性
  • 没有银弹,微服务也有代价:
    • 分布式系统的复杂性
    • 开发、测试等诸多研发过程中的复杂性
    • 部署、监控等诸多运维复杂性

11.2 如何理解云原生

  • 概述:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。
  • 云原生应用要求: 在这里插入图片描述
  • Devops:
    • 开发与运维一同致力于交付高品质的软件服务于客户
  • 持续交付:
    • 软件的构建、测试和发布,要更快、更频繁、更稳定
  • 微服务:
    • 以一组小型服务的形式来部署应用
  • 容器:
    • 提供比传统虚拟机更高的效率
  • Cloud Native Computing Foundation基金会 在这里插入图片描述

    这些是它比较出名的开源项目

11.3 12-Factor App

  • THE TWELVE-FACTOR APP
    • 目的:
      1. 为构建SaaS应用提供行之有效的方法论
      2. 适用于任何语言和后端服务的开发的应用程序
      3. 12factor.net/zh_cn/
  • 了解 12-Factors
    • 基准代码(Codebase)
      • 一份基准代码,多份部署
    • 依赖(Dependencies)
      • 显式声明依赖关系
    • 配置(Config)
      • 在环境中存储配置

      做到配置与代码分离就ok了

    • 后端服务(Backing services)
      • 把后端服务当做附加资源
    • 构建,发布,运行(Build,release,run)
      • 严格分离构建和运行
    • 进程(Processes)
      • 以一个或多个无状态进程运行应用
    • 端口绑定(Port Bingding)
      • 通过端口绑定提供服务
    • 并发(Concurrentcy)
      • 通过进程模型进行扩展
    • 易处理(Disposability)
      • 快速启动和优雅终止可最大化健壮性
    • 开发环境与线上环境等价(Dev/Prod parity)
      • 尽可能的保持开发、预发布、线上环境相同
    • 日志(Logs)
      • 把日志当做事件流
    • 管理进程(Admin processes)
      • 后台管理任务当做一次性进程运行
  • 详细说明:
    • 一份基准代码,多份部署: 在这里插入图片描述
    • 显式声明依赖关系: 在这里插入图片描述

      可以使用一些扫描工具来检查是否存在同名依赖、依赖冲突等。

    • 严格分离构建和运行: 在这里插入图片描述
    • 以一个或多个无状态进程运行应用 在这里插入图片描述
    • 快速启动和优雅终止可最大化健壮性 在这里插入图片描述

      终止时尽可能正常的结束。我们不接受新的连接,将所有的线程任务执行完、sql执行完再进行关闭。在突然宕机我们应该记录错误日志。

    • 尽可能的保持开发,预发布,线上环境相同: 在这里插入图片描述

11.4 认识Spring Cloud的组成部分

  • spring cloud介绍: 在这里插入图片描述

  • Spring Cloud 组件整体全貌: 在这里插入图片描述

  • Spring Cloud的主要功能

    1. 服务发现
    2. 服务熔断
    3. 配置服务
    4. 服务安全
    5. 服务网关
    6. 分布式消息
    7. 分布式追踪
    8. 各种云平台支持
  • Spring Cloud 的版本号规则 在这里插入图片描述

十二. 服务注册与发现

12.1 使用Eureka 作为服务注册中心

  • 认识Eureka 在这里插入图片描述
  • 在本地启动一个简单的Eureka服务 在这里插入图片描述
  • 将服务注册到Eureka Server 在这里插入图片描述
  • 关于Bootstrap属性 在这里插入图片描述

12.2 使用SpringCloud Loadbalancer访问服务

  • 如何获得服务地址: 在这里插入图片描述

    使用后者更好,它是一个抽象,换成其他注册中心也可以用。

  • Load Balancer Client 在这里插入图片描述
  • 代码演示: 在这里插入图片描述

12.3 使用Feign访问服务

  • 认识Feign
    • 在这里插入图片描述
  • Feign的简单使用 在这里插入图片描述
  • 通过配置定制Feign: 在这里插入图片描述
  • Feign的一些其他配置: 在这里插入图片描述

12.4 深入理解服务发现背后的DiscoveryClient

  • Spring Cloud Commons提供的抽象 在这里插入图片描述
  • 自动向Eureka服务端注册 在这里插入图片描述

12.5 使用Zookeeper作为服务注册中心

  • 认识Zookeeper 在这里插入图片描述

  • 使用Zookeeper作为注册中心 在这里插入图片描述

  • 使用Zookeeper作为注册中心的问题 在这里插入图片描述

  • 通过Docker启动Zookeeper 在这里插入图片描述

12.6 使用Consul 作为服务注册中心

  • 介绍: 在这里插入图片描述
  • 认识HashiCorp Consul 在这里插入图片描述
  • 使用Consul提供服务发现能力 在这里插入图片描述
  • 使用Consul作为注册中心 在这里插入图片描述
  • 使用Docker启动Consul 在这里插入图片描述

12.7 使用Nacos作为服务注册中心

  • 认识Nacos 在这里插入图片描述 在这里插入图片描述
  • 使用Nacos作为注册中心 在这里插入图片描述
  • 通过Docker启动Nacos 在这里插入图片描述

12.8 如何定制自己的DiscoveryClient

  • 已经接触过的Spring Cloud类 在这里插入图片描述
  • 实现自己的DiscoveryClient 在这里插入图片描述
  • 实现自己的RibbonClient支持 在这里插入图片描述

十三. 服务熔断

13.1 使用Hystrix实现服务熔断

  • 断路器模式: 在这里插入图片描述 在这里插入图片描述
  • Netflix Hystrix 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

13.2 如何观察熔断情况

  • 如何观察?
    • 打日志:在发生熔断时打印特定该日志
    • 看监控:
      • 主动向监控系统埋点,上报熔断情况
      • 提供与熔断相关的Endpoint,让第三方系统来拉取信息
  • Hystrix Dashboard 在这里插入图片描述
  • 聚合集群熔断信息: 在这里插入图片描述

最好是能够将异常信息统一输出在监控系统中。

13.3 使用Resilience4j实现服务熔断与限流

  • Hystrix以外的选择

    • 在这里插入图片描述
  • 附加组件: 在这里插入图片描述

  • 断路器 在这里插入图片描述 在这里插入图片描述

  • 代码示例:

    • 应用代码:在这里插入图片描述
    • 配置: 在这里插入图片描述
  • Bulkhead

    • 目的:
      • 防止下游依赖被并发请求冲击
      • 防止发生连环故障
    • 用法
      • BulkheadRegistry / BulkheadConfig
      • @Bulkhead(name = "名称")
  • RateLimiter:

    • 在这里插入图片描述

13.4 小结

  • 小结: 在这里插入图片描述

    Guava提供了一些好用的方法以及框架,能够更好的去使用java

  • waiter-service: 使用Resilience4j的RateLimiter进行防护
  • customer-service:
    • 使用Hystrix进行熔断
    • 使用Resilience4j进行熔断和并发控制

十四. 服务配置

14.1 基于Git的配置中心

  • Spring Cloud Config Server

    • 目的:提供针对外置配置的HTTP API
    • 依赖:
      • spring-cloud-config-server
        • @EnableConfigServer
        • 支持Git/SVN/Vault/JDBC
  • 使用Git作为后端存储: 在这里插入图片描述

  • 代码示例:

    1. 加入依赖: 在这里插入图片描述
    2. 引入配置: 在这里插入图片描述
    3. 启动类上加上注解: 在这里插入图片描述

    当实现了最后一步加了注解后,它就是一个Config Server了!

  • Spring Cloud Config Client

    • 依赖:
      • spring-cloud-starter-config
    • 发现配置中心
      • bootstrap.properties | yml
      • spring.cloud.config.fail-fast=true
      • 通过配置
      • 通过服务发现:
        • spring.cloud.config.discovery.enabled=true
        • spring.cloud.config.discovery.service-id = configserver
    • 配置刷新:
      • @RefreshScope
      • Endpoint-/actuator/refresh

14.2 基于Zookeeper的配置中心

  • 使用配置中心需要的步骤: 在这里插入图片描述
  • Zookeeper中的数据怎么存? 在这里插入图片描述

    在Zookeeper中配置了属性后,它的优先级高于项目;

14.3 深入理解SpringCloud的配置抽象

  • Spring Cloud Config

    • 目标: 在分布式系统中,提供外置配置支持
    • 实现:
      • 类似于Spring应用中的Environment与PropertySource
      • 在上下文中增加Spring Cloud Config 的PropertySource
  • Spring Cloud Config 的PropertySource

    • 在这里插入图片描述
  • Spring Cloud Config Server 在这里插入图片描述

  • Spring Cloud Config Zookeeper 在这里插入图片描述

  • 配置的组合顺序: 在这里插入图片描述

    以yml为例,图中的优先级是从上到下,最上面的优先级最高

14.4 基于Consul 的配置中心

  • Spring Cloud Consul Config 搭建步骤: 在这里插入图片描述
  • Consul中的数据怎么存?
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 配置项变更: 在这里插入图片描述

    安装教程可百度。

14.5 基于Nacos的配置中心

  • Spring Cloud Alibaba Nacos Config 引入步骤: 在这里插入图片描述
  • Nacos中的数据怎么存? 在这里插入图片描述
  • 配置截图: 在这里插入图片描述

14.6 小结

  • 几种不同的配置中心: 在这里插入图片描述
  • 携程Apollo
    • 官方地址
    • 特性:
      1. 统一管理不同环境、不同集群的配置
      2. 配置修改实时生效(热发布)
      3. 版本发布管理
      4. 灰度发布
      5. 权限管理、发布审核、操作审计
      6. 客户端配置信息监控
      7. 提供开放平台API

十五. Spring Cloud Stream

15.1 认识Spring Cloud Stream

  • Spring Cloud Stream

    • 是什么? --它是一款用于构建消息驱动的微服务应用程序的轻量级框架
    • 特性:
      • 声明式编程模型
      • 引入多种概念抽象
        • 发布订阅、消费组、分区
      • 支持多种消息中间件
        • RabbitMQ、Kafka
  • Spring Cloud Stream的一些核心概念:

    • 在这里插入图片描述
    • 在这里插入图片描述
    • 消费组: --对同一消息,每个组中都会有一个消费者收到消息
    • 在这里插入图片描述
  • 如何发送与接收消息

    • 生产消息:
      • 使用MessageChannel中的send()方法
      • @SendTo
    • 消费消息:
      • @StreamListener
        • @Payload / @Headers / @Header
    • 其他说明:
      • 可以使用Spring Integration

15.2 通过Spring Cloud Stream 访问RabbitMQ

  • Spring Cloud Stream 对RabbitMQ的支持
    • 依赖:
      • Spring Cloud: spring-cloud-starter-stream-rabbit
      • Spring Boot: spring-boot-starter-amqp
    • 配置: 在这里插入图片描述
  • 使用Docker启动RabbitMQ
    • 官方指引
    • 获取镜像:
      docker pull rabbitmq
      
      docker pull rabbitmq:3.7-management
      
    • 运行RabbitMQ镜像:
      docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=spring -e RABBITMQ_DEFAULT_PASS = spring rabbitmq:3.7-management
      
  • 消息在RabbitMQ的流转: 在这里插入图片描述

15.3 通过Spring Cloud Stream 访问Kafka

  • 认识Apache Kafka

    • 什么是Kafka 在这里插入图片描述
  • SpringCloud 对Kafka的支持: 在这里插入图片描述

  • 通过Docker启动Kafka 在这里插入图片描述

  • 操作步骤:

    1. 引入依赖: 在这里插入图片描述
    2. 配置: 在这里插入图片描述
    3. 监听: 在这里插入图片描述
    4. 消息发送: 在这里插入图片描述
  • Spring中的定时任务 在这里插入图片描述

  • Spring中的事件机制 在这里插入图片描述

15.4 小结

在这里插入图片描述

十六. 服务链路追踪

16.1 通过Dapper理解链路治理

  • 我们在关注什么?
    • 系统中都有哪些服务?
    • 服务之间的依赖关系是什么样的?
    • 一个常见请求具体的执行路径是什么样的?
    • 请求每个环节的执行是否正常与耗时情况
  • Google Dapper的一些术语
    • Span - 基本的工作单元
    • Trace - 由一组Span构成的树形结构
    • Annotation - 用于及时记录事件
      • cs - Client Sent
      • sr - Server Received
      • ss - Server Sent
      • cr - Client Received
  • Google Dapper: 在这里插入图片描述

16.2 使用Spring Cloud Sleuth实现链路追踪

16.3 如何追踪消息链路

  • 用Spring Cloud Sleuth追踪消息: 在这里插入图片描述
  • 让Zipkin能通过RabbitMQ接收消息:
    • 在这里插入图片描述

16.4 除了链路还要治理什么

  • 服务治理关心什么才好?
    • 宏观上:
      1. 架构设计是否合理
      2. 哪些链路是关键链路
      3. 链路的容量水位趋势
      4. 对系统变更的管理与审计
    • 微观上:
      1. 一个系统都依赖了什么
      2. 一个系统都有哪些配置
      3. 一个系统的主观与客观质量

16.5 小结

  • Spring Cloud 的服务治理功能:
    • 借鉴自Google Dapper

    • Spring Cloud Sleuth

      • Zipkin
        • Web
        • RabbitMQ
      • 我们应该关心更多
    • Waiter-service/customer-service

      • 增加基于Web向Zipkin埋点功能
    • barista-service

      • 增加基于MQ向Zipkin埋点功能
    • 最终的成品:

      • 通过Docker运行整个项目

有用的话,点击收藏随时查阅哦~