目录
在Java后端开发中,Gateway通常指的是API网关,它是微服务架构中的一个关键组件,负责接收所有外部请求,然后根据一些规则将请求路由到相应的微服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关解决方案。以下是一个简单的Spring Cloud Gateway入门示例,包括作用、配置和运用的说明。
1. 作用:
- 路由: 将请求路由到相应的微服务,可以根据请求的路径、方法、头等进行灵活的路由配置。
- 过滤: 可以通过过滤器在请求进入或响应离开网关时进行一些处理,如鉴权、日志记录、请求/响应修改等。
- 负载均衡: 支持负载均衡,可以轻松地集成服务发现组件进行服务实例的动态发现和负载均衡。
2. 配置:
创建一个Spring Cloud Gateway应用,首先确保项目中包含了spring-cloud-starter-gateway
的依赖。在pom.xml
中添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
然后,创建一个简单的Gateway配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("service_a", r -> r.path("/service-a/**")
.uri("http://localhost:8081"))
.route("service_b", r -> r.path("/service-b/**")
.uri("http://localhost:8082"))
.build();
}
}
上述配置示例中,定义了两个路由规则:
- 当访问
/service-a/**
时,路由到http://localhost:8081
。 - 当访问
/service-b/**
时,路由到http://localhost:8082
。
3. 运用:
创建一个Spring Boot应用程序的主类,标记为@SpringBootApplication
:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
在运行应用程序后,Gateway将会启动,并监听默认端口8080
。现在,你可以通过访问http://localhost:8080/service-a/**
或http://localhost:8080/service-b/**
来测试路由规则。
4. 注意事项:
- 上述示例中使用的是固定的服务地址,实际中可以使用服务发现(如Eureka)来实现动态服务路由和负载均衡。
- 过滤器可以用于实现各种功能,如鉴权、日志记录、请求/响应修改等。
- Gateway支持使用配置文件(application.yml或application.properties)进行更详细的配置。
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: product-route
uri: lb://mall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>/?.*), /$\{segment}
- id: admin-route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>/?.*), /renren-fast/$\{segment}