微服务学习:Gateway服务网关

一,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@Overridepublic 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' fromorigin '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 # 是否允许携带cookiemaxAge: 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: Corsargs: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.mzph.cn/news/222491.shtml

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

相关文章

爬虫的基本介绍 , 什么是爬虫 , 爬虫的主要功能

走进爬虫 1. 什么是爬虫&#xff1f; 本节课程的内容是介绍什么是爬虫&#xff1f;爬虫有什么用&#xff1f;以及爬虫是如何实现的&#xff1f;从这三点一起来寻找答案&#xff01; 1.1 初识网络爬虫 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff…

PythonStudio:一款国人写的python及窗口开发编辑IDE,可以替代pyqt designer等设计器了

本款软件只有十几兆&#xff0c;功能算是强大的&#xff0c;国人写的&#xff0c;很不错的python界面IDE.顶部有下载链接。下面有网盘下载链接&#xff0c;或者从官网直接下载。 目前产品免费&#xff0c;以后估计会有收费版本。主页链接&#xff1a;PythonStudio-硅量实验室 作…

阿里云Centos8安装Dockers详细过程

一、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…

服务器数据恢复-raid5多块磁盘掉线导致上层卷无法挂载的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列&#xff0c;linux操作系统ext3文件系统&#xff0c;服务器上层部署有oracle数据库。 服务器故障&检测&#xff1a; raid5阵列中有两块硬盘出现故障掉线&#xff0c;导致服务器上层卷无法…

大文件加密传输助力企业数据交互安全

在当前信息时代&#xff0c;数据成为企业的关键资产和竞争优势。企业为提高效率和创新能力&#xff0c;需要与内外部合作伙伴进行数据交换与协作。然而&#xff0c;在大量数据在网络上传输时&#xff0c;数据安全成为企业不可忽视的挑战。如何确保数据的机密性、完整性和可用性…

【Linux】信号--信号初识/信号的产生方式/信号的保存

文章目录 一、信号初步理解1.生活角度的信号2.技术应用角度的信号 二、信号的产生方式1.通过终端按键产生信号2.调用系统函数向进程发信号3.硬件异常产生信号4.由软件条件产生信号5.进程退出时的核心转储问题 三、信号的保存1.信号其他相关常见概念2.信号在内核中的表示3.sigse…

ubuntu debian mini安装系统 有线选项消失或ens33 ethernet 未托管解决方法

nmcli device status#修改NetworkManager.conf如下 sed s/false/true/ /etc/NetworkManager/NetworkManager.confsed -i s/false/true/ /etc/NetworkManager/NetworkManager.conf#重启生效systemctl restart NetworkManager

智能优化算法应用:基于蝠鲼觅食算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝠鲼觅食算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝠鲼觅食算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝠鲼觅食算法4.实验参数设定5.算法结果6.…

phpMyAdmin的常见安装位置

nginx的日志显示有人一直在尝试访问phpMyAdmin的setup.php&#xff0c;用了各种位置。 其实我只有一个nginx&#xff0c;别的什么也没有。 47.99.136.156 - - [01:44:37 0800] "GET http://abc.com:80/phpMyAdmin/scripts/setup.php HTTP/1.0" 404 162 "-"…

生成树基本实验

背景 某公司的二层交换网络中&#xff0c;为了提高网络可靠性&#xff0c;故在二层交换网络中增加冗余链路。为了阻 止冗余链路可能带来的广播风暴&#xff0c;MAC地址漂移等负面影响&#xff0c;需要在交换机之间部署生成树 协议。 实验 一.配置stp en 开启 stp en stp …

PPINN Parareal physics-informed neural network for time-dependent PDEs

论文阅读&#xff1a;PPINN Parareal physics-informed neural network for time-dependent PDEs PPINN Parareal physics-informed neural network for time-dependent PDEs简介方法PPINN加速分析 实验确定性常微分方程随机常微分方程Burgers 方程扩散反应方程 总结 PPINN Par…

R语言【rgbif】——什么是多值传参?如何在rgbif中一次性传递多个值?多值传参时的要求有哪些?

rgbif版本&#xff1a;3.7.8.1 什么是多值传参&#xff1f; 您是否在使用rgbif时设想过&#xff0c;给某个参数一次性传递许多个值&#xff0c;它将根据这些值独立地进行请求&#xff0c;各自返回独立的结果。 rgbif支持这种工作模式&#xff0c;但是具体的细节需要进一步地…

新版Spring Security6.2 - Digest Authentication

前言&#xff1a; 书接上文&#xff0c;上次翻译basic的这页&#xff0c;这次翻译Digest Authentication这页。 摘要认证-Digest Authentication 官网的警告提示&#xff1a;不应在应用程序中使用摘要式身份验证&#xff0c;因为它不被认为是安全的。最明显的问题是您必须以…

IDEA中Terminal配置为bash

简介 我们日常命令行都是使用Linux的bash指令&#xff0c;但是我们的开发基本都是基于Windows上的IDEA进行开发的&#xff0c;对此我们可以通过将IDEA将终端Terminal改为git bash自带的bash.exe解决问题。 配置步骤 安装GIT 这步无需多说了&#xff0c;读者可自行到官网下载…

大模型时代-从0开始搭建大模型

开发一个简单模型的步骤&#xff1b; 搭建一个大模型的过程可以分为以下几个步骤&#xff1a; 数据收集和处理模型设计模型训练模型评估模型优化 下面是一个简单的例子&#xff0c;展示如何使用Python和TensorFlow搭建一个简单的大模型。 数据收集和处理 首先&#xff0c;我…

Python接口自动化 —— Json 数据处理实战(详解)

简介   上一篇说了关于json数据处理&#xff0c;是为了断言方便&#xff0c;这篇就带各位小伙伴实战一下。首先捋一下思路&#xff0c;然后根据思路一步一步的去实现和实战&#xff0c;不要一开始就盲目的动手和无头苍蝇一样到处乱撞&#xff0c;撞得头破血流后而放弃了。不仅…

作业12.11

1 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

数据结构(超详细讲解!!)第二十七节 查找

1.查找的基本概念 1、查找表——由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合称为查找表。 2、对查找表进行的操作&#xff1a; 查找某个特定的数据元素是否存在&#xff1b; 检索某个特定数据元素的属性&#xff1b; 在查找表中插入一个数据元素&#x…

Stable Diffusion AI绘画系列【25】:3D可爱风格系列图片

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

微信小程序---自定义组件

目录 1.局部引用组件 2.全局引用组件 3.组件和页面的区别 4.自定义组件样式 5.properties属性 6.data和properties的区别 7.数据监听器 8.纯数据字段 9.自定义组件-组件的生命周期 lifetimes节点 10.组件所在的页面的生命周期 pageLifetimes节点 11.插槽 &#x…