1、今日内容介绍
- 回顾:
- 系统架构的演变过程分为哪四个阶段?
- 创建SpringBoot有几种方式,分别是什么?
- 配置文件注入属性值有那两个注解,哪两种?
- @Value()
- @ConfigurationProperties()
- 今日内容安排:
- 介绍SpringCloud:What,Why,How
- 模拟简单微服务业务场景:父工程,提供者服务,消费者服务
- 思考微服务业务系统中,必然面临的问题,及解决方案
- Eureka注册中心:简介,原理,搭建,整合,详解
- Ribbon负载均衡:简介,原理,搭建,源码分析
- Hystrix熔断器:简介,雪崩效应,熔断案例,服务降级
2、系统架构演变过程
- 单一应用架构
- 垂直应用架构
- 分布式服务架构
- 面向服务的架构:微服务架构
3、SpringCloud介绍
- 什么是SpringCloud?
- 是一系列框架的有序集合,包含了服务注册发现,配置中心,消息总线,负载均衡,断路器等
- 为什么要用Springcloud?
- 从架构层面降低了对大型分布式系统构建的要求和难度
4、基础架构图剖析-版本介绍
- 版本介绍-Greenwich SR1
- 快照版 -SNAPSHOT
- 里程碑版本-MileStone,M1–>M9
- 正式的,稳定发行版本-SR,Service Release,GA(Generally Available)
- Spring Cloud与SpringBoot版本的对应关系
- Greenwich SR1 —> 2.1.x
5、微服务业务场景的构建
- 创建父工程
- 创建父工程的子模块,消费者,SpringBoot的工程,只有web
- 创建父工程的子模块,提供者,Spring Boot的工程, Mybatis+Web
6、微服务业务场景问题思考
实现最简单的需求:消费者访问提供者的查询用户信息接口
实现步骤:
- 在启动引导类注册RestTemplate对象到SpringIOC容器
- 在ConsumerController中,用RestTemplate请求服务提供者查询用户信息接口
- 启动消费者工程并测试
思考存在的问题:
- 在消费者服务中,访问url地址硬编码了,url地址端口变化了怎么办?服务死掉了如才能知道?
- 在消费者服务中,是不清楚服务提供者状态的!
- 为了增加服务提供者的并发访问量,我们搭建集群,集群的负载均衡怎么实现?
- 服务提供者如果出现故障,会不会向用户抛出异常页面,该不该抛出错误页面?
7、Eureka-注册中心简介
- 什么是注册中心Eureka?
- 是一个服务注册和发现,以及服务治理的微服务套件。
- 由两个部分构成
- 服务端组件注册中心:服务治理
- 客户端组件:服务注册,服务发现
8、注册中心搭建-界面介绍
- 目标:搭建注册中心
- 实现步骤:
- 创建SpringBoot工程eureka_server
- 勾选starter:DevTools和EurekaServer
- 启动引导类上加注解@EnableEurekaServer
- 配置文件:端口,应用名称,注册中心地址
- 启动注册中心服务
- 测试注册中心服务
- 界面简介
9、服务注册到注册中心
- 目标:提供者和消费者服务注册到注册中心
- 实现步骤:
- 改造服务提供者,pom文件中加入Eureka客户端的starter依赖
- 启动引导类上加@EnableDiscoveryClient注解
- 配置文件:端口,应用名称,服务注册中心地址
- 重启项目
- 在注册中心管理平台查看已成功注册的服务
10、再次实现消费者访问服务提供者
这次是通过注册中心的注册列表来访问
目标:消费者访问服务提供者
- 实现步骤:
- 在ConsumerController中注入DiscoveryClient对象
- 通过DiscoveryClient获取服务列表,从服务列表中获取用户服务(user-service)
- 用户服务实例中获取请求地址,请求端口,实现动态地址拼接
- RestTemplate发送请求,获取响应
- 启动消费者工程并测试
11、注册中心-知识点详解
- 基础架构的三个角色:注册中心,消费者,提供者
- 服务注册(register):Eureka Client会通过发送REST请求的方式向Server注册自己的服务
- 服务续约(renew):心跳检测,定时续约服务,默认30秒
- 获取服务(get registry):获取注册中心所有服务的清单信息,本地有缓存,缓存时间默认30秒
- 服务调用:通过清单查阅要调用的服务,然后进行远程调用
- 服务下线(cancel):服务正常关闭和重启,告知注册中心自己下线的过程
- 失效剔除(evict):如果服务没有来得及告诉注册中心就死了,那么等着被剔除吧!
- 自我保护:避免了大面积网络故障导致的本不应该的服务被剔除!默认自我保护功能是开启
12、负载均衡-介绍
- 什么是Ribbon?
- 它是一个工具类框架,实现了http请求的负载均衡。它是微服务的基础设施,非常重要,很多其他组件都是基于它实现的,比如说feign,比如说API网关gateway…。
- 负载均衡算法扩展介绍:AvailabilityFilteringRule(根据当前服务是否熔断及并发情况进行负载均衡的算法)、WeightedResponseTimeRule(根据服务响应时间来负载均衡的算法)
13、实现负载均衡入门案例
目标:实现负载均衡访问用户服务小集群。
实现步骤:
第一步:启动多个user_service服务
- 修改配置文件端口获取方式
- 编辑应用启动配置
- 启动两个提供者服务
- 在注册中心查询是否启动成功
第二步:开启消费者负载均衡
- 在RestTemplate的注入方法上加入@LoadBalanced注解
- 修改调用请求的Url地址,改为服务名称调用
- 访问页面查看效果
14、负载均衡源码解析
为什么只输入了Service名称就可以访问了呢?不应该需要获取ip和端口吗?
源码类:LoadBalancerInterceptor
15、Hystrix-熔断器-简介
- 什么是Hystrix熔断器?
- 分布式环境中,帮助控制服务之间级联报错的一个延迟和容错的库。提高系统整体弹性。
- 雪崩效应:查看讲义PPT内容
16、熔断器配置文件解析
# 配置熔断策略:
hystrix:
command:
default:
circuitBreaker:
# 原理分析中解释配置含义
# 强制打开熔断器 默认false关闭的。测试配置是否生效
forceOpen: false
# 触发熔断错误比例阈值,默认值50%
errorThresholdPercentage: 50
# 熔断后休眠时长,默认值5秒
sleepWindowInMilliseconds: 5000
# 熔断触发最小请求次数,默认值是20
requestVolumeThreshold: 10
execution:
isolation:
thread:
# 熔断超时设置,默认为1秒
timeoutInMilliseconds: 1000
断策略超时效果演示
17、熔断器原理分析
熔断器的原理如同电力过载保护器
有三种状态
- 关闭状态:所有请求正常访问
- 打开状态:所有请求被降级
- 半开状态:打开状态不是永久的,打开之后过了休眠时间会进入半开状态,半开状态效验服务
什么时候熔断?
- 访问超时
- 服务不可用(死了)
- 服务抛出异常(虽然有异常但还活着)
- 其他请求导致服务异常到达阈值,所有服务都会被降级
18、熔断器全局服务降级方法
- 目标:体验全局服务降级方法
- 实现步骤:
- 在controller类上加@DefaultProperties(defaultFallback=”defaultFallBack“)注解
- 在方法上加@HystrixCommon注解
- 重启服务测试测试