gateWay网关
网关:

路由就是一条可以连通服务端的路,断言和过滤就是拦路的,符合要求的才会被放行
1.pom,注意不要有web包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.yml:
rotes就是路由:id要唯一,uri如果是集群服务的话改为lb://+服务名,predicates是断言
server:
port: 9527
spring:
application:
name: cloud-gateWay
#开启动态路由,就是从eureka的服务名中动态路由到实际 的服务提供者的地址,相当于Ribbon,这里是允许路径是/payment/printPort的请求通过
after是在指定日期之后才能放行这个请求,这个日期可以这样获得
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: payment01 # 唯一的即可
# uri: http://localhost:8001
uri: lb://CLOUD-PAYMENT-SERVICE
predicates:
- Path=/payment/printPort # 断言,路径相匹配的进行路由
#- After=2017-01-20T17:42:47.789-07:00[America/Denver]
#- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
#- Cookie=username,zzyy cookie的值:username=zzyy
#- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
#- Host=**.atguigu.com
#- Method=GET
#- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
# 过滤
#filters:
# - AddRequestHeader=X-Request-red, blue
# - id: payment_route2
# uri: http://localhost:8001
# predicates:
# Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateWay-service
client:
# 下边这两行说明自己就是服务注册中心,其余所有的服务都要在服务注册中心注册才能互相调用,而自己不需要注册自己
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
3.main上加以下两个注解即可
@SpringBootApplication
@EnableDiscoveryClient
4.测试:http://localhost:9527/payment/printPort,这里访问的是8001和8002的服务,通过gateWay网关隐藏了实际的端口号。
5.filter过滤器可以用配置的,如上边的yml中,一般使用自定义过滤器:
@Component
@Slf4j
public class myfilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("请求进入******"+new Date());
ServerHttpRequest request = exchange.getRequest();
String name = request.getQueryParams().getFirst("username");
if (name == null) {
log.info("用户名为null,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
// 放行
return chain.filter(exchange);
}
//加载过滤器的顺序,数字越小优先级越高
@Override
public int getOrder() {
return 0;
}
}
6.访问地址:http://localhost:9527/payment/printPort?username=1223,只要后边跟着username这个参数就可以访问。
我不是程序员,我只是程序的搬运工

浙公网安备 33010602011771号