gateway基本配置教程

2023-05-20 05:05:54 gateway 教程 基本配置

1、gateway简介

路由转发 + 执行过滤器链。

网关,旨在为微服务架构提供一种简单有效的统一的api路由管理方式。同时,基于Filter链的方式提供了网关的基本功能,比如:鉴权、流量控制、熔断、路径重写、黑白名单、日志监控等。
基本功能如下:

  • 统一入口:暴露出网关地址,作为请求唯一入口,隔离内部微服务,保障了后台服务的安全
  • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
  • 动态路由:动态的将请求路由到不同的后端集群

2、gateway核心概念

  • 路由(Route):由一个ID,一个目标URI(最终路由到的url地址),一组断言(匹配条件判断)和一组过滤器定义。如果断言为真,则路由匹配。
  • 断言(Predicate):通过断言匹配Http请求中的任何内容(请求头、请求参数等),如果匹配成功,则匹配断言所在路由。
  • 过滤器(Filter):在请求前后执行业务逻辑,比如鉴权、日志监控、流量控制、修改请求头、修改响应等。

3、路由

spring:
  cloud:
	gateway:
	  routes:
	  - id: manager						# 路由唯一标识
		uri: lb://manager_server		# 路由指向目的地URL或服务名,客户端请求最终被转发到的微服务
		predicates:
		- Path=/manager
@Slf4j
@Component // 让容器扫描到,等同于注册了
public class BlackListFilter implements GlobalFilter, Ordered {
	// 模拟黑名单(实际可以去数据库或者Redis中查询)
	private static List<String> blackList = new ArrayList<>();
	static {
		blackList.add("0:0:0:0:0:0:0:1"); // 模拟本机地址
	}
	
	@Override
	public Mono<Void> filter(ServerWEBExchange exchange, GatewayFilterChain chain) {
		// 思路:获取客户端ip,判断是否在黑名单中,在的话就拒绝访问,不在的话就放行
		ServerHttpRequest request = exchange.getRequest();
		ServerHttpResponse response = exchange.getResponse();
		// 从request对象中获取客户端ip
		String clientIp = request.getRemoteAddress().getHostString();
		// 拿着clientIp去黑名单中查询,存在的话就决绝访问
		if(blackList.contains(clientIp)) {
			// 拒绝访问,返回
			response.setStatusCode(httpstatus.UNAUTHORIZED); // 状态码
			log.debug("=====>IP:" + clientIp + " 在⿊名单中,将被拒绝访问!");
			String data = "Request be denied!";
			DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
			return response.writeWith(Mono.just(wrap));
		}
		// 合法请求,放行,执行后续的过滤器
		return chain.filter(exchange);
	}
	
	@Override
	public int getOrder() {
		return 0;
	}
}

5.4.2、模拟登录校验

在过滤器中检查请求中是否携带token请求头。如果token请求头存在则放行;如果token为空或者不存在则返回认证失败状态码。

@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        boolean token = exchange.getRequest().getHeaders().containsKey("token");
        System.out.println("----全局过滤器token----"+token);
        if (!token){
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            ServerHttpResponse response = exchange.getResponse();
            return response.setComplete();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1;
    }
}

6、一个简单的gateway配置实例

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 表明Gateway开启服务注册和发现的功能,并且spring cloud Gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
          enabled: true
          # 将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了)
          lower-case-service-id: true
      routes:
	  # 系统管理
      - id: sys-mgt
        uri: lb://sysmgt
        predicates:
        - Path=/sys-mgt/** 	#以sys-mgt开头的请求都负载到sysmgt服务
		- Method=GET		#只匹配GET请求
        filters:
        - RewritePath=/sys-mgt/(?<segment>.*), /$\{segment} #过滤掉url里的sys-mgt,例如http://ip:port/sys-mgt/test -> http://ip:port/test
		- PrefixPath=/mgt									#为请求添加/mgt前缀,再结合RewritePath过滤器,http://ip:port/sys-mgt/test -> http://ip:port/mgt/test

到此这篇关于gateway基本配置的文章就介绍到这了,更多相关gateway基本配置内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章