欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gateway新一代网关

程序员文章站 2022-06-13 13:49:32
...

1、Spring Cloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

2、能干嘛?

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

3、三大核心概念

Gateway新一代网关

1、pom文件

        <!--新增gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

2、yml文件

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh
          # uri: http://localhost:8001
          uri: lb://cloud-payment-service # 匹配提供服务的路由地址
          predicates:
            - Path=/payment/get/**

        - id: payment_routh2
          # uri: http://localhost:8001
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**
      discovery:
        locator:
          enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由


eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

3、主启动类

@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GateWayMain9527.class, args);
    }
}

4、测试

Gateway新一代网关

可以看到,我们通过9527端口就能访问名称为 cloud-payment-service下面的接口服务!!!

Gateway新一代网关

  • 默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
  • lb指代的是uri的协议为lb,表示启用Gateway的负载均衡功能
  • lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri

如果想在配置中添加一些其他的校验方式:

Gateway新一代网关

如果除了上面的之外,还有其他的想要实现的,可以自己定义类实现impiemerts   GlobalFilter ,Ordered:

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter,Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String username = exchange.getRequest().getQueryParams().getFirst("username");
        if(StringUtils.isEmpty(username)){
            // log.info("*****用户名为Null 非法用户,(┬_┬)");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            //给人家一个回应
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

看上面,如果请求中没有username参数的话,就会报错,从而实现了统一网关鉴权。

测试如下:

不加username:

Gateway新一代网关

加了username:

Gateway新一代网关