这是讨论了Spring cloud网关并使用它创建了一个演示应用程序。源代码可以从github下载。
在这个实现中,我们将有2个不同的基于Spring Boot的微服务作为第一服务和第二服务。这些服务将自己注册到发现服务器。Spring云网关将使用Netflix客户端API发现服务并将请求路由到负载均衡的下游服务。
首先生成一个Spring Boot项目,选定的依赖项是Gateway,Hystrix和Actuator。我们还将在我们的pom中添加spring-cloud-starter-netflix-eureka-client依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
|
Spring云路由配置
Route是网关的基本构建块。它由ID,目标URI,谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由。
Spring Cloud Gateway提供了许多内置路由谓词工厂,如路径,主机,日期/时间,方法,标题等。我们可以使用这些内置路由与and()或or()结合来定义我们的路由。一旦请求到达网关,网关所做的第一件事就是根据定义的谓词将请求与每个可用路由进行匹配,并将请求路由到匹配的路由。
以下是我们的路由配置。我们为2个微服务定义了2条不同的路由 - 第一服务和第二服务。
@Configuration public class BeanConfig {
@Bean public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.path("/api/v1/first/**") .filters(f -> f.rewritePath("/api/v1/first/(?.*)", "/${remains}") .addRequestHeader("X-first-Header", "first-service-header") .hystrix(c -> c.setName("hystrix") .setFallbackUri("forward:/fallback/first"))) .uri("lb://FIRST-SERVICE/") .id("first-service"))
.route(r -> r.path("/api/v1/second/**") .filters(f -> f.rewritePath("/api/v1/second/(?.*)", "/${remains}") .hystrix(c -> c.setName("hystrix") .setFallbackUri("forward:/fallback/second"))) .uri("lb://SECOND-SERVICE/") .id("second-service")) .build(); }
}
|
在上面的配置中,第一个路由与一个路径匹配,该路径的谓词定义为匹配URL /api/v1/queue/**所有请求,然后这些多个过滤器(如rewritePath addRequestHeader)将应用激活,这些都是由开箱即用的网关提供的内置过滤器。rewritePath过滤器采用路径regexp参数和替换参数;AddRequestHeader GatewayFilter Factory接受名称和值参数,并在请求中添加已配置的标头参数;Hystrix GatewayFilter Factory需要单个名称参数,该参数是HystrixCommand的名称。请求将被转发到与fallbackUri参数匹配的控制器。
下面是一个等效的application.yaml配置:
spring cloud: gateway: routes: - id: first-service uri: lb://FIRST-SERVICE predicates: - Path=/api/v1/first/** filters: - RewritePath=/api/v1/first/(?.*), /$\{remains} - AddRequestHeader=X-first-Header, first-service-header - name: Hystrix args: name: hystrix fallbackUri: forward:/fallback/first
|
Spring Cloud Gateway应用程序配置
下面是我们的application.yaml文件。
hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds:2000 spring: application: name:api-gateway
server: port:8088
eureka: client: serviceUrl: defaultZone:http :// localhost :8761 / eureka register-with- eureka:false instance: preferIpAddress:true
management: endpoints: web: exposure: include:hystrix.stream
|
Hystrix fallback 命令
下面是我们的控制器实现,其端点将在我们的微服务失败时被调用。
@RestController @RequestMapping(“/ fallback”) public class HystrixController {
@GetMapping(“/ first”) public String firstServiceFallback(){ return“这是第一个服务的后备。”; }
@GetMapping(“/ second”) public String secondServiceFallback(){ return“Second Server overloaded!请在一段时间后再试。”; } }
|