Spring Cloud Gateway WebFlux 4.0.6
Spring Cloud Gateway WebFlux 4.0.6
Aporte para el mundo de habla Hispana. La libreria Spring Cloud Gateway WebFlux. En mi opinion personal me parece fenomenal y fantastico la configuración del enrutamiento dinamico, sin que tengamos hacer mucho codigo de programación eso es fanatisco. Pero para los que aun tengan dudas y no tenga claro el funcionamiento de Spring Gateway intentera de aportar, mi propia experiencia configurandolo, eh equivocandome varias veces y una noche. 这是一篇面向西班牙语社区的分享。关于 Spring Cloud Gateway WebFlux 库,我个人认为其动态路由配置非常出色且强大,无需编写大量代码即可实现,这简直太棒了。但对于那些仍有疑问或不清楚 Spring Gateway 工作原理的人,我将尝试分享我自己的配置经验——尽管我曾多次犯错,甚至熬过通宵。
Supongamos que vamos hacer una peticion o llamada de origen o request de origen, mediante el siguente enlace: http://localhost:7000/certeza/api/asegurados En nuestro archivo de spring gateway quizas tengamos un ejemplo como el siguiente:
假设我们要发起一个原始请求,链接如下:http://localhost:7000/certeza/api/asegurados。在我们的 Spring Gateway 配置文件中,可能会有如下示例:
uri: lb://servicio-asegurados
predicates:
- Path=/certeza/**
filters:
- PreserveHostHeader
- RewritePath=/certeza/?(?<segment>.*), /${segment}
La palabra segment es solo un alias, un nombre asignado aletoremente. Lo que realmente importa, es continua despues de la palabra lo que viene, inmendiatamente despues, lo que realmente importa: Eso debe hacer mach o coincidir con exactitud a nombre de nuestra ruta real de api de nuestro microservicio. Transformado, el resultado seria: /api/asegurados !! Esto es lo que realmente nos importa en la llamada.
segment 这个词只是一个别名,一个随机分配的名称。真正重要的是它后面的内容,紧随其后的部分才是关键:它必须与我们微服务中真实的 API 路径名称完全匹配。转换后,结果将是:/api/asegurados!!这就是我们在调用中真正关心的部分。
Para analizarlo de forma que vamos convega, adjunto el codigo en java para que tambien puedas analizarlo y probarlo por tu cuenta. 为了更直观地分析,我附上了 Java 代码,以便你也可以自行分析和测试。
String url = "http://localhost:7000/certeza/api/asegurados";
String regexp = "/certeza/?(?<segment>.*)";
String rutaDestino = "/${segment}";
String respuesta = url.replaceAll(regexp, rutaDestino);
System.out.println(respuesta);
// Resultado: --> http://localhost:7000/api/asegurados
Pero aqui viene la pregunta del millon: Como hace sabe Spring-Gateway a donde debe enviar esa direccion y enviarla al luegar correcto: pues mediante: uri: lb://servicio-asegurados esta linea de configuración el archivo de configuración de spring gateway le dice al motor interno de sprin-gateway ds a donde debe ser redirigido. http://localhost:8001/api/asegurados vuela..!! esa es la verdadera magia de Spring-Gateway eso es fantastico, porque al front-end le evita, tener que cambiar sus rutas de origen para el aprovisionamiento de datos.
但这里有一个价值百万的问题:Spring Gateway 如何知道应该将该地址发送到哪里并确保其到达正确的位置?答案是通过:uri: lb://servicio-asegurados。这行配置告诉 Spring Gateway 的内部引擎应该重定向到哪里。http://localhost:8001/api/asegurados,搞定!!这就是 Spring Gateway 真正的魔力所在,它非常棒,因为它避免了前端为了数据供应而必须更改其原始路径。
tambien facilita enormemente el trabajo de la SecurityFilterChain
它也极大地简化了 SecurityFilterChain 的工作:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(cus->cus.disable())
.userDetailsService(userDetailsService)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(aut-> aut
.requestMatchers(HttpMethod.POST,"/api/asegurados").hasAnyRole("ADMIN","OPERATOR")
.requestMatchers(HttpMethod.PUT,"/api/asegurados").hasAnyRole("ADMIN","OPERATOR")
.requestMatchers(HttpMethod.DELETE,"/api/asegurados/").hasRole("ADMIN")
.requestMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll()
.requestMatchers("/api/**").authenticated()
)
.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}