dede模板分为 网站建设好吗,开平网络推广,wordpress 阅读量,京东自营入驻流程及费用分布式微服务 - 3.服务网关 - 4.Gateway
项目示例#xff1a;
项目示例 - 3.服务网关 - 3.Gateway
内容提要#xff1a;
基本使用#xff1a;配置方式、代码方式内置断言、自定义断言内置局部过滤器、自定义内置和全局过滤器
文档#xff1a;
官网官网文档
基本使用…分布式微服务 - 3.服务网关 - 4.Gateway
项目示例
项目示例 - 3.服务网关 - 3.Gateway
内容提要
基本使用配置方式、代码方式内置断言、自定义断言内置局部过滤器、自定义内置和全局过滤器
文档
官网官网文档
基本使用
配置方式
引入依赖使用gateway依赖时不能同时引入spring-boot-starter-web依赖。gateway配合nacos使用别名进行路由需要使用负载均衡而nacos依赖不包含因此要单独引入loadbalancer依赖 !--gateway--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependencyapplication.yml配置
spring:cloud:gateway:discovery:locator:# 从服务注册中心根据别名来进行路由enabled: trueroutes:# 路由Id自定义唯一即可- id: nacos-provider-test# 成功匹配后要转换成的路由地址配合服务注册中心使用别名需要负载均衡依赖uri: lb://nacos-provider# 成功匹配后要转换成的路由地址不配合服务注册中心#uri: http://localhost:8001# 断言predicates:# 路径匹配的进行路由- Path/**代码方式
Configuration
public class GatewayConfig {Beanpublic RouteLocator myRouteLocator(RouteLocatorBuilder builder) {RouteLocatorBuilder.Builder routes builder.routes();routes.route(nacos-provider-test, r - r.path(/**).uri(lb://nacos-provider));return routes.build();}}路由配置
路由是由ID、URI、一系列的断言和过滤器组成的。断言可以匹配请求中的所有内容如果请求与断言相匹配则进行路由。URI是进行路由时要转换成的路由地址。在满足断言之后过滤器可以修改向URI发送的请求和返回的响应。
断言
gateway本身内置许多断言RoutePredicateFactory接口的实现类多个断言可以组合使用。
当一个请求可以满足多个路由的断言时会按定义的顺序找第一个满足断言的路由。
内置断言
内置断言中用到的时间格式可以用代码ZonedDateTime.now() 获取也可以指定时间区域ZonedDateTime.now(ZoneId.of(Asia/Shanghai)) 。
常用内置断言
Path 请求满足路径正则表达式则匹配如Path/product-serv/segment,/server-b/** Method 请求满足指定请求方式则匹配如MethodGET,POST Cookie 请求cookie中存在指定key且value满足正则表达式则匹配如Cookiekey, valueReg Header 请求头中存在指定key且value满足正则表达式则匹配如HeaderX-Request-Id, \d Query 请求带有指定参数且value满足正则表达式则匹配如Queryname, fly RemoteAddr 请求的ip在指定ip/mask内则匹配如RemoteAddr192.168.1.0/24 Host 请求的host满足正则表达式则匹配如Hostlocalhost:8080,localhost:8081 After 请求时间在指定时间之后则匹配可用于在未来指定时间上线服务如After2024-01-01T23:59:59.12308:00[Asia/Shanghai] Before 请求时间在指定时间之前则匹配可用于服务在指定时间内可访问如Before2024-01-01T23:59:59.12308:00[Asia/Shanghai] Between 请求时间在指定时间之间则匹配可用于服务在指定时间内可访问如Between2024-01-01T23:59:59.12308:00[Asia/Shanghai], 2024-01-02T23:59:59.12308:00[Asia/Shanghai]
自定义断言
创建类并Component注入类名要求是XxxRoutePredicateFactory配置文件中使用断言时断言名为Xxx
Component
public class CustomRoutePredicateFactory创建静态内部类用于接收参数因此要有属性值和对应的getter和setter GetterSetterpublic static class Config {private String key;private String value;}继承抽象类继承断言工厂类AbstractRoutePredicateFactory并确定泛型为内部类
Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactoryCustomRoutePredicateFactory.Config构造方法 public CustomRoutePredicateFactory() {super(Config.class);}重写读配置文件方法方法读取配置文件的参数值赋值到内部类中的属性上顺序必须与yml文件中的配置顺序对应 Overridepublic ListString shortcutFieldOrder() {return Arrays.asList(key, value);}重写apply方法返回true路由成功返回false返回404serverWebExchange可以获取很多内容 Overridepublic PredicateServerWebExchange apply(Config config) {return new PredicateServerWebExchange() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {ListString strings serverWebExchange.getRequest().getHeaders().get(config.key);if (stringsnull || strings.isEmpty())return false;return config.value.equals(strings.get(0));}};}yml文件中配置断言
Customtest, a过滤器
过滤器分为局部过滤器和全局过滤器局部过滤器仅在配置的路由上起效而全局过滤器对所有的路由都起效。
内置局部过滤器
常用内置过滤器 StripPrefix 转换成路由之前去掉URL中前面几节如StripPrefix1 PrefixPath 给请求路径path添加前缀如PrefixPath/nacos AddRequestParameter 添加请求参数如AddRequestParametername,test RemoveRequestParameter 删除请求参数如RemoveRequestParametername AddRequestHeader 在请求头上添加参数如AddRequestHeaderkey,value SetRequestHeader 修改请求头上指定参数的值参数不存在时创建如SetRequestHeadermyHeader, test RemoveRequestHeader 删除请求头上的指定参数如RemoveRequestHeaderMyHeader AddResponseHeader 在响应头上添加参数如AddRequestHeaderkey,value SetResponseHeader 修改响应头上指定参数的值参数不存在时创建如SetResponseHeaderaddHeader, test RewriteResponseHeader 修改响应头上指定参数的值第一个参数是key第二个参数是正则表达式匹配修改前的值第三个参数是修改后的值如RewriteResponseHeaderaddHeader,test1,test RemoveResponseHeader 删除响应头上的指定参数如RemoveResponseHeaderaddHeader SetStatus 设置返回的响应码如SetStatus500 RedirectTo 重定向两个参数分别是重定向300系列状态码和URL如RedirectTo302, https://www.baidu.com RewritePath 重写请求路径如RewritePath/test1/?(?.*), /nacos/${segment}
自定义局部过滤器
创建类并Component注入类名要求是XxxGatewayFilterFactory配置文件中使用过滤器时过滤器名为Xxx
Component
public class CustomGatewayFilterFactory创建静态内部类用于接收参数因此要有属性值和对应的getter和setter GetterSetterpublic static class Config {private String key;private String value;}继承抽象类继承过滤器工厂类AbstractGatewayFilterFactory并确定泛型为内部类
Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactoryCustomGatewayFilterFactory.Config构造方法 public CustomRoutePredicateFactory() {super(Config.class);}重写读配置文件方法方法读取配置文件的参数值赋值到内部类中的属性上顺序必须与yml文件中的配置顺序对应 Overridepublic ListString shortcutFieldOrder() {return Arrays.asList(key, value);}重写apply方法可以在chain.filter(exchange).then之前操作request之后操作responseserverWebExchange可以获取很多内容 Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// pre操作return chain.filter(exchange).then(Mono.fromRunnable(() - {// 异步post操作}));}};}yml文件中配置断言
Customtest, a自定义全局过滤器
创建GlobalFilter、Ordered接口实现类并Component注入
Component
public class CustomGlobalFilter implements GlobalFilter, Ordered重写getOrder方法方法返回的值越小过滤器的优先级越高 Overridepublic int getOrder() {return 0;}重写filter方法 Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// pre操作return chain.filter(exchange).then(Mono.fromRunnable(() - {// 异步post操作}));}