第八天、SpringCloud 之一统江湖
熔断器Hystrix(豪猪)
雪崩效应
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障, 进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种 因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
快速体验
Feign 本身支持Hystrix,不需要额外引入依赖。
1 修改tensquare_qa模块的application.yml ,开启 hystrix
feign:
hystrix:
enabled: true
2 在com.tensquare.qa.client包下创建impl包,包下创建熔断实现类,实现自接口 LabelClient
@Component
public class LabelClientImpl implements LabelClient {
@Override
public Result findById(String id) {
return new Result(false, StatusCode.ERROR, "熔断器启动了");
}
}
3 修改LabelClient的注解,表示出问题了,则执行其实现类,即使用熔断器。
@FeignClient(value="tensquare‐base",fallback = LabelClientImpl.class)
4 测试运行
重新启动问答微服务,测试看熔断器是否运行。
网关-Zuul
所有微服务都在 Eureka 服务器上面。
网关(分为Web网关和后台manager网关):所有用户都经过网关去访问微服务,由网关向指定的微服务跳转。所以网关也要放到 Eureka 服务器
搭建后台网关
引入 Eureke 和 zuul 的依赖;创建配置文件;写启动类;
Zuul 网关过滤器
请求进入网关后,头信息会丢失。
web网关头信息转发。用户请求的头信息一般不是用于权限验证,权限验证是后台网关要求做的,
任何向网关发送的请求,都需要转发两次。第一次是网关内部负责请求路径分发的请求,方法名叫:OPTTIONS,碰到这个方法,后台网关直接放行。此外,还需要对登录请求之间放行。
集中配置组件 SpringCloudConfig – 为了运维方便
项目开发完成会部署到线上,java 代码一般不用修改,因为需要经常频繁修改的内容已经放到了配置文件中,就会涉及到修改配置文件。
当整个项目部署到线上后,修改本地配置文件无法影响线上,需要修改完后,整个模块重新做成镜像,重新发布一下。这样比较麻烦。
因此,把所有模块的配置文件,抽取到一个公共的地方,方便线上修改配置文件。
config: 集中配置中心,将所有服务的配置文件都放在一个代码管理平台上(码云),通过该服务去读取对应服务所需的配置文件。
web 客户端想要访问网关 第一步需要先访问 集中配置中心,获取到网关的配置文件。
1.把配置文件上传到 Gitee
2.搭建配置中心微服务
- 配置中心微服务的功能就是从 gitee 上把对应微服务的配置文件下载下来使用。
基础微服务使用配置中心获取配置文件
对基础微服务进行下面操作:
- 配置客户端依赖
- 添加bootstrap.yml配置文件,删除 application.yml。区别:1.前者的优先级高于后者的优先级,即若两个配置文件都存在,先执行bootstrap.yml配置文件;2. bootstrap.yml配置的都是一些不经常改变的系统配置信息, application.yml配置的是代码用到的配置信息(可能会经常改动),比如连接数据库的信息。
让Eureka、网关、用户都使用配置中心获取配置文件
消息总线组件SpringCloudBus
监听:看配置文件是否有改动,如果有的话,让该模块读取配置文件,重新编译代码。
必须要提前把 MQ 运行起来。
流程图如下:
SpringCloudBus 也分为服务端和客户端。
配置服务端
配置客户端
自定义配置的读取
@Value("${sms.ip}")
private String ip;
在 Controller 层加上@RefreshScope, 此注解用于刷新配置。以后可以在每个Controller 层都加上此注解。如果没加,对于自定义的配置文件被修改了,虽然某模块监听了消息队列,但是仍无法获得修改后的信息。
网关和ip、端口没有任何关系,网关是通过项目名称寻找模块,压根没有经过 ip 和端口号。ip和端口号要提前注册到 Eureka 上,网关自身也要注册到 Eureka 上,否者模块相互之间无法通信。
PowerDesigner: 双方公司为了商务洽谈,使用该工具,将模型列出来,方便给投资方或第三方公司,讲解我公司软件的架构流程。主要是用于展示,而不是说离开他不行。很牛的架构师为了快速搭建框架,压根不用。其实 PowerDesigner 就是在说明类与类、方法与方法和接口与接口、数据库表之间的关系,就是画一个模型图。
如果面试问到是否会 会使用 PowerDesigner, 可以回答这个不会,但是如果需要我可以回头研究一下。