SpringCloud从入门到精通(七)

news2024/10/6 10:37:00

Gateway


Gateway-概述

  • 网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
  • 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求。
  • 存在的问题
1. 客户端多次请求不同的微服务,增加客户端的复杂性
2. 认证复杂,每个服务都要进行认证
3.http 请求不同服务次数增加,性能不高
  • 网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能
  • 无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发
  • 在目前的网关解决方案里,有Nginx+ LuaNetflix Zuul Spring Cloud Gateway等等


Gateway-快速入门

1.创建 api-gateway-server 模块
2. 引入依赖: starter-gateway
<dependencies>
  <!--引入gateway 网关-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
  </dependency>
  <!-- eureka-client -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
</dependencies>
3. 编写启动类
@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApp {
  public static void main(String[] args) {
    SpringApplication.run(ApiGatewayApp.class,args);
  }
}
4. 编写配置文件
application.yml
server:
  port: 80

spring:
  application:
    name: api-gateway-server
cloud:
# 网关配置
  gateway:
    # 路由配置:转发规则
    routes: #集合。
    # id: 唯一标识。默认是一个UUID
    # uri: 转发路径
    # predicates: 条件,用于请求网关路径的匹配规则
    - id: gateway-provider
      uri: http://localhost:8001/
      predicates:
      - Path=/goods/**

5.测试发现我们不用直接访问8001的业务端口,而是通过访问80的gateway服务就可以实现请求分发

上面我们写的application.yml 中的 uri 是写死的,这属于静态路由

Gateway-实现动态路由

启动类添加 @EnableEurekaClient (新版本不加也可以)
@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApp {
  public static void main(String[] args) {
    SpringApplication.run(ApiGatewayApp.class,args);
  }
}
application.yml 中修改 uri 属性: uri: lb:// 服务名称
server:
  port: 80
spring:
  application:
    name: api-gateway-server
  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则
      # filters:配置局部过滤器的
      - id: gateway-provider
      # 静态路由
      # uri: http://localhost:8001/
      # 动态路由
      uri: lb://GATEWAY-PROVIDER
      predicates:
      - Path=/goods/**

Gateway-微服务名称配置

application.yml 中配置微服务名称配置
想要实现动态路由的前提就是我们的微服务和gateway服务都已经被注册的注册中心去,微服务开启了客户端被发现的功能。
# 微服务名称配置
discovery:
  locator:
    enabled: true # 设置为true 请求路径前可以添加微服务名称
    lower-case-service-id: true # 允许为小写

Gateway-过滤器

过滤器 - 概述
Gateway 支持过滤器功能,对请求或响应进行拦截,完成一些通用操作。
Gateway 提供两种过滤器方式: “pre” “post”
        pre 过滤器:在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等。
        post 过滤器:在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等。
Gateway 还提供了两种类型过滤器
        GatewayFilter:局部过滤器,针对单个路由
        GlobalFilter :全局过滤器,针对所有路由

局部过滤器
GatewayFilter 局部过滤器,是针对单个路由的过滤器。 在Spring Cloud Gateway 组件中提供了大量内置的局部过滤器,对请求和响应做过滤操作。
遵循约定大于配置的思想,只需要在配置文件配置局部过滤器名称,并为其指定对应的值,就可以让其生效。
测试配置
api-gateway-server application.yml
server:
  port: 80

spring:
  application:
    name: api-gateway-server
  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则
      # filters:配置局部过滤器的
      - id: gateway-provider
      # 静态路由
      # uri: http://localhost:8001/
      # 动态路由
      uri: lb://GATEWAY-PROVIDER
      predicates:
      - Path=/goods/**
      filters:
      - AddRequestParameter=username,zhangsan
gateway-provider 模块中 GoodsController 中的 findOne 添加 username 参数
public Goods findOne(@PathVariable("id") int id,String username){
  System.out.println(username);
  //如果id == 1 ,则出现异常,id != 1 则正常访问
  if(id == 1){
    //1.造个异常
    int i = 3/0;
  }
  /*try {
    //2. 休眠2秒
    Thread.sleep(2000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }*/
  Goods goods = goodsService.findOne(id);
  goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
  return goods;
}
全局过滤器
GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。 Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。
自定义全局过滤器步骤:
1. 定义类实现 GlobalFilter Ordered 接口
2. 复写方法
3. 完成逻辑处理

代码实现

MyFilter
@Component
public class MyFilter implements GlobalFilter, Ordered {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChainchain) {
    System.out.println("自定义全局过滤器执行了~~~");
    return chain.filter(exchange);//放行
  }
  /**
  * 过滤器排序
  * @return 数值越小 越先执行
  */
  @Override
  public int getOrder() {
    return 0;
  }
}

通过feign调用spring cloud gateway代理的服务

 工程结构

api-gateway-server 80 端口
eureka-server-gateway 8761 端口
gateway-consumer 9000 端口
gateway-provider 8001 端口

配置 consumer 通过 gateway 调用 provider
修改feign接口上FeignClient注解的value值为api-gateway-server的应用名称
@FeignClient(value = "api-gateway-server",fallback =
GoodsFeignClientFallback.class)
public interface GoodsFeignClient {
  @GetMapping("/goods/findOne/{id}")
  public Goods findGoodsById(@PathVariable("id") int id);
}

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

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

相关文章

【C++】优先级队列、仿函数和反向迭代器

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;priority…

工具及方法 - 字幕下载网站

1&#xff0c;射手网&#xff08;伪&#xff09; 首页 - 射手网(伪) - assrt.net - 字幕下载&#xff0c;字幕组&#xff0c;中文字幕&#xff0c;美剧字幕&#xff0c;英剧字幕&#xff0c;双语字幕&#xff0c;新番字幕 2&#xff0c;国外网站。 Subscene - Passionate abo…

sentinel-热点参数限流

Pages 60 Sentinel 官方网站 OpenSergo 微服务治理 文档 Read Me新手指南Sentinel 介绍FAQRoadmap如何使用工作原理流量控制集群流控&#xff08;分布式流控&#xff09;网关流控熔断降级热点参数限流系统自适应限流黑白名单控制实时监控数据动态规则控制台生产环境使用 Sent…

【自学Python】Python IDLE使用

Python IDLE使用 Python IDLE使用教程 在 Windows 上安装好 Python 之后&#xff0c;Python 都会提供一个 Python 命令行工具&#xff0c;就叫 IDLE。IDLE 是一个 Python Shell&#xff0c;Python Shell 可以用于与 Python 进行交互。 Python IDLE使用 打开Python IDLE 首…

分布式基础篇4 —— 基础篇完结(谷粒商城)

分类维护一、三级分类后端实现准备工作跨域问题关闭 ESLint 检查前端实现二、分类删除前端完善分类列表后端实现——删除配置发送请求代码片段前端实现——删除三、分类增加前端实现四、分类修改五、拖拽菜单拖拽效果实现拖拽数据收集拖拽功能完成拖拽功能完善六、批量删除品牌…

粒子系统-常用子模块

目录 Emission &#xff08;发射&#xff09; Shape &#xff08;形状&#xff09; Cone &#xff08;锥形&#xff09; Velocity over Lifetime &#xff08;运动&#xff09; Limit Velocity over Lifetime (速度限制) Force over lifetime (受力) Color over Lifetim…

【C语言航路】第十站:指针进阶(二)

目录 六、函数指针数组 七、指向函数指针数组的指针 八、回调函数 1.回调函数的概念 2.回调函数实现计算器 3.回调函数实现冒泡排序 总结 六、函数指针数组 我们已经知道了函数指针&#xff0c;它的类型是int(*)(int,int)。那么我们能否进行推广呢&#xff1f;将其推广成…

基于AD Event日志实时检测DSRM后门

01、简介每个域控制器都有一个目录还原模式&#xff08;DSRM&#xff09;帐户&#xff0c;它的密码是在安装域控时设置的&#xff0c;实际上它对应的就是sam文件里的本地管理员“administrator”&#xff0c;基本很少会被重置&#xff0c;因此有着极强的隐蔽性。攻击者通过获取…

面试篇之NoSQL

面试篇之NoSQL一、redis持久化1.1、字节1.2、微软1.3、题解1.3.1、RDB快照1.3.2、AOF日志1.3.3、最佳实践二、redis删除策略2.1、字节2.2、阿里云2.3、题解2.3.1、过期删除2.3.2、内存淘汰2.3.3、LRU2.3.4、LFU三、redis高可用3.1、字节3.2、美团3.3、微软3.4、题解3.4.1、主从…

前端性能优化(六):传输加载优化

目录 一&#xff1a;启用压缩 Gzip 二&#xff1a;启用 Keep Alive 三&#xff1a;HTTP 资源缓存 3.1.HTTP 缓存方案 3.2.各大网站缓存策略参考 四&#xff1a;Service Worker 五&#xff1a;HTTP2 的性能提升 5.1.HTTP2 优势 5.2.开启 HTTP2 5.3.Server Push&#x…

【Spring(五)】带你深入了解bean的生命周期

1.5 bean的生命周期 bean的实例化已经说完了&#xff0c;我们最后再来讲讲bean的生命周期。 我们主要来围绕着bean生命周期控制来学习&#xff0c;那么什么是生命周期呢&#xff1f;其实就是一个东西从创建到消亡的完整过程&#xff0c;比如人从出生到死亡的整个过程&#xff…

【MySQL进阶】深入理解redoLog日志

【MySQL进阶】深入理解redoLog日志 文章目录【MySQL进阶】深入理解redoLog日志一&#xff1a;redo日志概述二&#xff1a;redo日志格式三&#xff1a;Mini-Transaction1&#xff1a;以组的形式写入redo日志2&#xff1a;Mini-Transaction的概念四&#xff1a;redo日志的写入过程…

富淼转债,优彩转债上市价格预测

富淼转债基本信息转债名称&#xff1a;富淼转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;4.5亿元。正股名称&#xff1a;富淼科技&#xff0c;今日收盘价&#xff1a;18.25&#xff0c;转股价格&#xff1a;20.26。当前转股价值 转债面值 / 转股价格 * …

(3分钟速览)SLAM中的三大金刚-H E F Matrix

编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;三个矩阵的自由度&#xff1a;单应矩阵H 自由度8基础矩阵F 自由度7本质矩阵E 自由度5或者8&#xff0c;这个是根据使用旋转矩阵还是旋转向量编辑切换为居中添加图片注释&#xff0c;不超过 14…

每日一题之Vue的异步更新实现原理是怎样的?

最近面试总是会被问到这么一个问题&#xff1a;在使用vue的时候&#xff0c;将for循环中声明的变量i从1增加到100&#xff0c;然后将i展示到页面上&#xff0c;页面上的i是从1跳到100&#xff0c;还是会怎样&#xff1f;答案当然是只会显示100&#xff0c;并不会有跳转的过程。…

计算机基础——计算机应用领域以及未来发展趋势

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.计算机应用领域 1.信息管理 2.过程控制 3.计算机辅助技术 1&#xff09…

一天天过去,每天该如何过?

刚跨了年&#xff0c;又快到春节&#xff0c;日子就这样一天天过去。如何过好这一生是个大命题&#xff0c;不如简化点考虑下如何过好一天&#xff1f;人的时间大体分为两类&#xff1a;主动的&#xff0c;可以自由支配&#xff1b;被动的&#xff0c;等着被安排。过去我在互联…

MCU-51:LCD1602详解

目录一、LCD1602简介1.1 显示原理1.2 引脚及应用电路1.3 技术参数1.4 引脚功能1.5 指令集1.6 连接方式二、时序图2.1 写时序2.2 读时序三、代码演示3.1 LCD1602.c3.2 示例注意&#xff1a;一定要看一、LCD1602简介 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶…

能量加油站Java上

1、final 在 Java 中有什么作用&#xff1f; 1、final 修饰的类叫最终类&#xff0c;该类不能被继承。2、final 修饰的方法不能被重写3、final 修饰的变量叫常量&#xff0c;常量必须初始化&#xff0c;初始化之后值就不能被修改 2、Math.round() 指向上取整 补充 Double.do…

01背包问题再探

原题&#xff1a; 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整…