微服务学习:Gateway服务网关

news2024/9/22 23:25:43

一,Gateway服务网关的作用:

  1. 路由请求:Gateway服务网关可以根据请求的URL或其他标识符将请求路由到特定的微服务。

  2. 负载均衡:Gateway服务网关可以通过负载均衡算法分配请求到多个实例中,从而平衡各个微服务的负载压力。

  3. 安全认证:Gateway服务网关可以提供安全认证功能,例如对请求进行身份验证、授权等,保障系统的安全性。

  4. 限流熔断:Gateway服务网关可以对请求进行限流和熔断处理,防止系统因为突发的大量请求而崩溃。

  5. 日志记录:Gateway服务网关可以对请求进行日志记录,方便系统管理员进行监控和调试。

  6. 缓存处理:Gateway服务网关可以对请求进行缓存处理,减少微服务的响应时间和网络延迟。

 二,Gateway服务网关快速使用:

1.创建服务(子模块)

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>

3.编写启动类

GatewayApplication.java

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

4.创建配置文件application.yml

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: userservice # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
  • server部分定义了网关的端口号为10010,即监听在该端口上接收外部请求。

  • spring部分指定了应用的名称为"gateway",方便在注册中心或其他组件中标识和查找该服务。

  • spring.cloud.nacos部分配置了Nacos注册中心的地址为localhost:8848,用于服务的注册和发现。

  • spring.cloud.gateway.routes部分是网关的路由配置,包括多个路由规则。在这个示例中,只配置了一个路由规则。

    • id字段是路由的唯一标识,可以自定义,用于区分不同的路由。

    • uri字段指定了路由的目标地址。在这个示例中,使用了负载均衡的方式,通过lb://userservice指向名为"userservice"的微服务,其中lb表示负载均衡。

    • predicates字段定义了路由断言,用于判断请求是否符合路由规则的条件。在这个示例中,使用了Path=/user/**作为断言条件,只有请求路径以/user/开头的请求才会匹配到这个路由。

三,网关路由流程 四,断言工厂Route Predicate Factory

名称说明示例
After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-Id, \d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/red/{segment},/blue/**
Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

四,过滤器工厂 (GatewayFilter )

例如:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

1.请求头过滤器 

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/** 
        filters: # 过滤器
        - AddRequestHeader=token,itgaohe # 添加请求头

2.默认过滤器(注意:级别高一级)

spring:
  cloud:
    gateway:
      routes:
      - id: user-service 
        uri: lb://userservice 
        predicates: 
        - Path=/user/**
      default-filters: # 默认过滤项
      - AddRequestHeader=token2,itgaohe22 # 添加请求头

3.全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

例如:

定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有auth,

  • auth参数值是否为admin

如果同时满足则放行,否则拦截(注意通过路由访问)

//1.实现接口GlobalFilter   重写filter
//2.写业务
//3.保证被spring管理
@Component
public class AuthFilter implements GlobalFilter {
    //要求请求参数中有auth=admin
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数=获取请求参数+获取参数列表
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取auth参数
        String auth = params.getFirst("auth");
        // 3.校验
        if ("admin".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        System.out.println("您未登录请登录");
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}

运行后错误显示  注意后面携带(?auth=admin)就成功了

4.网关顺序 

排序的规则是什么呢?

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,可以指定-1

  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。

  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

五,跨域问题&同源问题

协议+域名+端口号 三者相同才是同源的

报错类型 

Access to XMLHttpRequest at 'http://example.com/api/data' from
 origin 'http://yourdomain.com' has been blocked by CORS policy:
 No 'Access-Control-Allow-Origin' header is present on the requested resource.

解决方法

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]': #所有路径都生效
            allowedOrigins: # 允许哪些网站的跨域请求 
              - "http://localhost:8090"
              - "null"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息,*代表任意
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

六,问题总结

springbooot文件执行顺序:

项目外配置文件(nacos配置文件)>aplication-dev.properties >application.properties 
aplication.yaml >aplication.yml>bootstrap.yaml

bootstrap.yaml最后生效的原因:

bootstrap.yml 由父Spring ApplicationContext加载,承接上下文。
bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
Spring Boot 在加载配置文件时,会按照特定的顺序进行加载和覆盖。当存在多个配置文件时,后加载的文件会覆盖先加载的文件中相同配置项的值。

bootstrap.yaml 可以实现热部署或云配置

热部署配置文件的生效顺序是:

云userserver-dev.yaml > 云userserver.yaml > 本地application.yaml

热部署同步实现方式有几种:

@RefreshScope:在 Spring Boot 应用程序中使用它可以实现动态更新配置信息。如果在运行时更改了配置信息,可以使用 @RefreshScope 注解来告诉 Spring Boot 重新加载配置信息。

@ConfigurationProperties(prefix = "pattern"):是 Spring Boot 中一种用于绑定配置文件中属性值到 Java 对象的方式。其中,prefix 参数指定了在配置文件中要绑定的属性的前缀,这样可以避免在 Java 类中重复书写相同的前缀。在 application.properties 配置文件中配置pattern的属性。

例如,在 application.properties 配置文件中,可能会有以下属性:

pattern.enabled=true 
pattern.timeout=1000 
pattern.retry-count=3

我们可以定义一个 Java 类,使用 @ConfigurationProperties(prefix = "pattern") 注解来将这些属性值绑定到类中的属性上:

@Configuration 
@ConfigurationProperties(prefix = "pattern") 
public class PatternProperties { 
    private boolean enabled; 
    private int timeout;
    private int retryCount; 
// getters and setters 
}

为什么要用feign?& restTemplete的缺点

restTemplete( 1. 侵入式开发(开发过程中需要强制性地修改现有代码或使用特定的框架、技术等,从而使得应用程序与特定技术或框架耦合度较高的开发方式。这种开发方式会导致代码的可维护性和可扩展性变差,增加了系统的维护成本,同时也限制了开发人员的选择。) 2. 配置复杂 3.优化不方便 )

feign好处:

好处:

1. 代码解耦

2. 自定义配置

3. 连接池调优

4. 他可以和spring其他框架无缝衔接

5.学习成本很低(springmvc接口规范)

feign的使用

  1. Feign 请求响应格式配置:在使用 Feign 进行服务间调用时,可以通过 Feign 的配置来设置请求和响应的格式。例如,你可以使用 @RequestMapping 注解的 produces 属性来指定接受的媒体类型,也可以使用 @RequestMapping 注解的 consumes 属性来指定发送的媒体类型。

    @FeignClient(name = "example", 
    url = "${example.url}",
    configuration = MyFeignConfiguration.class)
    public interface ExampleFeignClient {
        @RequestMapping
    (value = "/resource",
     method = RequestMethod.GET,
     produces = "application/json")
        String getResource();
    }
    
  2. Feign 缓存支持:你可以使用 Spring 的缓存框架(如 Spring Cache)来为 Feign 接口添加缓存支持。首先需要在配置类上加上 @EnableCaching 注解,然后在需要缓存的方法上添加 @Cacheable 注解。

    @Service
    public class MyService {
        @Cacheable("resourceCache")
        public String getResource() {
            // ...
        }
    }
    
  3. Spring @RefreshScope 支持:在 Spring Cloud Config 中,你可以使用 @RefreshScope 注解来实现配置的动态刷新。在需要动态刷新的 Bean 上添加 @RefreshScope 注解,然后在应用启动时,通过 Actuator 的 /actuator/refresh 端点来触发配置的刷新。

    @RestController
    @RefreshScope
    public class MyController {
        @Value("${my.property}")
        private String property;
    
        @GetMapping("/property")
        public String getProperty() {
            return property;
        }
    }
    
  4. Feign 支持 OAuth2:在使用 Feign 进行服务间调用时,可以集成 OAuth2 来进行安全的认证和授权。你可以在 Feign 客户端的请求头中添加 OAuth2 的认证信息,以此来实现对受保护资源的访问。

    @FeignClient(name = "oauth2-service",
     configuration = OAuth2FeignClientConfiguration.class)
    public interface OAuth2FeignClient {
        @RequestLine("GET /resource")
        @Headers("Authorization: Bearer {token}")
        String getResource(@Param("token") String token);
    }
    

feign的优化

日志级别设置为 basic:在使用 Feign 进行服务调用时,可以通过配置来设置 Feign 的日志级别。将日志级别设置为 basic 可以输出基本的请求和响应信息。 

logging:
  level:
    com.netflix.feign: basic

使用 HttpClient 或 OKHttp 代替 URLConnection:可以使用 Feign 的 HttpClient 支持来替代默认的 URLConnection,或者使用 OKHttp 作为底层的 HTTP 客户端。

HttpClient:

依赖:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

配置文件:

feign.httpclient.enabled=true
feign.httpclient.maxConnections=200
feign.httpclient.maxConnectionsPerRoute=20

OKHttp:

依赖:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

配置文件:

feign.okhttp.enabled=true

网关重要概念:

断言:用于定义匹配请求的条件。当客户端发起请求时,网关会根据配置的断言条件来决定是否将请求路由到特定的微服务或后端。

过滤器:(默认的 路由 全局 每一个过滤器都必须指定一个int类型的order值,**order值越小,优先级越高,执行顺序越靠前**。GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定。路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

跨域访问

跨域:域名不同&域名相同、端口不同

浏览器不限制的:<script> <link> <img>等

限制 AJAX 请求的跨域访问的处理:可以在服务端设置响应头中的 Access-Control-Allow-Origin 属性,指定允许跨域访问的源。如果请求的来源不在允许的列表中,则浏览器会拦截这个跨域请求。

Access-Control-Allow-Origin: http://www.example.com

gateway如何跨域:

在配置文件中添加跨域过滤器的配置

spring:
  cloud:
    gateway:
      default-filters:
        - name: Cors
          args:
            allowedOrigins: "http://www.example.com"
            allowedMethods: "POST, GET, PUT, OPTIONS, DELETE, PATCH"
            allowedHeaders: "Content-Type, Authorization"
            allowCredentials: true

在跨域过滤器中添加 Access-Control-Allow-Origin 属性

@Bean
public CorsGatewayFilterFactory corsGatewayFilterFactory() {
    CorsGatewayFilterFactory factory = new CorsGatewayFilterFactory();
    factory.setAllowedOrigins("http://www.example.com");
    return factory;
}

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

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

相关文章

AGI魔盒,会放出冥王PLUTO还是阿童木?

人机共生&#xff0c;是科幻作品永恒的主题。其中&#xff0c;《冥王PLUTO》可能是最早探讨人类与机器人如何在冲突中共存的漫画作品。 如果说阿童木是人机共生的“和平使者”&#xff0c;启蒙了几代人对机器人的信任和热爱,那么冥王PLUTO就是阿童木的反面&#xff0c;一个心怀…

了解如何在linux使用podman管理容器

本章主要介绍使用 podman 管理容器。 了解什么是容器&#xff0c;容器和镜像的关系 安装和配置podman 拉取和删除镜像 给镜像打标签 导出和导入镜像 创建和删除镜像 数据卷的使用 管理容器的命令 使用普通用户管理容器 使用普通用户管理容器 对于初学者来说&#xff0c;不太容…

如何在iPad Pro上实现SSH远程连接服务器并进行云端编程开发【内网穿透】

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 本文主要介绍开源iPad应用IDE如何下载安装&#xff0c;并…

C语言之文件操作(下)

C语言之文件操作&#xff08;下&#xff09; 文章目录 C语言之文件操作&#xff08;下&#xff09;1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数&#xff08;fgetc/fputc&#xff09;1.1.2 ⽂本⾏输⼊/输出函数&#xff08;fgets/fputs&#xff09;1.1.3 格…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

【Jenkins】节点 node、凭据 credentials、任务 job

一、节点 node Jenkins在安装并初始化完成后&#xff0c;会有一个主节点&#xff08;Master Node&#xff09;&#xff0c;默认情况下主节点可以同时运行的任务数是2&#xff0c;可以在节点配置中修改&#xff08;系统管理/节点和云管理&#xff09;。 Jenkins中的节点&#…

美团、阿里、快手、百度 | NLP暑期算法实习复盘

面试锦囊之面经分享系列&#xff0c;持续更新中 后台回复『面试』加入讨论组交流噢 背景 211CS本港三DS硕&#xff0c;硕士research的方向是NLP&#xff0c;目标是找任何方向的算法实习。 本科做开发为主没有算法经验&#xff0c;没有top比赛&#xff0c;没有过算法实习&…

【docker】docker入门与安装

Docker 一、入门 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP及其运行环境能做到一次镜像,处处运行。 Docker运行速度快的原因 Docker有比虚拟…

SpringBoot框架接口数据加密(base64)传输(前后分离版本)

技术采用FilterHttpServletRequestWrapperHttpServletResponseWrapperbase64 1、前端加解密 1.1 vue引入开源的base64 1、下载依赖 $ npm install --save js-base642、使用方法&#xff1a; import {Base64} from js-base64Base64.encode(hellow world); // 编码 aGVsbG93IF…

Pycharm2023安装

PyCharm是一种Python IDE&#xff08;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高…

【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

文章目录 &#x1f354;什么是缓存穿透&#x1f384;解决办法⭐缓存空值处理&#x1f388;优点&#x1f388;缺点&#x1f38d;代码实现 ⭐布隆过滤器&#x1f38d;代码实现 &#x1f354;什么是缓存穿透 缓存穿透是指在使用缓存机制时&#xff0c;大量的请求无法从缓存中获取…

Redis高级特性解析:持久化、主从复制与哨兵机制全面探讨

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存…

bugkuctf web随记wp

常规思路&#xff1a; 1&#xff0c;源码2&#xff0c;抓包3&#xff0c;御剑dirsearch扫后台检查是否有git文件未删除4&#xff0c;参数 本地管理员&#xff1a;1&#xff0c;cu看源码&#xff0c;sci看源码有一串东西2&#xff0c;base64解码后是test123猜测是密码3&#x…

IDEA中显示方法、类注释信息

目录 一、IDEA测试版本及环境二、操作步骤2.1 鼠标悬停在某一个方法上&#xff0c;从而显示方法的注释信息2.2 调用方法时同步显示方法注释信息2.3 在new一个对象时&#xff0c;这个对象有很多重载的构造方法&#xff0c;想要重载的构造函数都显示出来 一、IDEA测试版本及环境 …

WPF仿网易云搭建笔记(6):Style进阶详解

文章目录 专栏和Gitee仓库前言Style简单使用样式字典全局样式局部全局样式全局样式穿透 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 WPF想要批量设置样式属性&#xff0c;一共有3个方法 Style样式Template控件模板DataTemplate数据模板 WPF 零基础…

聚观早报 |iOS17.3引入设备被盗保护;iPhone16或调整设计

【聚观365】12月14日消息 iOS17.3引入设备被盗保护 iPhone16或调整设计 马斯克星链网络使用量飙升 华为鸿蒙智行App正式上线 特斯拉人形机器人Optimus二代上线 iOS17.3引入设备被盗保护 苹果向iPhone用户推送了iOS17.3开发者预览版Beta更新&#xff0c;本次更新距离上次发…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8&#xff01; 在分析 GC 日志时&#xff0c;可以同时采用多种工具&#xff08;Arthas、gceasy、JVM 连接 Graphana 监控&#xff09;进行分析&#xff0c;避免某种工具分析不准确 gceasy 每个月只可以免费…

激光炸弹

title: 激光炸弹 date: 2023-12-14 19:42:59 tags: 前缀和 categories: 算法进阶指南 题目链接 − − > --> −−> 传送门 题目大意 思路 代码 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define sz size() #define …

mac python安装grpcio以及xcode升级权限问题记录

问题1: ERROR: Could not build wheels fol grpcio, which is required to install pyproject.toml-based projects pip3 install --no-cache-dir --force-reinstall -Iv grpcio1.41.0 # (我这里是降级安装的) 问题2: fatal error: ‘stdio.h’ file not found 25 | #include …

@德人合科技——天锐绿盾|电脑文件防止泄密|文件、文档、图纸、源代码等透明加密保护,防泄密软件系统

德人合科技——天锐绿盾提供了一种企业办公电脑文件防止泄密的解决方案&#xff0c;该方案对文件、文档、设计图纸、源代码等进行了透明加密保护。 pc访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 透明加密是一种保护文…