[SpringCloud 2] Hystrix Zuul Config
SpringCloud 2
1. Hystrix 服务熔断
一个服务有多个后端依赖, 当其中某个依赖失败时, 会占用越来越多的系统资源, 进而引发系统奔溃, 即雪崩效应;
Hystrix是一个用于处理分布式系统的延迟和容错的开源库, 可以直接使用;
“断路器“可以在某个单元发送故障时,向调用服务返回一个服务预期的, 可处理的备选响应, 而不是长时间的等待或者抛出无法处理的衣长, 这样保证调用方的线程不会被长时间占用,避免了故障的蔓延乃至雪崩。
eg: a服务调用b服务:
A -> B 正常调用, 当故障时
-> B' 这个服务会直接返回一个故障信息
当然, 在调用前加一个池子的这部分在这里没有体现, 只讲个单个依赖的熔断和降级
1.1 服务熔断
熔断机制时对应雪崩效应的一种微服务链路保护机制
当某节点不可用或者响应时间太长, 会进行服务降级, 进尔熔断该节点微服务调用, 快速返回错误的响应信息;springcloud中, 当失败调用到一定阈值, default是5s内20次失败, 就会启动熔断机制 (@HystrixCommand
解决的问题:
-
当依赖对象不稳定时, 能够达到快速失败的目的
-
快速失败后, 根据一定的算法动态试探所依赖的对象是否恢复
使用:
-
添加依赖 spring-cloud-starter-hystrix
-
在controller方法上加注解, 在注解中指定fallbackMethod:(即替换的备选方法)
-
主启动类加
@EnableHystrix
(仅作为示例, 真实情况做try-catch比较好)
此方法在抛出一场并且没有globalHandle的时候, 会走下面的备选方法, 直接返回一个空Object
TestController {
@HystrixCommand(fallbackMethod = "getObjectByIdHystrix")
@GetMapping("/test/{id}")
public Object getObjectById(@PathVariable("id") Long id) {
Object object = testService.getObjectById(id);
if (Objects.isNull(object)) {
throw new RuntimeException();
}
return object;
}
public Object getObjectByIdHystrix(@PathVariable("id") Long id) {
return new Object();
}
}
1.2 服务降级
-
服务熔断时在provider-server上进行的, 在提供者超时或者一场时的一种熔断措施, 走备用方案
-
服务降级是在consumer-server上进行的, 为了给其他服务更多的资源, 比如把provider关闭了, 但需要提供友好的信息, 直接在消费端关闭访问这个provider的入口(即, consumer的接口依然能访问, 但访问的内容显示provider关闭, 而不是直接返回provider的Error信息)
使用:
-
Consumer-server 中找到provider临时关闭了的FeignClient
-
@Service
public class ProviderClientFallbackFactory implements FallbackFactory {
@Override
public ProviderClient create(Throwable throwable) {
return new ProviderClient() {
@Override
public xxx api() {
return 自定义的友好的展示provider服务暂时关闭的信息
}
//下一个xxx接口, 也重新定义友好提示
}
}
}
3. 在ProviderFeignClient的注解加上:
`@FeignClient(value = "PROVIDER-SERVER", fallbackFactory = ProviderClientFallbackFactory.class)`
4. yml中开启降级: (版本不同, 配置的key不同)
```yml
feign.circuitbreaker.enabled: true
1.3 Hystrix Dashboard
-
新写项目
-
导入依赖
spring-cloud-starter-netflix-hystrix-dashboard
-
主启动类加
@EnableHystrixDashboard
-
provider需要有依赖:
spring-boot-starter-actuator
, 这样才可以被监控到 -
provider的主启动类
@SpringBootApplication
@EnableEurekaClient //EnableEurekaClient 客户端的启动类,在服务启动后自动向注册中心注册服务
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
//增加一个 Servlet
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
//访问该页面就是监控页面
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
}
- 直接启动就ok,访问
项目url:端口/hystrix
即可到dashboard
2. Zuul 路由网关
路由, 过滤, 代理
Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
当外层是eureka, 黄色块是注册的微服务, 绿色是zuul
当要访问某个微服务时, 通过eureka找到微服务地址, 访问时通过zuul再跳转到微服务
比如: 可以屏蔽主机地址+端口号, 可以把这部分替换成域名
使用:
-
导入依赖
spring-cloud-starter-netflix-zuul
-
写新项目zuul, yml给一个application name
-
yml中写defaultZone, 把项目注册到eureka中
-
主启动类加
@EnableZuulProxy
-
此时, 访问provider这个微服务, 可以访问zuul的地址+端口号+微服务名 来进行访问
-
如果行用自定义的域名, 来代替
zuul的地址+端口号+微服务名
,需要添加配置
serviceId这些配置名称需要看源码确定, 这样就可以把访问微服务springcloud-provider
的路径上的微服务名称改成/mydept
了。
zuul.routes.mydept.serviceId=springcloud-provider
zuul.routes.mydept.path=/mydept/**
zuul.ignored-services: springcloud-provider
# 这样的话, 原来有微服务名称的路径就无法访问了
3. SpringCloud Config分布式配置
把多个微服务的配置, 放在同一个远程的仓库中去
Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
Spring Cloud Config分为服务端和客户端两部分:
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用gt来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以通过gt客户端工具来方便的管理和访问配置内容。
3. 1 配置
思路:
配置放在远端的git中, 写一个获取配置的微服务config-server, 再写一个通过config-server获取git配置的config-consumer微服务。
用来提供获取配置的服务config-server:
-
导入依赖
spring-cloud-config-server
-
写yml
spring.cloud.config.server.git.uri
用来配置远端放置配置的仓库 -
主启动类开启
@EnalbeConfigServer
客户端config-consumer:
-
依赖
spring-cloud-starter-config
-
resource下创建application.yml和bootstrap.yml
-
bootstrap.yml 系统级别的配置
```yml
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的文件名称,不要后缀
profile: dev #当前的环境
label: master # 分支
uri: config-server的地址
```
- 用户级别的配置:
```yml
# 用户级别的配置
spring:
application:
name: springcloud-config-consumer
```
- 如果这时候, 远端的config-client.yml中, 有一些配置, 比如spring.application.name这种, 在consumer中用@Value可以获取到;当然, 这个例子中, 远端的会覆盖掉本地的配置, 因为先以bootstrap中系统级的为主。