网站速度查询,用ps制作海报教程方法步骤,长安响应式网站建设,wordpress 禁止缩略图Gateway服务网关
API网关为微服务架构中的服务提供了统一的访问入口#xff0c;客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式#xff0c;它相当于整个微服务架构中的门面#xff0c;所有客户端的访问都通过它来进行路由及过滤。它实现了请求路…Gateway服务网关
API网关为微服务架构中的服务提供了统一的访问入口客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式它相当于整个微服务架构中的门面所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。
能干吗
路由过滤负载均衡灰度发布金丝雀发布
起源是矿井工人发现金丝雀对瓦斯气体很敏感矿工会在下井之前先放一只金丝雀到井中如果金丝雀不叫了就代表瓦斯浓度高。
在灰度发布开始后先启动一个新版本应用但是并不直接将流量切过来而是测试人员对新版本进行线上测试启动的这个新版本应用就是我们的金丝雀。如果没有问题那么可以将少量的用户流量导入到新版本上然后再对新版本做运行状态观察收集各种运行时数据如果此时对新旧版本做各种数据对比就是所谓的A/B测试。新版本没什么问题那么逐步扩大范围、流量把所有用户都迁移到新版本上面来。
SpringCloud GateWay
Gateway是在Spring生态系统之上构建的API网关服务基于Spring 5Spring Boot 2和 Project Reactor等技术。 Gateway旨在提供一种简单而有效的方式来对API进行路由以及提供一些强大的过滤器功能 例如熔断、限流、重试等 SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件底层使用了Netty通讯框架。 能干吗
鉴权反向代理流量控制熔断日志监控等等
Spring Cloud Gateway 具有如下特性
基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建动态路由能够匹配任何请求属性可以对路由指定 Predicate断言和 Filter过滤器集成Hystrix的断路器功能集成 Spring Cloud 服务发现功能易于编写的 Predicate断言和 Filter过滤器请求限流功能支持路径重写。
网关所在位置
三大核心概念
web请求通过一些匹配条件定位到真正的服务节点。并在这个转发过程的前后进行一些精细化控制。predicate就是我们的匹配条件而filter就可以理解为一个无所不能的拦截器。有了这两个元素再加上目标uri就可以实现一个具体的路由了
工作流程
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前“pre”或之后“post”执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等 在“post”类型的过滤器中可以做响应内容、响应头的修改日志的输出流量监控等有着非常重要的作用。
配置路由两种方式:
1.yml主配置文件配置
# 在原有配置中新添加
springcloud:gateway:routes:- id: payment_routh #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/payment/get/** # 断言路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path/payment/lb/** # 断言路径相匹配的进行路由
2.配置类配置
package com.atguigu.springcloud.config;import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description: 网关配置类* BelongsProject: springCloudLearn* BelongsPackage: com.atguigu.springcloud.config* Author: shang_kui EnglishName:Jack* CreateTime: 2023-09-04 13:45*/
Configuration
public class GateWayConfig {Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder){RouteLocatorBuilder.Builder routes builder.routes();routes.route(path_route_sk,r-r.path(/guonei).uri(http://news.baidu.com/guonei));return routes.build();}Beanpublic RouteLocator customRouteLocator1(RouteLocatorBuilder builder){RouteLocatorBuilder.Builder routes builder.routes();routes.route(path_route_sk,r-r.path(/guoji).uri(http://news.baidu.com/guoji));return routes.build();}
}依赖引入需注意排除web依赖 !-- SpringBoot整合Web组件 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency通过微服务名实现动态路由
spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能利用微服务名进行路由routes:- id: payment_routh #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名# uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path/payment/get/** # 断言路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID没有固定规则但要求唯一建议配合服务名# uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path/payment/lb/** # 断言路径相匹配的进行路由- After2023-09-04T14:54:56.89008:00[Asia/Shanghai]常用的Route Predicate
- After2020-02-05T15:10:03.68508:00[Asia/Shanghai] # 断言路径相匹配的进行路由
- Before2020-02-05T15:10:03.68508:00[Asia/Shanghai] # 断言路径相匹配的进行路由
- Between2020-02-02T17:45:06.20608:00[Asia/Shanghai],2020-03-25T18:59:06.20608:00[Asia/Shanghai]
- Cookieusername,zzyy
- HeaderX-Request-Id, \d # 请求头要有X-Request-Id属性并且值为整数的正则表达式
- Host**.atguigu.com
- MethodGET
- Queryusername, \d # 要有参数名username并且值还要是整数才能路由Filter的使用
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应路由过滤器只能指定路由进行使用。
Spring Cloud Gateway 内置了多种路由过滤器他们都由GatewayFilter的工厂类来产生 生命周期 prepost 种类 Gateway Filter filters:
- AddRequestParameterX-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头名称为X-Request-Id值为1024Global Filter 自定义全局过滤器
package com.atguigu.springcloud.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Date;/*** Description: 自定义日志过滤器* BelongsProject: springCloudLearn* BelongsPackage: com.atguigu.springcloud.filter* Author: shang_kui EnglishName:Jack* CreateTime: 2023-09-04 15:54*/
Component
Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(进入网关过滤器new Date());String uname exchange.getRequest().getQueryParams().getFirst(uname);if (uname null) {log.info(用户名为null,非法用户);exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}Overridepublic int getOrder() {return 0;}
}