概述
网关也称作gateway,是一个在系统架构中起到中介的作用的组件,主要位于客户端和后端服务之间,负责接收来自客户端的请求,并将其转发到相应的后端服务。
我们在Spring Cloud中通常会有多个独立的服务提供不同的功能,这个时候,我们知道每个服务都有自己调用的API接口,并且客户端需要和多个服务直接进行交互,那么我们会导致在客户端需要处理多个服务的地址,认证,负载均衡等情况,这个时候,我们引入网关就可以简化客户端的操作,并且客户单只需要和网关进行交互,并且网关负责将相关请求转发到相应的服务。
在Spring Cloud中使用Gateway
首先我们先引入相关依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
之后我们在Spring Cloud中项目配置文件中配置相关路由规则:
spring: cloud: gateway: routes: - id: example_route uri: http://example.com # 转发的目标URL predicates: - Path=/example/** # 匹配的请求路径
看上述配置,我这边使用的是example进行的,通过配置一个路由规则,将匹配到以/example开头的相关请求转发到你指定的URL中去,也可以使用localhost:88,具体随便你定,如果你又云服务有配置了相关地址,那就直接指向你的域名服务器吧!
之后我们在启动类中添加相关注解:
@SpringBootApplication @EnableEurekaClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
在运行使用Spring Cloud应用程序,Gateway网关中将会根据配置的相关路由规则进行转发,当我们通过url地址访问的时候,比如我采用localhost:88/example/test去访问端口号的时候,如果我们配置了相关路由规则,那么他就转发到我们指向的http://example.com/example/test上去了。
注意
路由转发规则是指根据请求的路径、参数、请求头等信息,将请求转发到相应的后端服务的规则。常见的路由转发规则包括以下几种:
基于路径的路由规则:根据请求的路径将请求转发到相应的后端服务。例如,将以/api/user开头的请求转发到用户服务,将以/api/order开头的请求转发到订单服务。
import spark.*; public class Main { public static void main(String[] args) { Spark.get("/api/user", (req, res) -> { // 转发到用户服务 return forwardToUserService(req); }); } private static String forwardToUserService(Request req) { // 实现转发逻辑 return "Forwarded to User Service"; } }
或者:
spring: mvc: servlet: path: /api/user cloud: gateway: routes: - id: user-service uri: http://user-service predicates: - Path=/api/user/**
基于请求头的路由规则:根据请求头中的信息将请求转发到相应的后端服务。例如,将请求头中包含X-Service-Name: user的请求转发到用户服务,将请求头中包含X-Service-Name: order的请求转发到订单服务。
import spark.*; public class Main { public static void main(String[] args) { Spark.before((req, res) -> { if (req.headers("X-Service-Name").equals("user")) { // 转发到用户服务 forwardToUserService(req, res); } }); } private static void forwardToUserService(Request req, Response res) { // 实现转发逻辑 res.body("Forwarded to User Service"); } }
或者:
spring: cloud: gateway: routes: - id: user-service uri: http://user-service predicates: - Header=X-Service-Name,user
基于请求参数的路由规则:根据请求参数中的信息将请求转发到相应的后端服务。例如,将请求参数中包含service=user的请求转发到用户服务,将请求参数中包含service=order的请求转发到订单服务。
import spark.*; public class Main { public static void main(String[] args) { Spark.get("/api", (req, res) -> { if (req.queryParams("service").equals("user")) { // 转发到用户服务 return forwardToUserService(req); } else { // 其他逻辑 return "Other Service"; } }); } private static String forwardToUserService(Request req) { // 实现转发逻辑 return "Forwarded to User Service"; } }
或者:
spring: cloud: gateway: routes: - id: user-service uri: http://user-service predicates: - Query=service,user
基于请求方法的路由规则:根据请求的方法(GET、POST、PUT、DELETE等)将请求转发到相应的后端服务。例如,将GET请求转发到查询服务,将POST请求转发到写入服务。
import spark.*; public class Main { public static void main(String[] args) { Spark.get("/api/query", (req, res) -> { // 转发到查询服务 return forwardToQueryService(req); }); } private static String forwardToQueryService(Request req) { // 实现转发逻辑 return "Forwarded to Query Service"; } }
或者
spring: cloud: gateway: routes: - id: query-service uri: http://query-service predicates: - Method=GET
基于请求体的路由规则:根据请求体中的信息将请求转发到相应的后端服务。例如,将请求体中包含{“type”: “user”}的请求转发到用户服务,将请求体中包含{“type”: “order”}的请求转发到订单服务。
import spark.*; public class Main { public static void main(String[] args) { Spark.post("/api", (req, res) -> { if (req.body().contains("{\"type\": \"user\"}")) { // 转发到用户服务 return forwardToUserService(req); } else { // 其他逻辑 return "Other Service"; } }); } private static String forwardToUserService(Request req) { // 实现转发逻辑 return "Forwarded to User Service"; } }
或者
spring: cloud: gateway: routes: - id: user-service uri: http://user-service predicates: - ReadBody=true filters: - ModifyRequestBody=application/json, # 进行请求体的修改 SetRequestBody={ "type": "user" }
基于组合条件的路由规则:根据多个条件的组合将请求转发到相应的后端服务。例如,将以/api/user开头且请求头中包含X-Service-Version: v1的请求转发到用户服务的v1版本,将以/api/user开头且请求头中包含X-Service-Version: v2的请求转发到用户服务的v2版本。
import spark.*; public class Main { public static void main(String[] args) { Spark.before((req, res) -> { if (req.headers("X-Service-Name").equals("user")) { if (req.queryParams("id") != null) { // 转发到用户详情服务 forwardToUserDetailService(req, res); } else { // 转发到用户列表服务 forwardToUserListService(req, res); } } }); } private static void forwardToUserDetailService(Request req, Response res) { // 实现转发逻辑 res.body("Forwarded to User Detail Service"); } private static void forwardToUserListService(Request req, Response res) { // 实现转发逻辑 res.body("Forwarded to User List Service"); } }
或者:
spring: cloud: gateway: routes: - id: user-service uri: http://user-service predicates: - Header=X-Service-Name,user - Query=id filters: - RewritePath=/api/user/(?<id>.*), /api/user/{id}
补充
网关的主要作用:
路由转发:根据请求的路径或其他条件,将请求转发到相应的后端服务。
负载均衡:在转发请求时,可以根据负载均衡算法将请求分发到多个后端服务实例,以实现负载均衡。
安全认证:可以对请求进行身份验证和授权,确保只有合法的请求能够访问后端服务。
请求过滤:可以对请求进行过滤,例如根据请求的特征进行访问控制、请求日志记录等。
缓存:可以对请求的响应进行缓存,提高系统性能和响应速度。
监控和日志记录:可以对请求进行监控和日志记录,方便系统运维和故障排查。
0条评论
点击登录参与评论