赞
踩
Gateway是Spring Cloud官方推出的第二代微服务网关,它旨在提供统一的路由方式以及为微服务应用提供强大的负载均衡能力。与第一代Spring Cloud Netflix Zuul相比,Spring Cloud Gateway在性能、可扩展性、易用性等方面都有了显著的提升。其主要特性有以下几点:
Spring Cloud Gateway的工作流程主要包括以下几个步骤:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- SpringCloud 负载均衡 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies>
3. 路由配置,可以在YML中配置,也可以通过配置类@Configuration,这两种方式的功能一样,建议使用在YML中配置。
(1)配置类方式:通过@Bean注入一个RouteLocator配置类型。
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.route("host_route", r -> r.host("*.myhost.org")
.uri("http://httpbin.org"))
.route("hystrix_route", r -> r.host("*.hystrix.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
.uri("http://httpbin.org"))
.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
.uri("http://httpbin.org"))
.build();
}
(2)YML文件配置方式:
# 服务配置 server: port: 9003 spring: application: name: njh-gateway-app cloud: loadbalancer: ribbon: enabled: false cache: enabled: true caffeine: spec: initialCapacity=500,expireAfterWrite=5s # nacos配置 nacos: discovery: server-addr: ${spring.cloud.nacos.config.server-addr} namespace: ${spring.cloud.nacos.config.namespace} group: ${spring.cloud.nacos.config.group} username: ${spring.cloud.nacos.config.username} password: ${spring.cloud.nacos.config.password} # gateway配置 gateway: routes: - id: njh-web-app #路由id,保证唯一,这里配置成服务名 uri: lb://njh-web-app #匹配成功后路由的服务,lb表示启用负载均衡 predicates: - Path=/api/webapp/** #断言,根据路径进行匹配 filters: - name: Retry args: retries: 1 #重试次数 - id: njh-biz-app uri: lb://njh-biz-app predicates: - Path=/api/bizapp/** filters: - name: Retry args: retries: 1 #重试次数
这样配置完后,当请求到达gateway后就会根据请求的路径进行匹配,然后将其转发到指定的服务去进行处理。例如:上面yml文件中配置的,请求中所有包含/api/webapp/
路径的请求都会转发到njh-web-app服务上进行处理,所有包含/api/bizapp/
路径的请求都会转发到njh-biz-app服务上进行处理。
Gateway的三大组件通常指的是路由(Routing)、断言(Assertions)和过滤器(Filters)。通过这三大组件共同协作,使得Spring Cloud Gateway可以灵活地处理各种网络请求,并提供强大的API网关功能。
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
filters:
- RewritePath=/users/(?<remaining>.*), /$\{remaining}
id:路由的唯一标识符。上面设置为user_service_route。
uri:请求被转发到的目标服务的URI。上面使用服务发现(lb://USER-SERVICE)来找到并转发请求到用户服务。
predicates:一组断言(条件),用于匹配请求。如果断言条件满足,请求将被路由到相应的URI。上面配置中的Path=/users/**断言匹配所有以/users/开头的路径。
filters:一组过滤器,用于在请求到达目标服务之前或响应返回客户端之后对请求和响应进行操作。上面配置中的RewritePath过滤器用于重写路径,移除/users/前缀。
在Spring Cloud Gateway中实现自定义Filter主要分为以下几个步骤:
@Component public class CustomRequestHeaderFilter implements GatewayFilter, Ordered { private static final int DEFAULT_ORDER = 0; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 添加自定义请求头 ServerHttpRequest request = exchange.getRequest().mutate() .header("X-Custom-Header", "MyCustomValue") .build(); // 将修改后的请求传递给下一个过滤器 return chain.filter(exchange.mutate().request(request).build()); } @Override public int getOrder() { // 返回过滤器的执行顺序,值越小,优先级越高。 return DEFAULT_ORDER; } }
在Spring Cloud Gateway中实现负载均衡主要依赖于内置的负载均衡器或者集成的服务发现组件。以下是实现负载均衡的几种方式:
(1)使用Ribbon实现负载均衡:
默认使用Netflix Ribbon作为负载均衡器。要启用Ribbon负载均衡,需要在application.yml配置文件中添加相关配置。
<dependencies> <!-- Spring Cloud Gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- Spring Cloud Ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!-- Eureka (如果使用服务发现) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
spring:
cloud:
nacos:
discovery:
enabled: true
gateway:
routes:
- id: service_route
uri: lb://SERVICE_ID
filters:
- AddRequestHeader=X-Request-Redirected, By-Gateway
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
return new RoundRobinRule();
}
}
# 在application.yml中引用这个规则:
spring:
ribbon:
NFLoadBalancerRuleClassName: com.yourpackage.RibbonConfiguration$YourCustomRule
(2)基于Spring Cloud LoadBalancer的负载均衡:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
# 禁用ribbon
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
gateway:
routes:
- id: service_route
uri: lb://SERVICE_ID
filters:
- AddRequestHeader=X-Request-Redirected, By-Gateway
(3)自定义负载均衡器:
在Spring Cloud Gateway中,自定义负载均衡器可以通过实现LoadBalancerClientFactory接口来完成。
public class CustomLoadBalancerClientFactory implements LoadBalancerClientFactory {
@Override
public LoadBalancerClient create(String serviceId) {
// 实现创建自定义LoadBalancerClient的逻辑
// 返回自定义的LoadBalancerClient实例
return new CustomLoadBalancerClient();
}
}
public class CustomLoadBalancerClient implements LoadBalancerClient {
@Override
public Mono<ServerWebExchange> execute(Request request, ServerWebExchange exchange) {
// 实现自定义的负载均衡逻辑
// 返回处理后的ServerWebExchange
return Mono.just(exchange);
}
}
spring:
cloud:
loadbalancer:
client:
factory: com.yourpackage.CustomLoadBalancerClientFactory
@Configuration
public class GatewayConfig {
@Bean
public RouteLocators customRouteLocations(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/customPath/**")
.uri("lb://CUSTOM_SERVICE"))
.build();
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。