统一服务入口-Gateway(一)

news2024/9/28 7:27:48

目录

1.网关介绍

1.1含有问题

1.2什么是API网关

网关核心功能:

2.Spring Cloud Gateway

2.1什么是Spring Cloud Gateway

2.2快速上手

2.2.1创建网关项目

2.2.2引入网关依赖

2.2.3添加Gateway的路由配置

2.2.4测试

2.3Predicate

2.3.1Predicate的其他写法

2.3.2Predicate的其他方法

2.4Route Predicate Factories

2.4.1代码演示


1.网关介绍

1.1含有问题

当前所有微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性,服务端实现的微服务接口通常都带有一定的权限校验机制,由于使用了微服务,原本一个应用的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,我们需要修改多个应用,加重开发人员的负担

针对以上问题,一个常用的解决方案是API网关

比如企业管理
外部人员去公司办理业务,公司需要先核实对方的身份再去进行办理. 最开始只有一个员工,这个员工核实之后直接办理即可.(单体架构)

随着公司的发展,划分了多个部门,每个部门负责的事情不同,每个部门都需要先核实对方的身份再进行办理.(微服务架构)
 这个流程存在一些问题:
 1.办事效率低
 2.增加了员工的工作流程
我们对此进行改进,设立前台,统一由前台来进行身份的校验,前台身份校验通过后,其他部门就设置信任,直接办理.

1.2什么是API网关

API网关(简称网关)也是一个服务,通常是后端服务的唯一入口.

它的定义类似设计模式中的Facade模式 (门面模式,也称外观模式).它就类似整个微服务架构的门面,所有的外部客户端访问,都需要经过它来进行调度和过滤.

网关核心功能:

权限控制:作为微服务的入口,对用户进行权限校验,如果校验失败则进行拦截

动态路由:一切请求先经过网关,网关不处理业务,而是根据某种规则,把请求转发到某个微服务

负载均衡:当路由的目标服务有多个时,还需要做负载均衡

限流:请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大.

2.Spring Cloud Gateway

2.1什么是Spring Cloud Gateway

Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,基于Spring+SpringBoot等技术 开发,目的是为了替换掉Zuul.旨在为微服务架构提供一种简单而有效的途径来转发请求,并为他们提供横切关注点,比如:安全性,监控/指标和弹性.

在性能方面,根据官方提供的测试报告,SpringCloud Gateway的RPS(每秒请求数)是Zuul的1.6倍.

2.2快速上手

2.2.1创建网关项目

2.2.2引入网关依赖

 <!--⽹关-->
 <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>
 <!--负载均衡-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 </dependency>

2.2.3添加Gateway的路由配置

创建application.yml文件,添加如下配置:

server:
  port: 10030
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 110.41.51.65:10020
    gateway:
      metrics:
        enabled: true
      routes:
        - id: order-service   #路由规则id, 随便起, 不重复即可
          uri: lb://product-service/ #目标服务地址
          predicates:   #路由条件
            - Path=/order/**,/feign/**,/product/**
            - After=2024-03-20T00:00:22.370856700+08:00[Asia/Shanghai]

配置字段说明:

  • id:自定义路由ID,保持唯一
  • uri:目标服务地址,支持普通URI及lb://应用注册服务名称.lb表示负载均衡,使用lb://方式表示从注册中心获取服务地址.
  • predicates:路由条件,根据匹配结果决定是否执行该请求路由,上述代码中,我们把符合Path规则的一切请求,都代理到uri参数指定的地址.

2.2.4测试

启动API网关服务

1.通过网关服务访问product-service

url符合yml文件中配置的/product/**规则,

路由转发到product-service:http://product-service/product/1001

访问时,观察网关日志,可以看到网关服务从Nacos时获取服务列表

2.3Predicate

Predicate是Java 8提供的一个函数式编程接口,它回收一个参数并返回一个布尔值,用于条件过滤,请求参数的校验

 @FunctionalInterface
 public interface Predicate<T> {
      boolean test(T t);
      //...
 }

代码演示:

1.定义一个Predicate

 class StringPredicate implements Predicate<String>{
     @Override
     public boolean test(String str) {
         return str.isEmpty();
     }
 }

2.使用这个Predicate

 public class PredictTest {
     public static void main(String[] args) {
         Predicate<String> predicate = new StringPredicate();
         System.out.println(predicate.test(""));//true
         System.out.println(predicate.test("666"));//false
     }
 }

2.3.1Predicate的其他写法

1.内置函数

 public class PredictTest {
     public static void main(String[] args) {
         Predicate<String> predicate = new Predicate<String>(){
             @Override
             public boolean test(String s) {
                 return s.isEmpty();
             }
         };
         System.out.println(predicate.test(""));
         System.out.println(predicate.test("666"));
     }
 }

2.lambda写法

public class PredictTest {
    public static void main(String[] args) {
        Predicate<String> predicate = s -> s.isEmpty();
        System.out.println(predicate.test(""));
        System.out.println(predicate.test("bite666"));
    }
}

Predicate<String>predicate =s ->s.isEmpty();

也可以写成 Predicate<String>isEmpty =String::isEmpty;

2.3.2Predicate的其他方法

  • isEqual(Object targetRef):比较两个对象是否相等,参数可以为Null
  • and(Predicate other):短路与操作,返回一个组成Predicate
  • or(Predicate other):短路或操作,返回一个组成Predicate
  • test(T t):传入一个Predicate参数,用来做判断
  • negate():返回表示此Predicate逻辑否定的Predicate

2.4Route Predicate Factories

Route Predicate Factories(路由断言工厂,也称为路由谓词工厂,此处谓词表示一个函数),在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制.

我们在配置文件中写的断言规则只是字符串,这些字符串会被Route Predicate Factory读取并处理,转变为路由判断的条件.

比如前面章节配置的Path=/product/**,就是通过Path属性来匹配URL前缀是/product的 请求.

这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory来实现的.

Spring Cloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请 求的不同属性,并且多个Predicate可以通过and逻辑进行组合.

2.4.1代码演示

1.添加Predicate规则

在application.yml中添加如下规则

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: b460e95c-d4b9-42a3-810f-cdf0051ce008
    gateway:
      metrics:
        enabled: true
      routes:
        - id: order-service   #路由规则id, 随便起, 不重复即可
          uri: lb://product-service/ #目标服务地址
          predicates:   #路由条件
            - Path=/product/**
            - After=2025-01-01T00:00:00.000+08:00[Asia/Shanghai]

添加限制规则:请求时间为2025年1月1日后

2.测试

访问:http://127.0.0.1:10030/product/1001

3.修改时间为2024-01-01,再次访问

- After=2024-01-01T00:00:00.000+08:00[Asia/Shanghai]

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

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

相关文章

[数据集][目标检测]电力场景红外图像输电线路绝缘子检测数据集VOC+YOLO格式1846张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1846 标注数量(xml文件个数)&#xff1a;1846 标注数量(txt文件个数)&#xff1a;1846 标注…

《大模型应用开发极简入门》-当有了一个大模型,你需要知道的几件事情

从某种意义上来说&#xff0c;大模型&#xff08;LLM-Large language model&#xff09;也是一个任人打扮的小姑娘&#xff0c;你可以对她进行课程教学&#xff08;即微调&#xff09;、可以告诉她一些问题的应对办法&#xff08;即提示工程&#xff09;、还可以带上一部计算器…

(2024,ReLU-Transformer,样条,Veronese 映射,Pierce–Birkhoff 猜想)注意力机制是平滑的三次样条

Attention is a smoothed cubic spline 目录 0. 摘要和简介 0.1. 通过样条理解 Transformer 1. Transformer 的数学描述 1.9. ReLU-Transformer 2. 样条&#xff08;Spline&#xff09; 2.1. 标量值样条 2.2. 向量值样条 2.3. 矩阵值样条 2.4. Pierce–Birkhoff 猜想…

大杂烩!注意力机制+时空特征融合!组合模型集成学习预测!CNN-LSTM-Attention-Adaboost多变量负荷预测

大杂烩&#xff01;注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;CNN-LSTM-Attention-Adaboost多变量负荷预测 目录 大杂烩&#xff01;注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;CNN-LSTM-Attention-Adaboost多变量负荷预测…

AI大模型开发——7.百度千帆大模型调用

本节旨在为读者提供一个实用指南&#xff0c;探讨如何有效地利用百度千帆大模型平台的强大功能。从基础的账号注册和密钥申请入手&#xff0c;逐步引领用户通过案例&#xff0c; 理解并掌握如何调用文本和图像处理的大模型 API&#xff0c; 包括但不限于 NLP、对话生成、文本续…

linux中对.jar文件的配置文件进行修改

linux中对.jar文件的配置文件进行修改 第一步&#xff0c;进入你的.jar的当前文件夹 第二步 &#xff0c;编辑你指定的 .jar 文件 编辑之前请先备份 cp xxx.jar xxx-1.2.jar 输入编辑命令 vim xxx.jar第三步&#xff0c;找到你要编辑的文件 输入命令进入vi模式&#xff08;…

Python(TensorFlow)多模光纤光束算法和GPU并行模拟

&#x1f3af;要点 &#x1f3af;多模光纤包含光学系统线性和非线性部分 | &#x1f3af;单变量线性回归、多变量线性回归、人脸图像年龄预测、音频语音分类和 X 射线图像评估算法 | &#x1f3af;在空间光调制器记录海螺参数矩阵&#xff0c;光束算法多变量预测年龄 | &#…

pytorch训练后pt模型中保存内容详解(yolov8n.pt为例)

在 PyTorch 中&#xff0c;.pt 模型文件通常包含以下几类数据&#xff1a; 模型参数&#xff1a; 存储模型的权重和偏置参数。 优化器状态&#xff1a; 包含优化器的状态信息&#xff0c;以便在恢复训练时能够从中断的地方继续。 训练状态&#xff1a; 一些训练过程中的信息&am…

SpringBoot的自动配置原理探究

目录 什么是SpringBoot的自动配置&#xff08;Auto-Configuration&#xff09; 举例&#xff1a;SpringBoot自动配置&#xff08;Redis的自动配置&#xff09;的实例&#xff1a; 步骤1.&#xff1a;引入Redis启动器pom依赖 步骤2.在application.yml或者&#xff08;proper…

火狐浏览器应用商店不支持下载

前言 之前手机一直用的火狐浏览器&#xff0c;现在换了新的手机&#xff0c;又想下载使用&#xff0c;从官网直接下载现在直接跳载到Google Play才能下载&#xff0c;但是国内又用不了的&#xff0c;这里就记录一下怎么在手机应用商店不支持情况下载。 从FTP服务器下载Beta版…

C++学习笔记----4、用C++进行程序设计(四)---- 复合关系与继承关系之间的细线

在现实世界只是很容易区分对象之间是复合关系还是继承关系。没有人会说桔子有一个水果--而只能是桔子是一种水果。但是&#xff0c;在代码中&#xff0c;有时候就不是那么清晰了。 设想有一个代表关联数组的假想类&#xff0c;将一个键影射到一个值的数据结构。例如&#xff0c…

python画图高斯平滑均值曲线

注:细线是具体值,粗线是高斯平滑处理后的均值曲线 #codinggbk import matplotlib.pyplot as plt import numpy as np from scipy.ndimage import gaussian_filter1d# 生成一些示例数据 np.random.seed(0) timesteps np.linspace(1000, 0, 1000) data 0.4 0.2 * np.random.r…

并查集(路径压缩、按秩合并、按大小合并)

文章目录 并查集简单介绍&#xff1a;初始化&#xff1a;如何查找&#xff1f;如何合并&#xff1f;优化如下&#xff1a;路径压缩&#xff1a;代码&#xff1a; 按秩合并&#xff1a;**代码&#xff1a;** 启发式合并&#xff08;按大小合并&#xff09;&#xff1a;代码: 例题…

E5063A-011 时域分析/测试向导程序

矢量网络分析 E5063A 选件 011 E5063A-011 时域分析/测试向导程序 不容错过&#xff01; 概述 Keysight E5063A ENA 系列 PCB 分析仪是较佳的 PCB 生产测试解决方案&#xff0c;可提供阻抗&#xff08;TDR&#xff09;和回波损耗&#xff08;S 参数&#xff09;测量能力。…

11091 最优自然数分解问题(优先做)

### 简短思路 #### 问题&#xff08;1&#xff09;&#xff1a;将n分解为若干个互不相同的自然数之和&#xff0c;且使这些自然数的乘积最大 1. 对于n < 4的情况&#xff0c;直接返回特定值。 2. 对于n > 4的情况&#xff0c;使用贪心策略&#xff0c;将n分解为从2开始的…

证书学习(一)keytool 工具使用介绍

目录 一、keytool 简介1.1 什么是 keytool&#xff1f;1.2 主要功能&#xff1a;1.3 使用场景1.4 常用命令1.5 默认参数 二、keytool 用法说明2.1 基本使用2.2 创建密钥库和密钥条目2.3 查看密钥库信息2.4 导出密钥库条目证书2.5 导入信任证书到密钥库2.6 打印证书内容2.7 删除…

零工市场小程序应该有什么功能?

数字经济现如今正飞速发展&#xff0c;零工市场小程序在连接雇主与自由职业者方面发挥着越来越重要的作用。一个高效的零工市场小程序不仅需要具备基础的信息发布与匹配功能&#xff0c;还应该涵盖交易管理、安全保障以及个性化服务等多个方面。 那么&#xff0c;零工市场小程…

为什么企业跨国组网建议用SD-WAN?

SD-WAN成为企业跨国组网的首选方案&#xff0c;主要因为它在灵活性、智能化管理以及数据安全等方面具备显著优势。在企业进行跨国组网时&#xff0c;往往会面临网络连接复杂、流量管理难度大以及数据安全等诸多挑战&#xff0c;而SD-WAN能够有效应对这些难题。 首先&#xff0c…

Docker续1:

一、打包传输 1.打包 [rootlocalhost ~]# systemctl start docker [rootlocalhost ~]# docker save -o centos.tar centos:latest [rootlocalhost ~]# ls anaconda-ks.cfg centos.tar 2.传输 [rootlocalhost ~]# scp centos.tar root192.168.1.100:/root 3.删除镜像 [r…

场外个股期权杠杆率是多少如何计算倍数?

今天带你了解场外个股期权杠杆率是多少如何计算倍数&#xff1f;场外个股期权的杠杆大小不是固定的&#xff0c;而是取决于期权合约的价值和标的资产的价值之间的比例&#xff0c;一般来说场外个股期权的杠杆率大概在5-30倍甚至更高左右。 场外个股期权杠杆率是多少&#xff1…