IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring cloud/gateway -> 正文阅读

[Java知识库]spring cloud/gateway

总结

路由=ID+目标URL+断言+过滤器
路由可以在yaml配置文件中配置也可以在代码中配置
有多重HTTP断言方式
两种过滤器全局过滤器和局部过滤器
路由负载均衡
统一网关日志/鉴权:实现GlobalFilter接口的filter方法

作用

路由=ID+目标URL+断言+过滤器
断言:如果HTTP请求和断言匹配则进行路由
过滤器:在HTTP请求被路由前后对HTTP请求进行处理

功能:

  • 动态路由
  • 统一网关日志:通过全局过滤器实现
  • 统一网关鉴权:通过全局过滤器实现
  • 服务发现
  • 负载均衡
  • 反向代理
  • 熔断限流

使用/路由入门

pom.xml

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

路由配置方式1:在yaml文件中配置
application.yaml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes: # 路由=ID+目标URL+断言+过滤器
        - id: payment_route # 路由ID,要求唯一
          uri: http://localhost:8001  # 匹配此路由后需要路由的地址
          predicates:
            - Path=/payment/get/** # 断言,HTTP请求是否匹配此路径
        - id: payment_route2
          uri: http://localhost:8001
          predicates:
            Path=/payment/lb/**

路由配置方式2:在代码中配置

package com.xcrj.springcloud.configuration;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GateWayConfiguration {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes=routeLocatorBuilder.routes();
		// 路由ID,断言,再路由地址
        routes.route("payment_route ",r->r.path("/payment/get/**").uri("http://localhost:8001")).build();
        return routes.build();
    }
}

main

package com.xcrj.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

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

使用/路由负载均衡

application.yaml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 动态路由,开启从注册中心动态创建路由的功能,利用微服务名称进行路由
      routes:
        - id: payment_route
          uri: lb://cloud-payment-service #注意:以lb开头,不是HTTP开头;使用微服务名
          predicates:
            - Path=/payment/get/**
        - id: payment_route2
          uri: lb://cloud-payment-service #注意:以lb开头,不是HTTP开头;使用微服务名
          predicates:
            - Path=/payment/lb/**

使用/断言

官网所有断言规则

application.yaml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 动态路由,开启从注册中心动态创建路由的功能,利用微服务名称进行路由
      routes:
        - id: payment_route
          uri: lb://cloud-payment-service #注意:以lb开头,不是HTTP开头;使用微服务名
          predicates:
            - Path=/payment/lb/**
            - Method=Get
            - Header=X-Request-Id,\d+ #请求头要有X-Request-Id属性;并且属性值为整数(正则匹配)
            - Cookie=username,xcrj
            - After=2022-05-06T17:52:11.834+08:00[Asia/Shanghai]
            - Before=2022-04-06T17:52:11.834+08:00[Asia/Shanghai]
            - Between=2022-04-06T17:52:11.834+08:00[Asia/Shanghai],2020-04-06T17:52:11.834+08:00[Asia/Shanghai]

使用/过滤器

官网局部过滤器: GatewayFilter
官网全局过滤器: GlobalFilter

application.yaml

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: payment_route
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**
          filters:
            - AddRequestParameter=name,xcrj # URL增加请求参数

使用/统一网关鉴权 全局过滤器

package com.xcrj.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;

@Component
@Slf4j
// 实现GlobalFilter接口的filter方法
public class GlobalGatewayAuthFilter implements GlobalFilter, Ordered {
    /**功能描述:思想跟servlet的filter一样<br>
     * 1.servlet-filter:
     *  初始化(可获取配置参数):public void  init(FilterConfig config);
     *  执行过滤(入参Request、Response):public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain);
     *          // 把请求传回过滤链
     *         chain.doFilter(request,response);
     *  销毁filter:public void destroy();
     * 2.spring cloud gateway:
     *  类似于servlet-filter的doFilter()方法,ServerWebExchange exchange可以获取request和response
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("进入 GlobalGatewayLogFilter");
        String username=exchange.getRequest().getQueryParams().getFirst("username");
		// 如果是非法用户不往后传递
        if(StringUtils.isBlank(username)){
            log.info("非法用户");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

	/**
	 * order值最小为-1,越小优先级越高
	 */
    @Override
    public int getOrder() {
        return 0;
    }
}

使用/统一网关日志 全局过滤器

同理于统一网关鉴权,使用全局过滤器

对比zuul 1.x和gateway

zuul 1.x

  • 基于BIO(阻塞IO),IO请求线程被阻塞直到工作线程执行完成返回结果给IO请求线程
  • 不支持长连接
  • 工作流程类似nginx,IO请求线程将任务交给工作线程,IO请求线程被阻塞直到工作线程执行完成返回结果给IO请求线程,nginx是用c++编写效率很高
  • BIO工作流程举例,我到银行柜台去取钱,提款申请,银行工作人员审核处理,我一直要等着银行工作人员处理完,我才能干其他事情

spring cloud gateway:

  • 使用web-flux框架,web-flux框架内部使用reactor-netty容器,web-flux是异步非阻塞的框架
  • 基于NIO(非阻塞IO)
  • 支持web socket
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:38:23  更:2022-07-20 18:41:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:08:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码