基础组件
-
路由网关:GateWay
SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。Spring Cloud Gateway的目标提供统-的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。 -
注册中心:Nacos
Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。 -
负载均衡:Ribbon
微服务间的调用,网关请求转发,feign都是通过ribbon实现的,因此学习ribbon的原理还是很重要的,而ribbon的作用是用于负载均衡,springcloud自动化整合配置ribbon是RibbonEurekaAutoConfiguration这个类。对于开发者来说,使用ribbon只需要在RestTemplate上添加@LoadBalanced注解即可实现消费方的负载均衡. -
熔断器:Hystrix
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等 ,Hystrix
能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
"断路器"本身是一种开关装置,但某个服务单元发生故障之后,通过短路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
配置
网关 pom.xml 引入:
dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
注意 Gateway 默认使用的是 webflux,不要引入 web,否则启动会报错。
启动配置 bootstrap.yml,请自行安装 Nacos:
server:
port: 8080
spring:
application:
name: tools-gateway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: sys
uri: lb://tools-sys
predicates:
- Path=/api/sys/**
filters:
- StripPrefix=2
- name: Hystrix
args:
name: fallback
fallbackUri: forward:/fallback # 熔断回调
- id: weChat
uri: lb://tools-meizi
predicates:
- Path=/api/meizi/**
filters:
- StripPrefix=2
# 跨域请求
filter:
remove-hop-by-hop:
headers:
- trailer
- te
- keep-alive
- transfer-encoding
- upgrade
- proxy-authenticate
- connection
- proxy-authorization
- x-application-context
- access-control-allow-credentials
- access-control-allow-headers
- access-control-allow-methods
- access-control-allow-origin
- access-control-max-age
- vary
globalcors:
corsConfigurations:
'[/**]':
allowCredentials: true
allowedHeaders: '*'
allowedMethods: '*'
allowedOrigins: '*'
maxAge: 3628800
# 熔断
hystrix:
command:
default:
circuitBreaker:
enabled: true
errorThresholdPercentage: 50
forceClosed: false
forceOpen: false
requestVolumeThreshold: 4
sleepWindowInMilliseconds: 10000
execution:
isolation:
semaphore:
maxConcurrentRequests: 2
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 3000
metrics:
healthSnapshot:
intervalInMilliseconds: 500
rollingPercentile:
bucketSize: 100
enabled: true
numBuckets: 6
timeInMilliseconds: 60000
rollingStats:
numBuckets: 10
timeInMilliseconds: 5000
requestCache:
enabled: false
requestLog:
enabled: false
shareSecurityContext: true
threadpool:
default:
coreSize: 1
maxQueueSize: 200
queueSizeRejectionThreshold: 2
鉴权
/**
* 判断 token 是否为空
*/
if (StringUtils.isBlank(token)) {
logger.info( "token is empty..." );
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}else{
/**
* 验证真伪
*/
CheckResult checkResult = JwtUtils.validateJWT(token);
if (!checkResult.isSuccess()) {
logger.info( "token is error..." );
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100;
}
private static List<String> patterns =
Arrays.asList(new String[] {"/api/sys/login","/error","/api/sys/v2/api-docs"});
}
熔断
一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
适用场景
防止应用程序直接调用那些很可能会调用失败的远程服务或共享资源。
服务降级
当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
核心配置:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: sys
uri: lb://tools-meizi
predicates:
- Path=/api/meizi/**
filters:
- StripPrefix=2
- name: Hystrix
args:
name: fallback
fallbackUri: forward:/fallback # 熔断回调
主要参数:
# 熔断
hystrix:
command:
default:
circuitBreaker:
enabled: true
errorThresholdPercentage: 50
forceClosed: false
forceOpen: false
requestVolumeThreshold: 4
sleepWindowInMilliseconds: 10000
execution:
isolation:
semaphore:
maxConcurrentRequests: 2
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 3000
metrics:
healthSnapshot:
intervalInMilliseconds: 500
rollingPercentile:
bucketSize: 100
enabled: true
numBuckets: 6
timeInMilliseconds: 60000
rollingStats:
numBuckets: 10
timeInMilliseconds: 5000
requestCache:
enabled: false
requestLog:
enabled: false
shareSecurityContext: true
threadpool:
default:
coreSize: 1
maxQueueSize: 200
queueSizeRejectionThreshold: 2
核心代码 DefaultHystrixController:
/**
* 降级处理
*/
@RestController
public class DefaultHystrixController {
@RequestMapping("/fallback")
public Map<String,String> fallback(){
Map<String,String> map = new HashMap<>(8);
map.put("code","fail");
map.put("msg","服务异常");
return map;
}
}
小结
Nacos:Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Gateway:Spring Cloud Gateway的目标提供统-的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。