文章目录
springCloud
什么是springCloud
在springboot的基础上构建的微服务框架
常用配置步骤
- 1.引入组件的启动器
- 2.覆盖默认配置
- 3.在引导类上添加相应的注解
eureka
注册中心,服务的注册与发现
服务端
-
1.引入启动器:eureka-server
- spring-cloud-starter-netflix-eureka-server
-
2.添加了配置
-
spring.applicaiton.name
- 服务名
-
eureka.client.service-url.defaultZone
-
http://主机名:端口号/eureka
- 配置其他Eureka服务的地址
-
-
eureka.server.eviction-interval-timer-in-ms
- 扫描失效服务的间隔时间(缺省为60*1000ms)
-
eureka.server.enable-self-preservation
-
自我保护
- 开发时通常关闭
- 默认为true
-
-
-
3.@EnableEurekaServer
- 启用eureka服务端
客户端
-
1.引入启动器:eureka-client
- spring-cloud-starter-netflix-eureka-client
-
2.添加配置
-
spring.application.name
-
eureka.client.service-url.defaultZone
-
http://主机名:端口号/eureka
- 配置Eureka服务的地址,多个用",“ 分开
-
-
eureka.instance.lease-renewal-interval-in-seconds
- 服务续约(renew)的间隔,默认为30秒
-
eureka.instance.lease-expiration-duration-in-seconds
- 服务失效时间,默认值90秒
-
eureka.client.register-with-eureka
- 是否注册给eureka容器
- 默认为true
-
eureka.client.fetch-registry
- 是否拉取服务列表
- 默认为true
-
eureka.client.registry-fetch-interval-seconds
-
拉取服务的间隔时间
- 生产环境中,不需要修改这个值
-
-
-
3.@EnableDiscoveryClient
- 启用eureka客户端
ribbon
负载均衡组件
不用单独导入启动器,eureka、feign以及zuul已集成
配置负载均衡策略
-
<服务名>.ribbon.NFLoadBalancerRuleClassName
- com.netflix.loadbalancer.RoundRobinRule 轮询 (默认)
- com.netflix.loadbalancer.RandomRule 随机
@LoadBalanced
- 在RestTemplate的@Bean方法上
hystrix
容错组件
服务降级
-
优先保证核心服务,而非核心服务不可用或弱可用
- 线程池已满
- 请求超时
-
1.引入hystrix的启动器
- spring-cloud-starter-netflix-hystrix
-
2.添加配置,设置超时时间
- hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
- 默认1000(1s)
-
3.启用熔断组件
-
@EnableCircuitBreaker
-
3个可简化为 @SpringCloudApplication
- @SpringBootApplication
- @EnableDiscveryClient
- @EnableCircuitBreaker
-
-
处理代码
-
局部
- 返回值和参数列表和被熔断的方法一致
- 在被熔断的方法上@HystrixCommand(fallbackMethod=“熔断方法名”)
-
全局
- 返回值和被熔断的方法返回值一致,不能有参数列表
- 在类上@DefaultProperties(defaultFallbck=“全局熔断方法名”)
- 在被熔断方法上@HystrixCommand
-
服务熔断
-
close
- 关闭状态
- 所有请求都正常访问
-
open
- 打开状态
- 打开状态,所有请求都会被降级
- 触发:默认失败比例的阈值是50%,请求次数最少不低于20次。
- 维持5s的休眠时间
-
half open
-
半开状态
-
释放部分请求通过
-
正常
- close
-
不正常
- open
-
-
此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
-
触发:休眠时间之后
-
feign
远程调用组件
- 集成ribbon和hystrix
- 使代码更加优雅
1.引入feign的启动器
- spring-cloud-starter-openfeign
2.配置
-
开启熔断
- feign.hystrix.enable=true
3.开启feign的功能
- @EnableFeignClients
代码
-
定义一个接口
-
@FeignClient(value=“服务名”, fallback=实现类.class)
- 实现类中实现具体的降级方法
-
方法即注解与对应调用controller层方法相同,只是无方法体
-
zuul
网关组件
- 路由
- 过滤器
1.引入启动器
- spring-cloud-starter-netflix-zuul
2.添加配置
-
注册到Eureka组件
- eureka:
client:
registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
service-url:
defaultZone: http://主机名:端口/eureka
- eureka:
-
路由前缀
-
zuul.prefix
- 通常/api
-
-
四种路由配置方式
-
zuul.routes.<路由名>.path=/service-provider/**
zuul.routes.<路由名>.url=http://主机名:端口 -
zuul.routes.<路由名>.path=/service-provider/**
zuul.routes.<路由名>.serviceId=service-provider -
推荐 zuul.routes.=
` -
不配置
- 默认服务的入口就是以服务名为前缀
-
3.@EnableZuulProxy
- 开启zuul网关组件
自定义过滤器
-
默认的抽象类:ZuulFilter
-
filterType
filterType
:返回字符串,代表过滤器的类型。包含以下4种:
-
pre
:请求在被路由之前执行 -
route
:在路由请求时调用 -
post
:在route和errror过滤器之后调用 -
error
:处理请求时发生错误调用- pre
- post
- route
- error
-
filterOrder
- 执行顺序,返回值越小优先级越高
-
shouldFilter
- 是否执行run方法
- 执行为 true
-
run
- 过滤器的具体逻辑
-
四种执行顺序
-
pre–>route–>post
-
异常
-
pre或者route出现异常
- 直接执行error–>post–>响应
-
post出现异常
- error–>响应
-
error出现异常
- error–>post–>响应
-
-
场景
-
- 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
-
-
-
异常处理:一般会在error类型和post类型过滤器中结合来处理。
-
服务调用时长统计:pre和post结合使用。