Gateway

前言

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

(1)客户端会多次请求不同的微服务,增加了客户端的复杂性。

(2)存在跨域请求,在一定场景下处理相对复杂。

(3)认证复杂,每个服务都需要独立认证。

(4)难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。

(5)某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性

一、Gateway是什么?

Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。

二、Spring Cloud Gateway核心概念

网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等贡呢。一般来说网关对外暴露的URL或者接口信息,我们统称为路由信息。如果研发过网关中间件或者使用过Zuul的人,会知道网关的核心是Filter以及Filter Chain(Filter责任链)。Sprig Cloud Gateway也具有路由和Filter的概念。下面介绍一下Spring Cloud Gateway中几个重要的概念。

(1)路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配

(2)断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。

(3)过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

如上图所示,Spring cloud Gateway发出请求。然后再由Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway web handler。Handler再通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。

三、跨域:

什么是浏览器同源策略:
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
它的核心就在于它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源。
所谓同源是指:域名、协议、端口相同
为什么要有跨域限制
因为存在浏览器同源策略,所以才会有跨域问题。那么浏览器是出于何种原因会有跨域的限制呢。其实不难想到,跨域限制主要的目的就是为了用户的上网安全。

四、解决跨域和负载均衡的使用:

1)创建微服务模块:gateway
2)在模块内引入相关依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency><!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>

3)编写application.properties配置文件(实现负载均衡)

服务端口
server.port=8222服务名
spring.application.name=service-gatewaynacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#使用服务发现路由
spring.cloud.gateway.discovery.locator.enabled=true
#服务路由名小写
#spring.cloud.gateway.discovery.locator.lower-case-service-id=true配置服务
#设置路由id
spring.cloud.gateway.routes[0].id=service-acl
#设置路由的uri
spring.cloud.gateway.routes[0].uri=lb://service-acl
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[0].predicates= Path=/*/acl/**

4)创建配置类(实现跨域)

@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");允许所有请求头config.addAllowedOrigin("*");允许所有请求方法,例如get,post等config.addAllowedHeader("*");允许所有的请求来源corsConfiguration.setAllowCredentials(true);允许携带cookieUrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);对所有经过网关的请求都生效return new CorsWebFilter(source);}
}

五、总结:

简单来说就是:gateway单独建模块,在nacos注册中心注册,其他模块也在nacos中注册,从而gateway可访问其他模块,并通过一定的规则对其他模块进行一定的管理。

网关gateway解决跨域问题相关推荐

  1. Spring Cloud Gateway 解决跨域问题

      注:文中的解决方案在 Spring Cloud 2021.0.4.Spring Boot 2.7.4 版本中得到验证,完美解决,其他版本可参考   请求流程如下图:通过nginx反向代理到网关,在 ...

  2. 踩坑Gateway服务搭建、配置网关路由、路径重写和解决跨域问题(java类实现跨域)

    由于项目需要,需要使用Gateway,话不多说直接干 引入依赖 <dependency><groupId>org.springframework.cloud</group ...

  3. GateWay网关应用案例(跨域、限流、黑白名单)

    Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的.属于异步非阻塞架构 Spring Cloud Gat ...

  4. Gateway网关-网关的cors跨域配置

    什么是跨域问题 跨域:域名不一致就是跨域,主要包括: 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com 域名相同, ...

  5. SpringCloud工作笔记043---SpringCloud 从整体上解决跨域问题_zuul网关配置实现跨域

    JAVA技术交流QQ群:170933152 自己用的: 注意,测试,发现如果网关做了跨域处理,其他地方就不要再做了,比如其他微服务,否则前端 访问的时候会报跨域问题. ---------------- ...

  6. 精选文章 什么是跨域?怎么解决跨域问题?

    一.什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: ...

  7. Java 解决跨域问题

    JAVA | Java 解决跨域问题 文章目录 JAVA | Java 解决跨域问题 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一.使用Filter ...

  8. Vue项目中你是如何解决跨域的呢?

    Vue项目中你是如何解决跨域的呢? 一.跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能 所谓同源( ...

  9. 微服务电商实战(十一)搭建vue项目对接注册登陆接口,解决跨域问题,使用七牛云实现头像上传

    一.简介 node.js版本:v12.16.3 node.js下载 vue官网教程 iview介绍 上传头像接口,图片存储在七牛云中,注册并实名认证之后可以免费使用 以下会描述使用vue搭建项目框架的 ...

最新文章

  1. Chromium之各国语言切换
  2. Current综述:中农宋春旭等为植物有益微生物组构建一个美好家园
  3. typescript 怎么表示当前时间减一个月_TypeScript类型元编程:实现8位数的算术运算...
  4. 前端常用linux命令
  5. 数据库面试中常用的10个问题
  6. Java学习之String StringBuffer StringBuilder区别
  7. linux 安卓git,在Linux系统上安装Git
  8. yum安装好的php路径,yum安装php的路径是什么_后端开发
  9. Android通知,PendingIntent示例
  10. 基于javaweb+SSM的药品管理系统(java+SSM+html+jQuery+Tomcat+mysql)
  11. dms虚拟服务器,dms服务器
  12. Windows 10 VMware Workstation Server服务启动一段时间后自动异常关闭
  13. eaxyexcel获取指定行,获取总行数
  14. 蓝牙室内定位技术,蓝牙定位信标应用场景及分析
  15. win10无法添加工作组计算机,win10系统工作组计算机无法访问的具体步骤
  16. 线性代数学习笔记(七)——克莱姆法则
  17. 一文读懂 delete和delete[ ]
  18. 难得一读的古老的俗话
  19. 74HC238引脚定义 使用方法
  20. 数字化经营快速发展,微火专注做智慧数字经营系统解决方案提供商

热门文章

  1. jupyter lab插件无法打开,且报错Error: 500 (Internal Server Error)
  2. Linux解压tar.gz、zip、tar.bz2 文件与对应的命令
  3. 应用计算机技术建立起来的地图,地理信息系统的思考题及其答案
  4. http请求中必备的字符段_React Hooks中这样写HTTP请求可以避免内存泄漏
  5. 20172301 2018-2019-1《程序设计与数据结构》课程总结
  6. 学习笔记:杨辉三角形上莫队(组合数莫队)(LULU胡策)
  7. 由***Web挂机产生的想法!
  8. List大坑集「锦」
  9. akka之分发和路由
  10. linux命令进入用户模式,linux怎么切换到root用户模式