(三)SpringCloud组件:Gateway

一、概念

        功能:身份认证、权限校验、服务路由、负载均衡、请求限流。

        实现:gateway、zuul

                zuul:基于Servlet实现,属于阻塞式编程

                gateway:基于Spring5中WebFlux,属于响应式编程。性能好

二、搭建

1、依赖(注册中心(nacos、eureka)、网关依赖(gateway、zuul))       

        <!--spring-cloud-starter-netflix-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

2、配置文件

server:
  port: 8004
spring:
  application:
    name: gateway-server
  #gateway配置
  cloud:
    gateway:
      routes: #路由配置
        - id: user-server #路由id,自定义,唯一
          uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
          predicates: #路由断言,判断请求是否符合路由规则条件
            - Path=/user/** #只要以user开头就符合
        - id: order-server #路由id,自定义,唯一
          uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
          predicates: #路由断言,判断请求是否符合路由规则条件
             - Path=/order/** #只要以user开头就符合
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
    instance:
      prefer-ip-address: true #使用ip地址进行注册
      instance-id: gateway-server:8004    #实例ID

3、启动类添加注解@EnableDiscoveryClient,不是@EnableEurekaClient

             

三、路由断言工厂RoutePredicateFactory

        此部分的目标是配置文件中的spring.cloud.gateway.routes.predicates,这个配置中的文字会被RoutePredicateFactory进行处理。

        在Spring中有11中Predicate工厂,这些配置可以在官方网站查看

四、路由过滤器GatewayFilter

        网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

         在Spring中有31种不同的路由过滤器工厂,这些配置可以在官方网站查看。       

         使用实例

                配置文件:       

spring:
  application:
    name: gateway-server
  #gateway配置
  cloud:
    gateway:
      routes: #路由配置
        - id: user-server #路由id,自定义,唯一
          uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
          predicates: #路由断言,判断请求是否符合路由规则条件
            - Path=/user/** #只要以user开头就符合
          filter: #路由过滤器配置
            - AddRequestHeader=ttt, wdnmd
        - id: order-server #路由id,自定义,唯一
          uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
          predicates: #路由断言,判断请求是否符合路由规则条件
             - Path=/order/** #只要以user开头就符合
#      default-filters: #配置所有路径
#        - AddRequestHeader=ttt, wdnmd

                接口:   

@GetMapping("/getUsername")
    public String getUserName(@RequestHeader(value = "ttt", required = false)String name){
        System.out.println("name");
        return "this is name";
    }

五、全局过滤器

        全局过滤器的作用是处理一切进入网关的请求和微服务响应。GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。

        实例:

@Order(1)//拦截器执行顺序,数字越小越靠前执行,也可以实现Ordered接口
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        //获取请求头中的参数
        HttpHeaders headers = request.getHeaders();
        String token = headers.getFirst("token");
//        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //获取参数中的指定参数
//        String token = queryParams.getFirst("token");
        //判断token是否失效
        if("1".equals(token)){
            //放行
            return chain.filter(exchange);
        }

        //设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //拦截请求
        return exchange.getResponse().setComplete();
    }
}

六、跨域

1、跨域概念

        域名不一致或者端口不一致

        域名:www.taoobao.com和www.taoobao.org

        端口:127.0.0.1:8080和127.0.0.1:8081

2、处理方式,配置文件       

spring:
  application:
    name: gateway-server
  #gateway配置
  cloud:
    gateway:

      #跨域
      globalcors: #全局的跨域处理
        add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
        cors-configurations:
          '[/**]':
            allowedOrigins: #允许那些网站的跨域请求
              - "https://www.baidu.com"
            allowedMethods: #允许跨域的请求方式
              - "GET"
              - "POST"
            allowedHeaders: "*" #允许在请求头中携带的头信息
            allowedCredentials: true # 是否允许携带cookie
            maxAge: 36000 #跨域监测有效期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值