ToB企服应用市场:ToB评测及商务社交产业平台

标题: 服务网关-GateWay-微服务核心组件【分布式微服务笔记05】 [打印本页]

作者: tsx81428    时间: 2024-7-26 14:56
标题: 服务网关-GateWay-微服务核心组件【分布式微服务笔记05】
服务网关-GateWay-微服务核心组件【分布式微服务笔记05】

服务网关-GateWay

引出GateWay

当我们后端的服务部署在差别的ip和端口上,存在一些问题:
引入GateWay后项目


GateWay网络拓扑图


GateWay根本介绍

GateWay核心功能

Gateway 和Zuul 区别

Gateway 特性

Spring Cloud Gateway 基于Spring Framework(支持Spring WebFlux),Project Reactor 和 Spring Boot 进行构建,具有如下特性:
Gateway 根本原理


Route(路由)

路由是构建网关的根本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true 则匹配该路由
Predicate(断言)

Filter(过滤)

GateWay工作机制


GateWay代码实现

必要将服务斲丧方升级成服务网关
更改GateWay负载均衡算法

只必要添加配置类即可【默认的轮询算法足够应对大多业务】
  1. //配置自己的负载均衡算法
  2. @Configuration
  3. public class RibbonRule {
  4. //    配置注入负载均衡算法
  5.     @Bean
  6.     public IRule myRibbonRule(){
  7.         return new RandomRule();//new 的就是负载均衡算法 ,自己选择,这里是随机算法
  8.     }
  9. }
复制代码
Predicate-断言

Predicate 就是一组匹配规则,当哀求匹配乐成,就执行对应的Route;当匹配失败,放弃处理/转发
Route Predicate factory - 路由断言工厂

After Router Predicate-根据时间之后匹配

例如 只有2024-7-26 11:11:11 之后的哀求才进行匹配/转发, 不满足该条件的,不处理
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - After=2024-07-26T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之后
复制代码
Before Route Predicate-根据时间之前匹配

例如 只有2024-7-26 11:11:11 之前的哀求才进行匹配/转发, 不满足该条件的,不处理
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Before=2024-07-26T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之前
复制代码
Between Route Predicate-根据时间之间匹配

例如 只有2024-7-26 11:11:11 和 2024-7-29 11:11:11 之间的哀求才进行匹配/转发, 不满足该条件的,不处理
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Between=2024-07-26T11:11:11.000+08:00[Asia/Shanghai],2024-07-29T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之间            
复制代码
Cookie Route Predicate-根据Cookie匹配

哀求带有Cookie,并且键值对有一定要求【值 也可以是一个正则表达式】
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Cookie=name,zy #键:name    值: zy 【值 也可以是一个正则表达式】
复制代码
Header Route Predicate-根据哀求头匹配

哀求头Header 有Authorization, 并且值admin才匹配/断言乐成
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Header=Authorization,admin #Authorization是请求头中的一个属性,【值 也可以是一个正则表达式】
复制代码
Host Route Predicate-根据主机名匹配

哀求Host 满足一定要求 才匹配/断言乐成
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Host=**.zy.**,**.zy88.** #【可以有多个,用逗号间隔】
复制代码
Method Route Predicate-根据哀求方式匹配

哀求方式满足一定要求【post/get/delete......】 才匹配/断言乐成
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**
  15.             - Method=POST,GET #【可以有多个,用逗号间隔】
复制代码
Path Route Predicate-根据路径匹配

路径满足一定要求 才匹配/断言乐成
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                         #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/**,/member/save #【可以有多个路径】
复制代码
Query Route Predicate-根据哀求参数匹配
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                 #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/** #【可以有多个路径】
  15.             - Query=email, [\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+ #【可以是正则表达式】
复制代码
RemoteAddr Route Predicate-根据远程地址匹配

调用端远程地址是否满足 来判定
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.                 #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
  12.           uri: lb://member-service-provider
  13.           predicates: #断言,可以多种形式
  14.             - Path=/member/get/** #【可以有多个路径】
  15.             - RemoteAddr=127.0.0.1  #调用端的远程地址
复制代码
Filter-过滤器

GatewayFilter

GatewayFilter是GatewayFilter的工厂类来产生内置Filter,有31种
  1. spring:
  2.   application:
  3.     name: e-commerce-gateway-20000 #配置应用的名称
  4.   cloud:
  5.     gateway:
  6.       discovery:
  7.         locator:
  8.           enabled: true #启用 DiscoveryClient 服务发现
  9.       routes:
  10.         - id: member_route01 #路由的ID
  11.           uri: lb://member-service-provider
  12.           predicates: #断言,可以多种形式
  13.             - Path=/member/get/** #【可以有多个路径】
  14.           filters:
  15.             - AddRequestParameter=role, admin #过滤器可以有多个
  16.             - AddRequestParameter=address, beijing
复制代码
自界说过滤器GlobalFilter

开发直接使用GatewayFilter 较少,一般使用自界说过滤器
  1. @Component
  2. public class CustomGateWayFilter implements GlobalFilter, Ordered {
  3.     //filter 方法写的就是过滤业务
  4.     @Override
  5.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6.         //获取对应的参数值
  7.         //getFirst 请求的是键username获取到的值的集合的第一个
  8.         String username = exchange.getRequest().getQueryParams().getFirst("username");
  9.         String pwd = exchange.getRequest().getQueryParams().getFirst("pwd");
  10.         if (!("zy".equals(username) && "123456".equals(pwd))){
  11.             exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//设置状态码
  12.             return exchange.getResponse().setComplete();
  13.         }
  14.         //放行
  15.         return chain.filter(exchange);
  16.     }
  17.     //order 表示过滤器执行的顺序,数字越小,优先级越高
  18.     @Override
  19.     public int getOrder() {
  20.         return 0; //指定优先级
  21.     }
  22. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4