Gateway--服务网关

ops/2024/9/23 6:33:58/

网关简介

大家都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。
在这里插入图片描述
这样的架构,会存在着诸多的问题:

  • 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
  • 认证复杂,每个服务都需要独立认证。
  • 存在跨域请求,在一定场景下处理相对复杂。

上面的这些问题可以借助API网关来解决。

所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。 添加上API网关之后,系统的架构图变成了如下所示:
在这里插入图片描述

Gateway快速入门

要求: 通过浏览器访问api网关,然后通过网关将请求转发到商品微服务

第1步:创建一个api-gateway 的模块,导入相关依赖

<dependencies><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.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--限流--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId></dependency></dependencies>

第2步: 创建主类

java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class);}
}

第3步: 添加配置文件

server:port: 7000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: localhost:8848 # 将gateway注册到nacosgateway:discovery:locator:enabled: true # 让gateway从nacos中获取服务信息

第4步:启动项目,并通过网关去访问微服务
localhost:7000/service-product/product/1

解释:

  • localhost:7000 网关服务地址
  • service-product 微服务name
  • product/1 接口地址

这时候,就发现只要按照网关地址/微服务/接口的格式去访问,就可以得到成功响应。

自定义全局过滤器(鉴权)

java">import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.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;//自定义全局过滤器(作用: 统一鉴权)需要实现GlobalFilter和Ordered接口
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {//完成判断逻辑@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (!StringUtils.equals(token, "admin")) {log.info("鉴权失败");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//调用chain.filter继续向下游执行return chain.filter(exchange);}//顺序,数值越小,优先级越高@Overridepublic int getOrder() {return 0;}
}

不加token认证不通过,返回401
在这里插入图片描述
加token=admin认证通过
在这里插入图片描述


http://www.ppmy.cn/ops/113930.html

相关文章

【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解

文章目录 C类与对象超详细入门指南前言1. 初始化列表——再谈构造函数1.1 初始化成员变量的方式1.1.1 构造函数内部赋值 vs 初始化列表1.1.2 两者的区别1.1.3 为什么要使用初始化列表1.1.4 示例 1.2 初始化列表的语法1.2.1 示例&#xff1a; 1.3 引用成员变量、const成员变量的…

JavaScript发送邮件:实现前端触发的教程?

JavaScript发送邮件的方式&#xff1f;怎么使用JavaScript发信&#xff1f; 无论是用户反馈、联系表单还是自动通知&#xff0c;前端触发的邮件发送功能都能极大地提升用户体验。AokSend将详细介绍如何通过JavaScript发送邮件&#xff0c;实现前端触发的邮件发送功能。 JavaS…

学习笔记——RegNet:Designing Network Design Spaces

RegNet&#xff1a;Designing Network Design Spaces RegNet&#xff1a;设计一个网络设计空间 论文地址&#xff1a; https://arxiv.org/pdf/2003.13678 1、前言 在这项工作中&#xff0c;作者提出了一种新的网络设计范例。 作者的目标是帮助增进对网络设计的理解并发现跨设置…

【d45】【Java】【力扣】203.移除链表元素

思路 由于删除操作&#xff0c;需要&#xff1a;pre.nextcur.next 但是单链表无法获得 前面节点&#xff0c; 所以&#xff1a;定义指针 cur 指向当前节点&#xff0c;判断cur.next 的val值&#xff0c;是否等于传入的val值 cur &#xff1a;从head 到倒数第二个 最后单独…

Vue3 Day1Day2-Vue3优势ref、reactive函数

Day1 1.1 Vue3的优势 更容易维护 组合式API 更好的TypeScript支持 更快的速度 重写diff算法 模板编译优化 更高效的组件初始化 更小的体积 良好的TreeShaking 按需引入 更优的数据响应式 Proxy setup中不存在this&#xff0c;如果想直接获取节点&#xff0c;就得放在o…

大模型爬虫—ScrapeGraphAI

大模型爬虫—ScrapeGraphAI 一、介绍 ScrapeGraphAI是一个网络爬虫 Python 库,使用大型语言模型和直接图逻辑为网站和本地文档(XML,HTML,JSON 等)创建爬取管道。 只需告诉库您想提取哪些信息,它将为您完成! scrapegraphai有三种主要的爬取管道可用于从网站(或本地文…

数字英文验证码识别 API 对接说明

数字英文验证码识别 API 对接说明 本文将介绍一种 数字英文验证码识别 API 对接说明&#xff0c;它是基于深度学习技术&#xff0c;可用于识别变长英文数字验证码。输入验证码图像的内容&#xff0c;输出验证码结果。 接下来介绍下 数字英文验证码识别 API 的对接说明。 注册…

谷粒商城のElasticsearch

文章目录 前言一、前置知识1、Elasticsearch 的结构2、倒排索引 (Inverted Index)2.1、 索引阶段2.2、查询阶段 二、环境准备1、安装Es2、安装Kibana3、安装 ik 分词器 三、项目整合1、引入依赖2、整合业务2.1、创建索引、文档、构建查询语句2.2、整合业务代码 后记 前言 本篇介…