网站新闻打不开,装修行业门户网站模板,新手网站建设教程,优秀的门户网站1. 微服务为什么需要 API 网关#xff1f;
1.1. 在微服务架构中#xff0c;通常一个系统会被拆分为多个微服务#xff0c;面对多个微服务客户端应该如何去调用呢#xff1f;
如果根据每个微服务的地址发起调用#xff0c;存在如下问题#xff1a;
客户端多次请求不同的…1. 微服务为什么需要 API 网关
1.1. 在微服务架构中通常一个系统会被拆分为多个微服务面对多个微服务客户端应该如何去调用呢
如果根据每个微服务的地址发起调用存在如下问题
客户端多次请求不同的微服务会增加客户端代码和配置的复杂性维护成本比较高认证复杂每个微服务可能存在不同的认证方式客户端去调用要去适配不同的认证存在跨域的请求调用链有一定的相对复杂性防火墙、浏览器不友好的协议难以重构随着代码的迭代可能需要重新划分微服务。
1.2. 为了解决以上问题微服务引入了 API 网关的概念
API 网关为微服务架构的系统提供简单、有效且统一的 API 路由管理作为系统的统一入口提供内部服务的路由中转给客户端提供统一的服务可以实现一些和业务没有耦合的公共逻辑主要功能包括认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。 2. Spring Cloud Gateway 是什么
官方文档Spring Cloud Gateway :: Spring Cloud Gateway
Spring Cloud Gateway 是 Sprinig Cloud 官方推出的第二代网关框架定位取代 Netflix Zuul。
Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式并基于 Filter 的方式提供网关的基本功能例如说安全认证、监控、限流等。
Spring Cloud Gateway 是有 WebFlux Netty Reactor 实现的响应式的 API 网关。它不能再传统的 Servlet 容器中工作也不能构建成 war 包。
3. 微服务快速接入 Spring Cloud Gateway
3.1. 构建网关服务
3.1.1. 创建一个新的 module 模块 icoolkj-mall-gateway pom.xml 文件中引入 Spring Cloud Gateway 网关依赖
dependencies!-- gateway网关 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--nacos-discovery 注册中心依赖--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!-- loadbalancer 负载均衡器依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-loadbalancer/artifactId/dependency/dependencies
3.2. 微服务快速接入网关服务
3.2.1. 以订单服务为例
在网关服务配置 application.yml 文件
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848gateway:# 设置路由路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/order/** # 断言路径相匹配的进行路由
商品、库存、账户服务同上配置网关服务的完整的 application.yml 配置如下
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848gateway:# 设置路由路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/order/** # 断言路径相匹配的进行路由- id: product_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-product # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/product/** # 断言路径相匹配的进行路由- id: inventory_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-inventory # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/inventory/** # 断言路径相匹配的进行路由- id: account_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-account # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/account/** # 断言路径相匹配的进行路由
优化可以将 gateway 的配置移到 Nacos 配置中心 网关服务的 pom.xml 文件中引入 Nacos 配置中心依赖
!-- nacos-config 配置中心依赖 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId
/dependency Nacos 控制台创建 dataId 为 icoolkj-mall-gateway.yml配置内容如下
spring:cloud:gateway:# 设置路由路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/order/** # 断言路径相匹配的进行路由- id: product_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-product # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/product/** # 断言路径相匹配的进行路由- id: inventory_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-inventory # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/inventory/** # 断言路径相匹配的进行路由- id: account_route # 路由ID全局唯一建议配置服务名uri: lb://icoolkj-mall-account # lb 整合负载均衡器 loadbalancerpredicates:- Path/api/account/** # 断言路径相匹配的进行路由 网关服务的 application.yml 调整引入 icoolkj-mall-gateway.yml 配置
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:config:server-addr: icoolkj-mall-nacos-server:8848file-extension: yml # 指定配置文件扩展名为ymlconfig:import:- optional:nacos:${spring.application.name}.yml- nacos:nacos-discovery.yml
3.3. 启动网关服务测试
postman 中通过网关服务的 18888 端口下单看看能否成功。
icoolkj-mall-forntend 前端服务 order.html 中访问后端服务地址都替换成 icoolkj-mall-gateway:18888测试下单是否成功。
4. Gateway 跨域资源共享配置 官方文档Spring Cloud Gateway
4.1. 通过 yml 配置的方式
spring:cloud:gateway:globalcors:cors-configurations:[/**]:allowedOrigins: *allowedMethods:- GET- POST- DELETE- PUT- OPTIONallowedHeaders: *
4.2. 通过 java 配置的方式
Configuration
public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();// 允许的前端地址config.addAllowedOrigin(http://localhost:88); // 只允许特定的前端地址// 允许所有 HTTP 方法包括 GETconfig.addAllowedMethod(*);// 允许所有请求头config.addAllowedHeader(*);// 设置允许带有凭证如 Cookiesconfig.setAllowCredentials(true);UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration(/**, config); // 全局匹配所有请求路径return new CorsWebFilter(source);}
}
4.3. 发现问题
通过通过以上配置后台接口可以访问但是还是提示跨域。解决方案去除微服务内部的注解 CrossOrigin
全局 CORS 配置放在网关服务中这会确保跨域请求的集中管理避免每个微服务都进行重复配置。微服务内部的 CORS 配置一般不需要除非某些微服务的接口有特殊需求可以通过 CrossOrigin 注解进行单独配置。网关处理 CORS 后微服务只需专注于业务逻辑不必关注跨域问题简化了微服务的开发和维护。
5. 小结
gateway 就是整个微服务架构的统一入口。