统一网关Gateway

统一网关Gateway

网关的作用:

  • 对用户的请求做身份验证,权限校验
  • 将用户请求路由到微服务,并实现负载均衡
  • 对用户请求做限流

搭建网关服务

1.创建新的module,引入SpringCloudGateway和nacos依赖

    <dependencies>
        <!--服务发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
<!--网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

2.编写路由配置及nacos地址

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848

    gateway:
      routes:
        - id: user-service  #路由标识
          uri: lb://userserver #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/**
        - id: order-service
          uri: lb://orderserver #lb
          就是负载均衡
          predicates:
            - Path=/order/**

路由配置包括:

1.路由id:路由的唯一标识

2.路由目标(uri):路由的目标地址:http代表固定地址,lb代表负载均衡

3.路由断言(predicates):判断路由的规则

4.路由过滤器(filters):对请求或响应做处理

3、给网关创建启动类

4、使用10010端口http://localhost:10010/order/101访问

路由断言工厂(Route Predicate Factory)

作用:读取用户定义的断言条件,对请求做出判断

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#global-filters

image-20220813210758309

例子:

server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848 #nacos的服务地址

gateway:
  routes:
    - id: user-service
      uri: lb://userservice
      predicates:
        - Path=/user/**
    - id: order-service
      uri: lb://orderservice
      predicates:
        - Path=/order/**
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

此路线与 2017 年 1 月 20 日 17:42 Mountain Time (Denver) 之前提出的任何请求相匹配。

所以我们现在访问是访问不到的

路由的过滤器配置(GatewayFilter Factories)

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

案例:

给userservice添加一个请求头

gateway:
  routes:
    - id: user-service  #路由标识
      uri: lb://userserver #路由的目标地址
      predicates: #路由断言,判断请求是否符合规则
        - Path=/user/**
      filters:
      - AddRequestHeader=Truth,ylh is Handsome;

获取请求头(@RequestHeader),并打印

其中的required为是否必须,默认为 true, 表示请求参数中必须包含对应
的参数,若不存在,将抛出异常

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,@RequestHeader(value = "truth",required = false) String truth) {
    System.out.println(truth);
    return userService.queryById(id);

}

image-20220813212755511

如果要对所有路由都生效则可以,将过滤器工厂写到default下

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848

    gateway:
      routes:
        - id: user-service  #路由标识
          uri: lb://userserver #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/**
#          filters:
#          - AddRequestHeader=Truth,ylh is Handsome; 
#默认路由过滤器


        - id: order-service
          uri: lb://orderserver
          predicates:
            - Path=/order/**

      default-filters: 
         - AddRequestHeader=Truth,ylh is Handsome;
         #DefaultFilter

全局过滤器(GlobalFilter)

GlobalFilter的逻辑需要自己写代码实现

案例:定义全局过滤器判断user是否等于admin

创建一个类实现GlobalFilter接口,实现filter方法

@Order(-1)   //决定优先级的执行顺序,值越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数user
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.判断参数值是否等于admin
        String user = queryParams.getFirst("user");
       if ("admin".equals(user)){
           //放行
          return chain.filter(exchange);
       }
       //设置状态码
       //状态码401 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
       //拦截
        return exchange.getResponse().setComplete();
    }
}

image-20220814085005043

image-20220814085011818

过滤器执行顺序

请求进入网关后会碰到三类过滤器:当前路由的过滤器,DefaultFilter, GloblFilter

路由过滤器的defaultfilter

按照声明顺序从1逐渐递增

当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序

跨域问题处理

跨域:域名不一致就是跨域

包括:域名不同

​ 域名相同,端口不同

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

globalcors:
  add-to-simple-url-handler-mapping: true   #解决options请求被拦截的问题
  cors-configurations:
    '[/**]':
      allowedOrigins:  #允许那些网站跨域请求
        - "http://locallhost:8090"

      allowedMethods: #允许的跨域ajax的请求方式
       - "GET"
       - "POST"
       - "DELETE"
       - "PUT"
       - "OPTIONS"
      allowedHeaders: "*"   #允许在请求中携带的头信息
      allowedCredentials: true #是否允许携带Cookie
      maxAge: 3600000  #这次跨域检测的有效期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值