Java教程

微服务:gateway网关

本文主要是介绍微服务:gateway网关,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网关

网关功能:

  1. 身份认证和权限校验

  2. 服务路由、负载均衡

  3. 请求限流

在SpringCloud中网关的实现包括两种:

  • gateway

  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。


创建gateway服务步骤:

  • 创建服务
  • 引入依赖
<!--网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 编写启动类
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}
  • 编写路由配置
server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

image

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖

  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

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

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

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

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


路由断言工厂Route Predicate Factory

名称 说明 示例
After 是某个时间点后的请求 - After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before 是某个时间点之前的请求 - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between 是某两个时间点之前的请求 - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie 请求必须包含某些cookie - Cookie=chocolate, ch.p
Header 请求必须包含某些header - Header=X-Request-Id, \d+
Host 请求必须是访问某个host(域名) - Host=.somehost.org,.anotherhost.org
Method 请求方式必须是指定方式 - Method=GET,POST
Path 请求路径必须符合指定规则 - Path=/red/{segment},/blue/**
Query 请求参数必须包含指定参数 - Query=name, Jack或者- Query=name
RemoteAddr 请求者的ip必须是指定范围 - RemoteAddr=192.168.1.1/24
Weight 权重处理

路由过滤器(GatewayFilterFactory)

用户发送的请求经过路由后,进入过滤器链,然后才到达微服务。

微服务的响应也会先进入过滤器链,最后返回给用户。

  • 配置
filters: # 过滤器
  - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
  • 获取(必须通过gateway网关的端口号进行。)
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,@RequestHeader(value = "Truth",required = false)String truth) {
    System.out.println(truth);
    return userService.queryById(id);
}

全局过滤器(GlobalFilter)

  • 实现GlobalFilter接口
  • 编写逻辑
@Order(-1)//优先级-1,越小越高
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.获取参数中的authorize参数
        String authorize = queryParams.getFirst("authorize");
        //3.判断该参数的值是否为admin
        if("admin".equals(authorize)){
            //4.1放行
            return chain.filter(exchange);
        }else{
            //4.2拦截
            //4.2.1设置状态码 类型为枚举
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //4.2.2拦截
            return exchange.getResponse().setComplete();
        }
    }
}
  • 过滤器的作用是什么?

    1. 对路由的请求或响应做加工处理,比如添加请求头

    2. 配置在路由下的过滤器只对当前路由的请求生效

  • defaultFilters的作用是什么?

    1. 对所有路由都生效的过滤器

过滤器的执行顺序

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。

  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定

  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。

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

结论:

  1. order值越小,优先级越高
  2. 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器
这篇关于微服务:gateway网关的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!