【SpringCloud】SpringCloud原理之Gateway网关

news2024/11/15 4:32:36

目录

  • 前言
  • SpringCloud Gatewy网关
    • 一.网关功能和工作原理
    • 二.网关的类型
    • 三.搭建网关
    • 四.路由断言工厂(Route Predicate Factory)
    • 五.路由过滤器(属于GatewayFilter)
    • 六.DefaultFilter过滤器(属于GatewayFilter)
    • 七.全局过滤器(GlobalFilter)
    • 八.过滤器执行顺序
    • 九.Gateway解决跨域问题

前言

微服务分为多个服务,有很多服务是内部人员要用的,但是现在谁都可以访问到,那我们该怎么办呢?

SpringCloud Gatewy网关

一.网关功能和工作原理

在这里插入图片描述

二.网关的类型

  • Gateway
    响应式编程,具有更好的性能。

  • Zuul
    阻塞式编程。

三.搭建网关

1.创建一个新的服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.添加网关依赖和nacos服务发现依赖

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

3.编写yml配置文件

server:
  port: 10086  #端口号
spring:
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: 
        - id: user-service # 路由id,必须唯一。  用户服务
          uri: lb://userservice # 路由的目标地址,lb是负载均衡。 
          # uri: http://127.0.0.1/user/1   也可以使用这种,但是这种就固定了路由地址,就不能负载均衡了。
          predicates: # 路由断言,判断请求是否符合规则,符合就转发到目的路由。可以配置多个规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合。
       - id: order-service  # 订单服务
         uri: lb://orderservice
         predicates:
           - Path=/order/**

四.路由断言工厂(Route Predicate Factory)

官网示例

属性描述示例
After是某个时间点之后的请求-After=2023-01-01T17:42:47.789-07:00[America/Denver]
(必须在2023年1月1日17点42分47秒之后发的请求才能通过,根据美国丹佛[America/Denver]的时间算)
Before是某个时间点之前的请求-Before=2022-02-22T22:22:22.433+8:00[Asia/Shanghai]
(必须在2022年2月22日22时22分22秒之前发的请求才能通过,根据[Asia/Shanghai]上海时间算)
Between是某两个时间点之前的请求-Between=时间[时区],时间[时区]
Cookie请求必须包含某些cookie- Cookie=ikun, rap
Header请求必须包含某些header- Header=X-Request-Id,\d+
Host请求必须是访问某个host(域名)- Host=**.kunkun,**com.cn
Method请求方式必须是指定方式-Method=GETPOST
Path请求路径必须符合指定规则-path=user/**
Query请求参数必须包含指定参数Query=ikun
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

五.路由过滤器(属于GatewayFilter)

对进入网关的请求和微服务返回的响应做处理。比如:添加请求头。
官网示例

1.配置网关服务yml文件

路由过滤器:对当前路由生效。
server:
  port: 10086  #端口号
spring:
  application:
    name: gateway #服务名称
  cloud:
    gateway:
      routes: 
        - id: user-service # 路由id,必须唯一。  用户服务
          uri: lb://userservice # 路由的目标地址,lb是负载均衡。 
          # uri: http://127.0.0.1/user/1   也可以使用这种,但是这种就固定了路由地址,就不能负载均衡了。
          predicates: # 路由断言,判断请求是否符合规则,符合就转发到目的路由。可以配置多个规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合。
		  filters:
        	- AddRequestHeader=Ikun,ji ni tai mei!  # 添加请求头,针对某个服务生效。

2.在添加请求头的服务编写代码

	在用户服务的controller里面写
	/**
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,
                          @RequestHeader(value = "Ikun", required = false) String ikun) {
        System.out.println("Ikun最喜欢的歌是什么:" + ikun);
        return userService.queryById(id);
    }

然后访问 localhost:10086/user/1,控制台就会打印 ikun 的值。
在这里插入图片描述

六.DefaultFilter过滤器(属于GatewayFilter)

DefaultFilter:对所有路由都生效。
server:
  port: 10086  #端口号
spring:
  application:
    name: gateway #服务名称
  cloud:
    gateway:
      routes: 
        - id: user-service # 路由id,必须唯一。  用户服务
          uri: lb://userservice # 路由的目标地址,lb是负载均衡。 
          # uri: http://127.0.0.1/user/1   也可以使用这种,但是这种就固定了路由地址,就不能负载均衡了。
          predicates: # 路由断言,判断请求是否符合规则,符合就转发到目的路由。可以配置多个规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合。
	   default-filters:
        - AddRequestHeader=Ikun,ji ni tai mei!  #添加请求头,全局生效

七.全局过滤器(GlobalFilter)

对进入网关的请求和微服务返回的响应做处理。和GatewayFilter作用一样

因为GatewayFilter是基于配置实现,处理的逻辑是固定的,GlobalFilter基于代码逻辑实现,更加灵活一些,可以用于验证用户身份等功能。

1.实现GlobalFilter接口

验证身份信息,根据authorization的值是否是ikun
// @Order(-1) 注解方式实现,如果有多个过滤器,越小越早走。
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 ikun
        if ("ikun".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码,未登录
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求
        return exchange.getResponse().setComplete();
    }

	/**
	* 代码方式实现,实现 Ordered 接口,多个过滤器,返回值越小,越早走。
	**/
    @Override
    public int getOrder() {
        return -1;
    }
}

2.验证身份

(1) 如果authorization 参数不等于ikun或没有都会报错。
在这里插入图片描述

(2) authorization 参数等于 ikun正常访问。
在这里插入图片描述

八.过滤器执行顺序

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤链(集合)中,排序后依次执行每个过滤器**(DefaultFilter -> 路由过滤器 -> GlobalFilter)**。

1.为什么不是同一个过滤器可以放在一个过滤链中呢?由下面可得这三个过滤器本质上都是GatewayFilter

DefaultFilter 和 路由过滤器的实现都是 AddRequestHeaderGatewayFilterFactory 类,最后会生成一个真正的过滤器(GatewayFilter)。
在这里插入图片描述

GlobalFilter的实现是通过 GatewayFilterAdapter 适配器类实现了GatewayFilter,然后就可以把GlobalFilter适配成GatewayFilter
在这里插入图片描述

2.路由过滤器和DefaultFilter怎么设置@Order顺序呢?

由spring指定order,按声明顺序1开始递增。

在这里插入图片描述

扩展:

  • org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。
  • org.springframework.cloud.gateway.handler.FilteringlWebHandler#handle()方法会加载全局过滤器与前面的过滤器合并后根据order排序,组织过滤器链。

九.Gateway解决跨域问题

跨域: 浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。
解决: 采用CORS方案,网关处理跨域采用的同样是CORS方案。(简单来说就是浏览器询问服务端让不让这个请求跨域,如果让会返回结果)。

在yml文件配置以下内容
spring:
  cloud:
	gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题(浏览器去询问服务端的请求就是options)
        corsConfigurations:
          '[/**]':
            allowedOrigins:  # 允许哪些网站的跨域请求
              -"http://localhost:8888"
              -"http://www.ikun.com"
            allowedMethods: # 允许的跨域ajax的请求方式          
              -"GET"
			  -"POST"
		      -"DELETE"
			  -"PUT"
			  -"OPTIONS"
			allowedHeaders: "*" # 允许请求头跨域
			allowCredentials: true # 是否允许携带cookie
			maxAge: 360000 # 这次跨域检测的有效期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

socket编程-TCP各函数及其用法

socket编程-TCP socket主要类型 流套接字&#xff08;SOCK_STREAM&#xff09; 流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送&#xff0c;并按顺序接收。流套接字之所以能够实现可靠的数据服务&#xff0c;原因在于其使用了传输…

react框架基础入门

前端三大框架&#xff1a;angularvue —-2||3react区别&#xff1a;vue国内框架 封装较完成。全程使用封装的api来完成。react国外技术框架—-偏向于底层js实现。没有的大量的封装。需要使用js手动实现。react需求在不断增大。必会框架。官网https://react.docschina.org/ 中…

一文搞懂Linux时区设置、自定义时区文件

概念介绍 常说的 Linux 系统时钟有两个 一个是硬件时钟&#xff08;RTC&#xff09;&#xff0c;即BIOS时间&#xff0c;一般保存的是 GMT0 时间&#xff0c;没时区、夏令时的概念 一个是当地时钟&#xff08;LTC&#xff09;&#xff0c;即我们日常经常看到的时间&#xff0…

elasticsearch 分布式搜索引擎2

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一…

手把手带你玩转Linux

今天这篇文章带你走进Linux世界的同时,带你手把手玩转Linux,加深对Linux系统的认识。 一、搞好Linux工作必须得不断折腾,说白了,只是动手力量必须强。我在初学Linux的那片,家中三台计算机,我在上边总是反反复复的进行着重装、网络ghost、双系统安装等的尝试。有很长一段时间里,…

CSS 之 background-clip 和 background-origin 属性

一、background-clip&#xff08;背景的绘制区域&#xff09; 1、纯色背景 该属性规定了背景的绘制区域&#xff0c;属性值有三种&#xff1a;border-box&#xff08;覆盖到边框区域&#xff09;、padding-box&#xff08;覆盖到padding区域&#xff0c;不包含border&#xf…

数据库学习笔记(4)——SQL语言之DQL

复杂分组查询举例 子查询&#xff1a;把select查询结果当作数据使用时&#xff0c;这种结构就是子查询 子查询练习 -- 子查询练习&#xff1a;查询学生成绩在70分以上的学生学号和姓名 select stu_id as id, stu_name as 姓名 from tb_student where stu_id in (select cc_sid…

Forter 对支付服务商应对欺诈的四个建议和Gartner的两个关键结论

Gartner新版2023年度《线上欺诈检测市场指南》发布恰逢其时&#xff0d;企业正面临来自专业黑产和欺诈者与日俱增的压力。而在2023年&#xff0c;许多商户将调整反欺诈策略&#xff0c;对拒付率和转化率进行更严格的监测&#xff0c;以最大限度减少损失并增加营收。以下是Gartn…

工作记录:bi重构

2023.3.8&#xff0c;我在组内进行工作汇报。内容记录如下&#xff1a; 本次重构的特点 改动大影响后续开发 所以有必要进行工作汇报&#xff0c;让组内同事了解代码的改动与现状。 为什么要重构代码&#xff1f; 正在开发的数据报告模块包含大量 widget 功能&#xff0c;…

量子计算(8)pyqpanda编程3测量操作

作为一名高产博主&#xff0c;小编我一天不写文章就浑身难受&#xff0c;这不&#xff0c;一闲下来就来给大家科普量子计算编程操作了。 今天我们要来探讨“测量操作”&#xff0c;众所周知&#xff0c;薛定谔的猫是一种既死又活的状态&#xff0c;很多人认为&#xff0c;猫是死…

数据分析介绍,让你更了解数据分析

同学们好&#xff01; 第一次接触互联网行业吗&#xff1f;没有关系&#xff0c;看完这篇介绍让你了解到底什么是数据分析&#xff1f;并对它强大的功能所吸引。希望你能耐心的看完&#xff0c;了解更多的行业信息&#xff01; 1、是不是不知道什么是数据分析&#xff1f; 定…

14.卷积神经网络中的不变性

欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 文章目录1.问题介绍2.DCNN的Invariance3.后记参考资料1.问题介绍 最近看的2015年前后的几篇语义分割网络中反复提到了一个点,深度卷积神经网络的内置不变性。 2014年11月发表的Fully Conv…

线程池的线程是如何复用的

前言 进程和线程的关系相信大家都知道&#xff0c;这里我就不做过多的解释了&#xff0c;既然一个进程是由多个线程组成的&#xff0c;那么线程池又是由若干个线程队列组成的&#xff0c;在并发量比较高的情景下&#xff0c;我们通常会去创建线程池就执行任务&#xff0c;而不…

CentOS 8 桌面版右上角网络图标消失的解决办法及查看虚拟机ip地址没有ens项

抄录与小李行 我们在手动修改网络连接的配置文件后&#xff0c;桌面右上角的网络连接图标可能会消失。 正常显示的网络图标&#xff1a; 网络图标消失后的样子&#xff1a; CentOS 的网络连接由网络管理工具 NetworkManager 负责&#xff0c; 这个问题多半与其有关。 可能的…

BC双驱、ChatGPT大火,AI独角兽撬开盈利大门?

配图来自Canva可画 放眼AI行业&#xff0c;各大AI玩家长期亏损、“钱”景堪忧。 回看过去一年&#xff0c;部分AI独角兽的亏损问题愈发尖锐——云从科技2022年净亏损同比扩大至8.5亿元&#xff1b;寒武纪2022年净亏损11.6亿元&#xff0c;较上年同期扩大41.4%&#xff1b;地平…

ZooKeeper命令及JavaAPI操作

ZooKeeper数据模型 ZooKeeper是一个树形目录服务&#xff0c;其数据模型和Uiix的文件目录树很类似&#xff0c;拥有一个层次化结构。这里面的每一个节点都被称为&#xff1a;ZNode&#xff0c;每个节点上都会保存自己的数据和节点信息。节点可以拥有子节点&#xff0c;同时也允…

数据链路层及交换机工作原理

目录 一&#xff0c;帧格式 1.1 帧头类型字段的作用 1.2 MAC地址 1.3 MTU值 二&#xff0c;交换机工作原理 2.1 交换机的端口 2.2 端口状态 三&#xff0c;交换机基本工作模式及命令 3.1 交换机的工作模式&#xff1a; 3.2 命令 一&#xff0c;帧格式 其中类型是指&am…

Linux: 向内核提交补丁

文章目录1. 前言2. 提交内核补丁的步骤2.1 从代码仓库下载内核源码2.2 建立本地分支 linux-next_master2.3 制作一个补丁2.4 提交补丁2.4.1 配置发送邮箱2.4.2 配置 git send-email2.4.3 发送补丁1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读…

汽车制造商与IT公司之间的技术合作案例

如果您对最新汽车技术感兴趣的话,您可能经常听到汽车制造商和IT公司正在合作开发技术的消息。汽车生产商为何自身不进行技术开发,而是与IT企业合作呢?因为最近随着以IT技术为基础的电动汽车等环保汽车或无人驾驶汽车等的登场和发展,汽车制造商单独进行技术开发需要花费很多时间…

零死角玩转stm32初级篇6-中断

本篇博文目录:一.中断相关概念知识1.STM32 的中断和异常2.NVIC 中断控制器3.NVIC 结构体成员4.抢占优先级和响应优先级5.NVIC 的优先级组6.EXTI 外部中断7.中断服务函数二.按键点灯的二种实现方式1.按键和LED的原理图以及各种输入模式(浮空输入,上拉输入,下拉输入和模拟输入)2.…