赞
踩
通过配置文件配置路由是最简单的配置方式,下面是一组实例:
id:唯一路由表示,没有实际作用不重复就好
uri:lb://集群中服务名称。(需要把gateway服务也注册到注册中心中,否则获取不到真实得服务ip信息)
order:优先级(数字越小越优先匹配)
predicates:请求的路径
filters:该路由要配置执行的过滤器(写法:- 过滤器名称)
这里使用了StripPrefix这个过滤器,对应StripPrefixGatewayFilterFactory这个内置的过滤器工厂类,作用是转发请求前 从请求中剥离的路径个数,StripPrefix=0表示不剥离,StripPrefix=1表示剥离一层。
过滤器的实现逻辑如下,其实就是根据设置截取设置新的路径
- ServerHttpRequest request = exchange.getRequest();
- ServerWebExchangeUtils.addOriginalRequestUrl(exchange, request.getURI());
- String path = request.getURI().getRawPath();
- String newPath = "/" + (String)Arrays.stream(StringUtils.tokenizeToStringArray(path, "/")).skip((long)config.parts).collect(Collectors.joining("/"));
- newPath = newPath + (newPath.length() > 1 && path.endsWith("/") ? "/" : "");
- ServerHttpRequest newRequest = request.mutate().path(newPath).build();
- exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
- return chain.filter(exchange.mutate().request(newRequest).build());
假设user-service和oauth-service的服务地址分别是http://127.0.0.1:8070,http://127.0.0.1:8060
例如下面的写法中,user-service最终转发后的路径就是:http://127.0.0.1:8070/** 剥离掉了一层user-service路径
而oauth-service中最终路径是:http://127.0.0.1:8060/oauth-service/** 不做路径剥离直接请求。
- spring:
- application:
- name: gateway
- cloud:
- gateway:
- discovery:
- locator:
- lowerCaseServiceId: true
- enabled: true
- routes:
- - id: api-user
- uri: lb://user-service
- order: 8001
- predicates:
- - Path=/user-service/**
- filters:
- - StripPrefix=1
- - id: api-auth1
- uri: lb://oauth-service
- order: 8003
- predicates:
- - Path=/oauth-service/oauth/token
- filters:
- - StripPrefix=0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。