东莞松山湖华为,网站过度优化首页被k,做公益筹集项目的网站,网络维护人员招聘目录
API网关
好处
解决方案
Gateway
简介
特征
核心概念
Route(路由)
Predicate(断言)
Filter(过滤器)
工作流程
Route(路由)
路由配置方式
1.yml配置文件路由
2.bean进行配置
3.动态路由
动态路由
Predicate(断言)
特点
常见断言
示例
Filter(过滤器) …目录
API网关
好处
解决方案
Gateway
简介
特征
核心概念
Route(路由)
Predicate(断言)
Filter(过滤器)
工作流程
Route(路由)
路由配置方式
1.yml配置文件路由
2.bean进行配置
3.动态路由
动态路由
Predicate(断言)
特点
常见断言
示例
Filter(过滤器)
filter分类
Pre 类型
Post 类型
网关过滤器
格式
示例
全局过滤器
示例 在微服务架构中一个系统由多个微服务组成而这些服务可能部署在不同的地区、不同的机房客户端想要连接就需要知道它们具体的地址信息
存在问题
1.当服务数量众多时客户端需要维护大量的服务地址这对于客户端来说是非常繁琐的
2.某些情况下存在跨域请求问题
3.认证难度大每个微服务需要独立认证
API网关 网关是一个搭建在客户端和微服务之间的服务我们可以在 API 网关中处理一些非业务功能的逻辑例如权限验证、监控、缓存、请求路由等 网关就像整个微服务系统的门面一样是系统对外的唯一入口。有了它客户端会先将请求发送到 API 网关然后由 API 网关根据请求的标识信息将请求转发到微服务实例 好处
1.网关与微服务交互时客户端只需要知道网关地址即可而不需要维护大量的服务地址简化了客户端的开发
2.客户端直接与网关通信能够减少客户端与各个服务的交互次数
3.客户端与后端的服务耦合度降低
4.节省流量提高性能提升用户体验
5.网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能
解决方案
1.gateway
2.zuul
3.kong
4.NginxLua
Gateway
简介 Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件旨在提供一种简单而有效的途径来发送 API并为它们提供横切关注点例如安全性监控/指标和弹性
特征
1.基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建
2.任意请求属性上匹配路由
3.断言 和过滤器是特定于路由的
4.集成了 Hystrix 熔断器
5.集成了 Spring Cloud DiscoveryClient服务发现客户端
6.易于编写断言和过滤器
7.能够限制请求频率
8.能够重写请求路径
核心概念
gateway最主要的功能就是路由转发而在定义转发规则时主要涉及到三个核心概念
Route(路由) 网关最基本的模块。它由一个 ID、一个目标 URI、一组断言Predicate和一组过滤器Filter组成
Predicate(断言) 路由转发的判断条件我们可以通过 Predicate 对 HTTP 请求进行匹配例如请求方式、请求路径、请求头、参数等如果请求与断言匹配成功则将请求转发到相应的服务。
Filter(过滤器) 我们可以使用它对请求进行拦截和修改还可以使用它对上文的响应进行再处理
工作流程 说明
1.客户端将请求发送到gateway
2.gateway通过gateway Handler Mapping找到相匹配得到路由将其发送给gateway web Handler
3.gateway web Handler通过指定的过滤器链将请求转发到实际的服务节点中执行业务返回响应结果
注意
1.过滤器之间用虚线分开是因为过滤器可能会在转发请求之前pre或之后post执行业务逻辑
2.过滤器Filter可以在请求被转发到服务端前对请求进行拦截和修改例如参数校验、权限校验、流量监控、日志输出以及协议转换等
3.过滤器可以在响应返回客户端之前对响应进行拦截和再处理例如修改响应内容或响应头、日志输出、流量监控等。 Gateway 的请求需要通过一定的匹配条件才能定位到真正的服务节点。在将请求转发到服务进行处理的过程前后pre 和 post我们还可以对请求和响应进行一些精细化控制。
Route(路由) 路由是网关最基础的部分路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成。如果断言为真则说明请求URL和配置的路由匹配。
格式 id我们自定义的路由 ID保持唯一
uri目标服务地址
路由配置方式
1.yml配置文件路由
#第一种ws(websocket)方式: uri: ws://localhost:8888
#第二种http方式: uri: http://localhost:8888/
#第三种lb(注册中心中服务名字)方式: uri: lb://consumer
spring:cloud:gateway:routes:# 路由id,没有固定规则建议配合服务名- id: consumer# 匹配后提供服务的路由地址# 需要注意的是uri的协议为lb表示启用Gateway的负载均衡功能。lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri。uri: lb://consumerpredicates:# 断言路径相匹配的进行路由- Path/**2.bean进行配置
Configuration
public class GatewayConfig {Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes routeLocatorBuilder.routes();// 第一个参数是路由的唯一idroutes.route(consumer,r - r.path(/hello).uri(http://localhost:8888/hello)).build();return routes.build();}
}3.动态路由
可以通过服务名进行转发无需配置routes也可以转发
spring:application:name: gatewaycloud:gateway:discovery:locator:#开启根据微服务名称自动转发enabled: true#小写lower-case-service-id: true动态路由 默认情况下Gateway 会根据服务注册中心中维护的服务列表以服务名作为路径创建动态路由进行转发从而实现动态路由功能。
形式 lb://service-name lburi 的协议表示开启 Spring Cloud Gateway 的负载均衡功能。
service-name服务名Spring Cloud Gateway 会根据它获取到具体的微服务地址。
Predicate(断言) Predicate 断言来实现 Route 路由的匹配规则。Predicate 是路由转发的判断条件请求只有满足了 Predicate 的条件才会被转发到指定的服务上进行处理
特点
1.路由与断言的关系为一对多一个路由可以包含多个不同断言
2.一个请求想转发到指定的路由上就必须同时匹配路由上的所有断言
3.当一个请求同时满足多个路由的断言条件时请求只会被首个成功匹配的路由转发 常见断言 示例
配置文件 application.yml中添加配置内容
server:port: 9527 #端口号
spring:application:name: microServiceCloudGatewaycloud:gateway: #网关路由配置routes:#将 micro-service-cloud-provider-dept-8001 提供的服务隐藏起来不暴露给客户端只给客户端暴露 API 网关的地址 9527- id: provider_dept_list_routh #路由 id,没有固定规则但唯一建议与服务名对应uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:#以下是断言条件必选全部符合条件- Path/dept/list/** #断言路径匹配 注意Path 中 P 为大写- MethodGET #只能时 GET 请求时才能访问
配置中在 spring.cloud.gateway.routes 下使用 predicates 属性定义了以下两个断言条件 - Path/dept/list/* -MethodGET HTTP 请求同时满足以上所有的断言时该请求才会被转发到指定的服务端中 Filter(过滤器) 出于安全方面的考虑服务端提供的服务往往都会有一定的校验逻辑例如用户登陆状态校验、签名校验等微服务架构中系统由多个微服务组成所有这些服务都需要这些校验逻辑此时我们就可以将这些校验逻辑写到Gateway的 Filter 过滤器中。
filter分类
Gateway 提供了以下两种类型的过滤器可以对请求和响应进行精细化控制
Pre 类型 这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改例如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。
Post 类型 这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理例如修改响应内容或响应头、日志输出、流量监控等。
网关过滤器
GatewayFilter 是 Gateway 网关中提供的一种应用在单个或一组路由上的过滤器。它可以对单个路由或者一组路由上传入的请求和传出响应进行拦截并实现一些与业务无关的功能比如登陆状态校验、签名校验、权限校验、日志输出、流量监控等
格式 spring:cloud:gateway: routes:- id: xxxxuri: xxxxpredicates:- Pathxxxxfilters:- AddRequestParameterX-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头名称为 X-Request-Id 值为 1024- PrefixPath/dept #在请求路径前面加上 /dept……
Gateway 内置了多达 31 种 GatewayFilter下表中列举了几种常用的网关过滤器及其使用示例 示例
application.yml 中在添加一个动态路由 - id: provider_dept_get_routh uri: lb://MICROSERVICECLOUDPROVIDERDEPT #使用服务名代替上面的具体带端口 predicates: - Path/get/** filters: - PrefixPath/dept #在请求路径上增加一个前缀 /dept 全局过滤器 GlobalFilter 是一种作用于所有的路由上的全局过滤器通过它我们可以实现一些统一化的业务功能例如权限认证、IP 访问限制等。当某个请求被路由匹配时那么所有的 GlobalFilter 会和该路由自身配置的 GatewayFilter 组合成一个过滤器链
示例
1.新建一个名为 MyGlobalFilter 全局过滤器配置类
/**
* 自定义全局网关过滤器GlobalFilter
*/
Component
Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(进入自定义的全局过滤器 MyGlobalFilter new Date());String uname exchange.getRequest().getQueryParams().getFirst(uname);if (uname null) {log.info(参数 uname 不能为 null);exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}Overridepublic int getOrder() {//过滤器的顺序0 表示第一个return 0;}
}
2.使用浏览器访问“http://eureka7001.com:9527/dept/list”我们会发现访问报 406 错误 3.浏览器访问“http://eureka7001.com:9527/dept/list?uname123”