Spring Cloud Gateway有多种方式配置路由,本文章主要分析SCG对哪些请求会做拦截,拦截后如何处理。下面我们就来梳理下这些路由配置方法以及用途。

1.常规配置方法

常规的配置方法有两种,config文件和java类的builder.routes()…,这个大家都熟悉,不展开讲。
用途:代理目标服务

2. Webflux自带 RouterFunction

webflux里自带的RouterFunction,也可以拦截客户端请求做一些控制操作,比如可以不让它访问目标地址,直接构造一个结果返回给客户端,示例如下:

	@Bean
	public RouterFunction<ServerResponse> timeRouterFunction()   {
		RouterFunction<ServerResponse> route = RouterFunctions.route(
				RequestPredicates.path("/goods/{goodsId}"),
				request -> {
					System.out.println("2=》"+ request.uri());
					// 拿到路径占位符参数
					System.out.println("3=》"+ request.pathVariable("goodsId"));
					// 拿到url入参
					System.out.println("4=》"+ request.queryParam("t_"));
					// 返回结果
					return ServerResponse.ok().body(BodyInserters.fromValue("苹果mac"));
				});
		return route.filter((request, next) -> {
			System.out.println("1=》"+ request.uri());
			Mono<ServerResponse> response = next == null ? null : next.handle(request);
			System.out.println("5=》"+ request.uri());
			return response;
		});
	}

访问:curl http://localhost:8080/goods/123456?t_=130111245

结果:
1=》http://localhost:8080/goods/123456?t_=130111245
2=》http://localhost:8080/goods/123456?t_=130111245
3=》123456
4=》Optional[130111245]
5=》http://localhost:8080/goods/123456?t_=130111245

用途:对请求有更强的控制,可以获取到请求的相关参数,不访问目标服务,直接构造结果返回。

3.Spring mvn/webflux

SCG的子项目mvc和webflux里都有ProxyExchange,能够向目标服务器发起请求,而且ProxyExchange会自动注入来,使用非常方便:

	private String url = "http://httpbin.org:80";

	@PostMapping("/proxy/{id}")
	public Mono<ResponseEntity<Object>> proxyFoos(@PathVariable Integer id,
												  ProxyExchange<Object> proxy){
		proxy.header("bar", "hello");
		proxy.header("abc", "123");
		proxy.header("hello", "world");
		return proxy.uri(url + "/get").post();
	}

详细的用法可以查看:
org.springframework.cloud.gateway.webflux.ProductionConfigurationTests
org.springframework.cloud.gateway.mvc.ProductionConfigurationTests

用途:java代码控制访问目标服务,可以对请求和响应做修改。

4.Endpoint

SCG实现了自己的Endpoint功能,可以通过http请求来获得SCG的配置信息,也可以对SCG的配置做动态的修改。Endpoint不需要开发人员去配置路由,但是我们要知道其内部是自带了这些功能,有些url是已经被占用的,在做业务开发时就要注意避免url冲突。
一般的Endpoint接口前缀是 /actuator/gateway ,比如:

GET请求获取所有的路由信息: /actuator/gateway/routes
POST请求刷新路由信息:actuator/gateway/refresh
POST请求新增一个路由:actuator/gateway/routes/{id}
DELETE请求删除一个路由:actuator/gateway/routes/{id}
GET请求获取所有gateway filter:/actuator/gateway/routefilters

通常生产环境是不会启动endpoint接口,我们可以通过以下配置来做开关控制

#是否打开endpoint,true:打开,false:关闭。默认是打开
management.endpoint.gateway.enabled=true # default value

#暴露某个接口的endpoint功能,这里是打开接口id为gateway的endpoint,
#这个配置似乎不起作用,如果要排除某个endpoint,最好还是使用exclude
management.endpoints.web.exposure.include=gateway
#排除接口id为info的endpoint功能,
management.endpoints.web.exposure.exclude=info

用途:监控SCG的路由,获取路由相关信息

5.各种route的优先级

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐