点击跳转上篇: 玩转Spring全家桶(上)
玩转Spring全家桶(下)
九. 重新认识Spring Boot
9.1 认识Spring Boot的组成部分
-
Spring Boot
- 它是什么: 它是一个能够更快更好的帮助大家构建一个Spring框架的应用程序。
- 它不是什么:
- 不是应用服务器
- 不是Java EE之类的规范
- 不是代码生成器
- 不是Spring Framework的升级版
-
Spring Boot的特性
- 方便地创建可独立运行的Spring应用程序
- 直接内嵌Tomcat、Jetty或Undertow
- 简化了项目的构建配置
- 为Spring 及第三方库提供自动配置
- 提供生产级特性
- 无需生成代码或进行xml配置
-
Spring Boot的四大核心
- 自动配置- Auto Configuration
- 起步依赖- Starter Dependency
- 命令行界面- Spring Boot CLI
- Actuator
9.2 了解自动配置的实现原理
- 自动配置
- 基于添加的JAR依赖自动对Spring Boot应用程序进行配置
- Spring-boot-autoconfiguration
- 开启自动配置
- @EnableAutoConfiguration
- exclude = Class<?>[]
- @SpringBootApplication
这个启动类上的注解就已经自带上面的自动配置注解了。
- @EnableAutoConfiguration
- 自动配置的实现原理:
- 条件注解:
- 了解自动配置的情况
- 观察自动配置的判断结果
- 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
- 一些注意事项
- 不要使用spring-boot作为依赖的前缀
- 不要使用spring-boot的配置命名空间
- starter中仅添加必要的依赖
- 声明对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
- 主要步骤:
- 实现PropertySource
- 从Environment取得PropertySources
- 将自己的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
-
执行构建代码示例:
- 构建:
- 构建完成后发现镜像已经生成出来了:
- 使用docker命令运行构建好的镜像并打印日志:
十一. Spring Cloud及Cloud Native概述
11.1 简单理解微服务
- 定义: 微服务就是一些协同工作的小而自治的服务
- 微服务的优点:
- 异构性:语言、存储...
- 弹性: 一个组件不可用,不会导致级联故障
- 单体服务不易扩展,多个较小的服务可以按需扩展
- 易于部署
- 与组织结构对齐
- 可组合性
- 可替代性
- 没有银弹,微服务也有代价:
- 分布式系统的复杂性
- 开发、测试等诸多研发过程中的复杂性
- 部署、监控等诸多运维复杂性
11.2 如何理解云原生
- 概述:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。
- 云原生应用要求:
- Devops:
- 开发与运维一同致力于交付高品质的软件服务于客户
- 持续交付:
- 软件的构建、测试和发布,要更快、更频繁、更稳定
- 微服务:
- 以一组小型服务的形式来部署应用
- 容器:
- 提供比传统虚拟机更高的效率
- Cloud Native Computing Foundation基金会
这些是它比较出名的开源项目
11.3 12-Factor App
- THE TWELVE-FACTOR APP
- 目的:
- 为构建SaaS应用提供行之有效的方法论
- 适用于任何语言和后端服务的开发的应用程序
- 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)
- 后台管理任务当做一次性进程运行
- 基准代码(Codebase)
- 详细说明:
- 一份基准代码,多份部署:
- 显式声明依赖关系:
可以使用一些扫描工具来检查是否存在同名依赖、依赖冲突等。
- 严格分离构建和运行:
- 以一个或多个无状态进程运行应用
- 快速启动和优雅终止可最大化健壮性
终止时尽可能正常的结束。我们不接受新的连接,将所有的线程任务执行完、sql执行完再进行关闭。在突然宕机我们应该记录错误日志。
- 尽可能的保持开发,预发布,线上环境相同:
11.4 认识Spring Cloud的组成部分
-
spring cloud介绍:
-
Spring Cloud 组件整体全貌:
-
Spring Cloud的主要功能
- 服务发现
- 服务熔断
- 配置服务
- 服务安全
- 服务网关
- 分布式消息
- 分布式追踪
- 各种云平台支持
-
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
- spring-cloud-config-server
-
使用Git作为后端存储:
-
代码示例:
- 加入依赖:
- 引入配置:
- 启动类上加上注解:
当实现了最后一步加了注解后,它就是一个Config Server了!
-
Spring Cloud Config Client
- 依赖:
- spring-cloud-starter-config
- 发现配置中心
- bootstrap.properties | yml
- spring.cloud.config.fail-fast=true
- 通过配置
- spring.cloud.config.uri=http://localhost:8888
- 通过服务发现:
- 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
- 官方地址
- 特性:
- 统一管理不同环境、不同集群的配置
- 配置修改实时生效(热发布)
- 版本发布管理
- 灰度发布
- 权限管理、发布审核、操作审计
- 客户端配置信息监控
- 提供开放平台API
十五. Spring Cloud Stream
15.1 认识Spring Cloud Stream
-
Spring Cloud Stream
- 是什么? --它是一款用于构建消息驱动的微服务应用程序的轻量级框架
- 特性:
- 声明式编程模型
- 引入多种概念抽象
- 发布订阅、消费组、分区
- 支持多种消息中间件
- RabbitMQ、Kafka
-
Spring Cloud Stream的一些核心概念:
- 消费组: --对同一消息,每个组中都会有一个消费者收到消息
-
如何发送与接收消息
- 生产消息:
- 使用MessageChannel中的send()方法
- @SendTo
- 消费消息:
- @StreamListener
- @Payload / @Headers / @Header
- @StreamListener
- 其他说明:
- 可以使用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
-
操作步骤:
- 引入依赖:
- 配置:
- 监听:
- 消息发送:
-
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实现链路追踪
- Spring Cloud 提供的服务治理功能
- 通过Docker 启动Zipkin
- 官方指引:
- 获取镜像:
- docker pull openzipkin/zipkin
- 运行Zipkin镜像:
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
16.3 如何追踪消息链路
- 用Spring Cloud Sleuth追踪消息:
- 让Zipkin能通过RabbitMQ接收消息:
16.4 除了链路还要治理什么
- 服务治理关心什么才好?
- 宏观上:
- 架构设计是否合理
- 哪些链路是关键链路
- 链路的容量水位趋势
- 对系统变更的管理与审计
- 微观上:
- 一个系统都依赖了什么
- 一个系统都有哪些配置
- 一个系统的主观与客观质量
- 宏观上:
16.5 小结
- Spring Cloud 的服务治理功能:
-
借鉴自Google Dapper
-
Spring Cloud Sleuth
- Zipkin
- Web
- RabbitMQ
- 我们应该关心更多
- Zipkin
-
Waiter-service/customer-service
- 增加基于Web向Zipkin埋点功能
-
barista-service
- 增加基于MQ向Zipkin埋点功能
-
最终的成品:
- 通过Docker运行整个项目
-
有用的话,点击收藏随时查阅哦~