我最近开始使用Spring Cloud。我的用例如下:
两种类型的服务:
- X(一个spring云应用程序作为反向代理)
- A, B, C(单独部署的spring boot应用程序)
每当有人想访问A、B或C中的任何端点时,他们向X发出请求,X根据路径将其重定向到A、B、C。看到应用程序。
spring:
cloud:
gateway:
routes:
- id: A
uri: http://localhost:8081
predicates:
- Path=/a/**
- id: B
uri: http://localhost:8082
predicates:
- Path=/b/**
- id: C
uri: http://localhost:8083
predicates:
- Path=/c/**
按预期工作,并将请求转发给A, B, c。
在转发之前,我们想要验证请求。
所以流是这样的:
- 请求到达X
- 请求被截获,从该请求获取数据/请求参数
- 请求在X内部验证
- 如果请求被验证,那么我们根据路径 将请求转发给A、B或C。
我不明白第二步和第三步怎么做。步骤1和步骤4已经在应用程序中定义。Yml文件,没有单独的代码,只有主类。没有其他控制器或任何东西。
我们仅有的两个依赖项是:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
如果有什么问题需要澄清,请告诉我
在我的项目中也有类似的需求。我必须基于jwt令牌授权用户。请访问https://cloud.spring.io/spring-cloud-gateway/multi/multi__developer_guide.html以配置您的问题以进行预认证。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import com.google.common.net.HttpHeaders;
import reactor.core.publisher.Mono;
@Component
public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config> {
@Autowired
private Environment env;
public AuthorizationHeaderFilter() {
super(Config.class);
}
public static class Config {
// TODO Put filter configuration here
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
if (!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
return onError(exchange, "No Authorization header.", HttpStatus.UNAUTHORIZED);
}
return chain.filter(exchange);
};
}
private Mono<Void> onError(ServerWebExchange exchange, String err, HttpStatus httpStatus) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(httpStatus);
return response.setComplete();
}
}
注意:除了这段代码,你必须在应用中配置你的路由过滤器。属性文件。
spring.cloud.gateway.routes[0].id=unique_id_for_endpoint
spring.cloud.gateway.routes[0].uri=lb://ENDPOINTROOT
spring.cloud.gateway.routes[0].predicates[1]=Method=GET,POST,PUT,DELETE
spring.cloud.gateway.routes[0].filters[0]=RemoveRequestHeader=Cookie
spring.cloud.gateway.routes[0].filters[2]=AuthorizationHeaderFilter
##Rewriting URL Path
spring.cloud.gateway.routes[0].predicates[0]=Path=/API/end/point/check
spring.cloud.gateway.routes[0].filters[1]=RewritePath=/API/(?<segment>.*) ,/${segment}