服务网关

微服务基本组成

Gateway

SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

Gateway的作用有:反向代理,鉴权,流量控制,熔断,日志监控

Gateway概述

Gateway位置

Gateway逻辑图

特性

  • 基于Spring Framework5,Project Reactor 和 SpringBoot 2.0进行构建
  • 动态路由:能够匹配任何请求属性,可以对路由指定Predicate(断言)和Filter(过滤)
  • 集成Hystrix的断路器功能
  • 请求限流功能
  • 支持路径重写

功能概述

  • Route路由:是构建网关的基本模块,它由ID,目标URL,一系列的断言和过滤器组成,如果断言为true则匹配该路由
  • Predicate断言:Java8新特性(java.util.function.Predicate),开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
  • Filter过滤:指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改

Gateway工作流程

工作流

客户端向SpringCloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler

Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回

过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前pre或之后post执行业务逻辑

使用

引入pom

1
2
3
4
5
6
<!--新增gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 不要web和actuator -->

yml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service # 负载均衡使用
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
# 路径重写
filters:
- RewritePath=/api/(?<segment>.*),/t/$\{segment} # 例如 /api/test 重写为 /t/test

- id: payment_routh2
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service # 微服务的协议是lb,表示启用负载均衡功能
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由

- id: route_guonei
uri: http://www.baidu.com
predicates:
- Path=guonei #断言,路径相匹配的进行路由,失败

启动类

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
public static void main(String[] args) {
SpringApplication.run( GateWayMain9527.class,args);
}
}

自定义Filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("*********come in MyLogGateWayFilter: "+new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("username");
if(StringUtils.isEmpty(uname)){
log.info("*****用户名为Null 非法用户,(┬_┬)");
//给人家一个回应
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);

}

@Override
public int getOrder() {
return 0;
}
}

相关文章

SpringCloud

服务注册与发现

服务降级

服务调用

服务配置和服务总线

Stream消息驱动

SpringCloud-OpenFeign问题

SpringCloud-GateWay工具类

DockerCompose常用软件配置

SpringQuartz动态定时任务