GateWay网关
1.创建GateWay网关服务
1.1.选用阿里云仓库,引入网关服务依赖(创建时可直接勾选),等待完成项目构建。(全量配置)
<dependency>
<--! GateWay网关服务依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1.2.如果没有/resources/application.yml文件需自行创建,这个配置也可放入远端,通过上章的配置中心获取,目前先不修改了。(全量配置)
server:
port: 9900 #本项目服务端口
spring:
application:
name: gateway-server #项目名称
cloud:
gateway:
routes: #路由ID、目标URL
- id: routes_1
predicates: #断言机制(复合条件,以下条件需要全部满足)
- Path=/gateway/** #路径中以gateway开头
# - Query=key,1 #请求参数和值必须包含key=1
# - Method=GET #请求方式必须是GET
# - Fg7=Host #(请求头包含Host才可以访问)自定义断言Fg7RoutePredicateFactory需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name
filters:
- StripPrefix=1 #清除第1段请求内容,多个就写多个 (http://localhost:9088/gateway/** -> http://localhost:9088/**)
# - Fg7=自定义过滤器 #(可以对请求或返回做特殊处理)自定义过滤Fg7GatewayFilterFactory需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name
uri: http://localhost:9600/ #拦截后路由服务地址
eureka:
instance:
prefer-ip-address: true #从hostname:port变为ip:port
instance-id: server:${server.port}
client:
service-url:
defaultZone: http://localhost:9800/eureka,http://localhost:9801/eureka,http://localhost:9802/eureka #【需动态获取,配置中心】
2.自定义断言/过滤类,针对特殊场景,非必须操作步骤
2.1.自定义断言类Fg7RoutePredicateFactory,需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name。
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;import org.springframework.http.HttpHeaders;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import java.util.Arrays;import java.util.List;import java.util.function.Predicate;@Component public class Fg7RoutePredicateFactory extends AbstractRoutePredicateFactory<Fg7RoutePredicateFactory.Config> { Logger logger = LoggerFactory.getLogger(Fg7GatewayFilterFactory.class);public Fg7RoutePredicateFactory() {super(Config.class);}@Override public Predicate<ServerWebExchange> apply(Config config) {return webExchange -> {logger.info("【pred】" + config.getName());HttpHeaders headers = webExchange.getRequest().getHeaders();List<String> list = headers.get(config.getName());logger.info("【Post】" + list);return list == null || list.size() <= 0 ? false : true;};}public static final String NAME_KEY = "name";@Override public List<String> shortcutFieldOrder() {return Arrays.asList(NAME_KEY);}public static class Config { private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}
2.2.自定义过滤Fg7GatewayFilterFactory,需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name。
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;import java.util.Arrays;import java.util.List;@Component public class Fg7GatewayFilterFactory extends AbstractGatewayFilterFactory<Fg7GatewayFilterFactory.Config> { Logger logger = LoggerFactory.getLogger(Fg7GatewayFilterFactory.class);public Fg7GatewayFilterFactory() {super(Config.class);}@Override public GatewayFilter apply(Config config) {return ((exchange, chain) -> {logger.info("【pred】" + config.getName());return chain.filter(exchange).then(Mono.fromRunnable(() -> {String status = exchange.getResponse().getStatusCode().toString();logger.info("【Post】" + status);}));});}public static final String NAME_KEY = "name";@Override public List<String> shortcutFieldOrder() {return Arrays.asList(NAME_KEY);}public static class Config { private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}
3.实现负载均衡
3.1.添加注册中心客户端依赖。(全量配置)
<dependency>
<--! GateWay网关服务依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<--! Eureka注册中心客户端依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2.编辑application.yml文件。(全量配置)
server:
port: 9900 #本项目服务端口
spring:
application:
name: gateway-server #项目名称
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true #大小写敏感[增加]
enabled: true #开启服务地址的发现[增加]
routes: #路由ID、目标URL
- id: routes_1
predicates: #断言机制(复合条件,以下条件需要全部满足)
- Path=/gateway/** #路径中以gateway开头
# - Query=key,1 #请求参数和值必须包含key=1
# - Method=GET #请求方式必须是GET
# - Fg7=Host #(请求头包含Host才可以访问)自定义断言Fg7RoutePredicateFactory需继承AbstractRoutePredicateFactory,且必须以RoutePredicateFactory结尾,Fg7默认为name
filters:
- StripPrefix=1 #清除第1段请求内容,多个就写多个 (http://localhost:9088/gateway/** -> http://localhost:9088/**)
# - Fg7=自定义过滤器 #(可以对请求或返回做特殊处理)自定义过滤Fg7GatewayFilterFactory需继承AbstractGatewayFilterFactory,且必须以GatewayFilterFactory结尾,默认Fg7为name
# uri: http://localhost:9088/ #拦截后路由地址 [修改]
uri: lb://product-server #从注册中心获取[增加]
eureka:
instance:
prefer-ip-address: true #从hostname:port变为ip:port
instance-id: server:${server.port}
client:
service-url:
defaultZone: http://localhost:9800/eureka,http://localhost:9801/eureka,http://localhost:9802/eureka #【需动态获取,配置中心】
3.3.此时uri: lb://product-server,会从注册中心获取服务名为product-server的服务,通过负载均衡策略分发到该服务上面。