Spring Cloud Gateway各种路由的配置与用途
Spring Cloud Gateway有多种方式配置路由
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的优先级
更多推荐
所有评论(0)