我有一个spring云网关应用程序,我想要的是,如果有两个路由,那么在一个路由上,它应该重定向到某个外部应用程序,但在另一个路由中,它应该将请求转发到具有特定url的同一应用程序。
-id: my_local_route
predicates:
- Path="/services/local"
uri: "/mylocal/services/local" //can we do something like that
请注意,我想在与spring云网关相同的应用程序中创建我的休息服务。我知道这不是正确的方法,但就我所知,我想知道这是否可能。
如果您的spring云网关项目中有一些rest API,则不需要显式地为其设置路由。所以假设您在网关项目中有以下rest api
@RestController
@RequestMapping("test")
class Controller{
@GetMapping("hello")
public String hello(){
return "hello";
}
}
对于外部url,您希望发送一些流量到https://httpbin.org
。因此,在网关应用程序中,yml可能看起来像这样:
spring:
cloud:
gateway:
routes:
- id: httpbin-route
uri: https://httpbin.org
predicates:
- Path=/status/**
像这样的请求
http://localhost:8080/test/hello
将由您的休息控制器解决http://localhost:8080/status/200
将重定向到httpbin站点
如果出于某种原因,两种情况的根路径相同,则控制器将具有优先权。
如果网关谓词和控制器中有相同的端点,默认情况下控制器将优先于谓词,如果您希望谓词优先于控制器,只需创建一个BeanPostProcessor来调整顺序:
@Component
public class RequestMappingHandlerMappingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof RequestMappingHandlerMapping) {
((RequestMappingHandlerMapping) bean).setOrder(2); // After RoutePredicateHandlerMapping
}
return bean;
}
}