自己做的网站怎么绑域名福州交通建设投资集团网站
news/
2025/10/8 1:01:42/
文章来源:
自己做的网站怎么绑域名,福州交通建设投资集团网站,国外做调查问卷的网站,营养早餐网站的设计与制作导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、G…
导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、Gateway 过滤器7.1 局部过滤器7.1.1 内置局部过滤器7.1.2 自定义局部过滤器7.2 全局过滤器7.2.1 内置全局过滤器7.2.2 自定义全局过滤器八、网关限流8.1 route纬度的网关限流8.2 自定义 API 分组的网关限流8.3 网关流控实现原理8.4 网关流控控制台总结一、什么是服务网关
服务网关也叫 API 网关。
所谓 API 网关就是指系统的统一入口它封装了应用程序的内部结构为客户端提供统一服务一些与业务本身功能无关的公共逻辑可以在这里实现如认证、鉴权、监控、路由转发等等。其本身也是一个可以注册到 Nacos 上的微服务
二、业界常见网关组件
Nginx lua脚本 使用 Nginx 的反向代理和负载均衡可实现对 api 服务器的负载均衡和高可用lua 是一种脚本语言可以用来编写简单的逻辑Nginx 支持 lua 脚本。Kong 基于 Nginx lua 开发性能高、稳定有多个可用插件限流、鉴权等开箱即用。 但支持 http 协议二次开发限制较大缺乏更易用的管控、配置方式。Zuul Netflix 开源的网关功能丰富使用 Java 开发易于二次开发。 但缺乏管控无法动态配置依赖组件多处理 http 请求需要依赖 web 容器性能不如 Nginx。Spring Cloud Gateway Spring 公司为了 替换 Zuul 而开发的网关组件。Spring Cloud 微服务 推荐使用的网关组件。
三、Spring Cloud Gateway
Spring Cloud Gateway 是 Spring 公司基于 Spring 5.0 Spring Boot 2.0 和 Project Reactor 等技术开发的网关旨在为微服务架构提供一种简单、有效、统一的 API 路由管理方式。目标是取代 Netflix Zuul 其不仅提供统一的路由方式并且基于 Filter 链的方式提供网关基本功能例如安全、监控和限流等。
优点
性能强劲是第一代网关 Zuul 的1.6 倍功能强大内置了很多实用功能如转发、监控、限流等设计优雅易扩展
缺点
依赖 Netty 和 WebFlux不是传统的 Servlet 编程模型学习成本高不能将其部署在 Tomcat 、Jetty 等 Servlet 容器中只能打 jar 包执行Spring Boot 2.0 以上才支持
四、Gateway 快速入门
使用 Spring Cloud Gateway 实现最简单的请求路由。
4.1 创建 gateway 服务
首先创建一个全新的 api-gateway 服务。
4.2 添加 gateway 依赖和 nacos 依赖
注意gateway 项目一定不要引入 web-starter 依赖因为 Gateway 本身不是基于 Servlet 实现。
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId
/dependency
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-nacos-discovery/artifactId
/dependencySlf4j
EnableDiscoveryClient
SpringBootApplication
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class);log.info(-------------------启动成功--------------------);}
}4.3 配置路由信息
先配置一些必须元素如端口号网关微服务的服务名称以及 nacos 注册地址
server:port: 7000
spring:application:name: shop-api-gatewaynacos:discovery:server-addr: localhost:8848然后再配置路由信息
spring:cloud:nacos:discovery:server-addr: localhost:8848 # 企业应用中一般也要把网关服务注册到 nacos 上gateway:discovery:locator:enabled: true # 开启网关服务发现定位器可以令 gateway 从nacos上定位具体的微服务地址routes: # 路由数组路由就是指当请求满足什么样的条件的时候转发到哪台服务器上- id: product_route # 当前路由的标识要求唯一默认UUID# uri: http:// localhost:8081 # 请求最终要被转发的地址uri: lb://service-product # 若使用 nacos 可以写微服务名称lb-loadbalance调用服务order: 1 # 指的是路由的优先级数字小优先级高predicates: # 断言条件判断返回值 boolean转发请求要满足的条件- Path/product-serv/** # 当请求路径满足 Path 指定的规则时此路由信息才会正常转发filters: # 过滤器在请求传递过程中对请求做一些手脚- StripPrefix1 # 在请求转发之前去掉一层路径对于 routes 配置如果想简单配置可直接忽略因为 Spring Cloud Gateway 提供了默认的路由规则用户可以直接在网关ip:port 地址和具体请求路径之间加入微服务名称就可以实现路由转发例如
http://localhost:7000/service-product/product/1但是企业级应用中往往会处于灵活的考虑配置 routes 选项。
4.4 测试路由转发
启动 shop-api-gateway 和 shop-product 微服务测试路由功能
网关服务启动在 7000 端口上服务也成功注册到 Nacos 上 请求网关服务获取商品信息 可以看到网关服务从 Nacos 上获取商品微服务的 ip 信息成功并且路由成功转发并返回了商品信息。
五、Gateway 执行流程
路由route是 gateway 中最基本的组件之一表示一个具体的路由信息载体。主要定义下面几个信息
id 路由标识区别其他 routeuri 路由指向的目的 uri即客户端请求最终转发到的微服务order用于多个 route 之间的排序数值越小匹配的优先级越高predicate 断言的作用是进行条件判断只有断言都返回 true 才能真正的执行路由filter过滤器用于修改请求和响应信息
路由的执行流程
客户端向 Gateway Server 发起请求请求首先被 HttpWebHandlerAdapter 进行提取组装成网关上下文然后网关的上下文会传递到 DispatcherHandler它负责将请求分发给 RoutePredicateHandlerMappingRoutePredicateHandlerMapping 负责路由查找并根据路由断言判断路由是否可用若断言成功由FilteringWebHandler 创建过滤器链并调用请求会依次经过 PreFilter -- 微服务– PostFilter 的方法最终响应回客户端 六、Gateway 断言
Predicate 断言用于进行条件判断只有断言都返回真才会真正的执行路由。 简单的说断言就是用来判断在什么条件下才能进行路由转发。
6.1 内置路由断言工厂
1、 基于 Datetime 类型的断言工厂 此类型断言根据时间做判断主要有三个 AfterRoutePredicateFactory接收一个日期参数判断请求日期是否晚于指定日期 BeforeRoutePredicateFactory接收一个日期参数判断请求日期是否早于指定日期 BetweenRoutePredicateFactory接收两个日期参数判断请求日期是否在指定日期之间 -After2019-12-31T23:59:59.78908:00[Asia/Shanghai] 2、基于远程地址的断言工厂 RemoteAddrRoutePredicateFactory: 接收一个IP 地址判断请求主机地址是否在地址段中 -RemoteAddr192.168.1.1/24 3、基于 Cookie 的断言工厂 CookieRoutePredicateFactory接收两个参数cookie 名字和一个正则表达式判断请求 cookie 是否具有给定名称且值与正则表达式匹配 -Cookiechocolate, ch. 4、基于 Header 的断言工厂 HeaderRoutePredicateFactory 接收两个参数标题名称和正则表达式。判断请求 header 中是否具有给定名称且值与正则表达式匹配。 -HeaderX-Request-Id,\d 5、基于权重的断言工厂 WeightRoutePredicateFactory接收一个[组名, 权重]然后对于同一个组内的路由按照权重转发例如下面的例子中有两个路由规则 weight_route1和weight_route2根据 Weight 的配置信息两个路由位于 同一group3中根据权重按照 1:9 的比例转发请求。 routes: -id:weight_route1 uri:host1 predicates: -Path/product/** -Weightgroup3,1 -id:weight_route2 uri:host2 predicates: -Path/product/** -Weightgroup3,9 6、其他类型的断言工厂 篇幅有限以下是 Gateway 内置的全部断言工厂它们都继承自 AbstractRoutePredicateFactory从命名就可以大体猜出它们的使用场景 HeaderRoutePredicateFactory PathRoutePredicateFactory BeforeRoutePredicateFactory CloudFoundryRouteServiceRoutePredicateFactory QueryRoutePredicateFactory RemoteAddrRoutePredicateFactory MethodRoutePredicateFactory CookieRoutePredicateFactory WeightRoutePredicateFactory AfterRoutePredicateFactory BetweenRoutePredicateFactory HostRoutePredicateFactory ReadBodyPredicateFactory 6.2 自定义路由断言工厂
自定义一个路由断言要求实现只允许年龄在 18 ~ 60 的请求访问。
1、声明一个断言 2、自定义断言工厂 创建一个专用的 predicates 包用于存放各种断言工厂类然后创建 AgeRoutePredicateFactory
Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactoryAgeRoutePredicateFactory.Config {public AgeRoutePredicateFactory() {super(AgeRoutePredicateFactory.Config.class);}public ListString shortcutFieldOrder() {return Arrays.asList(minAge, maxAge);}public PredicateServerWebExchange apply(AgeRoutePredicateFactory.Config config) {return new PredicateServerWebExchange() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {String ageStr serverWebExchange.getRequest().getQueryParams().getFirst(age);if (!StringUtils.isEmpty(ageStr)) {Integer age Integer.valueOf(ageStr);return age config.getMinAge() age config.getMaxAge();}return false;}};}DataNoArgsConstructorpublic static class Config {private int minAge;private int maxAge;}
}代码逻辑基本可以参考已有的 AbstractRoutePredicateFactory 的内置实现类apply 方法是主要返回一个函数接口 Predicate可以使用Lambda表达式 ServerWebExchange 是一个可以从中取出 请求Request 的对象剩下的就是进行 Request 中的各种判断逻辑了上述代码示例中只是简单的从请求中取出 age 属性判断年龄区间是否符合配置条件。
3、测试 启动 nacos将 gateway 和 product 微服务都注册上去然后分别尝试请求 不同的 age 属性 只要在 18 ~ 60 之间的 age 属性都可以请求成功反之则路由拦截说明我们的 断言生效了。
七、Gateway 过滤器
过滤器的作用就是在请求的传递过程中对请求和响应对象做一些手脚。 在 Gateway 中过滤器的生命周期只有两个pre 和 post。 pre这种过滤器在请求被真正转发之前调用可以利用这种过滤器实现身份验证、在集群中选择请求的微服务负载均衡、记录调试信息等。 post这种过滤器在gateway 收到微服务的响应之后执行这种过滤器可用来为响应添加标准的 http header、收集统计信息和指标、将响应从微服务发送到客户端等。 Gateway 的 Filter 从作用范围可分为 GatewayFilter 和 GlobalFilter。 GatewayFilter 应用到单个路由或一个分组的路由上 GlobalFilter应用到所有路由上
7.1 局部过滤器
7.1.1 内置局部过滤器
过滤器的用法和断言类似所有的内置过滤器名称都遵循 配置 GatewayFilterFactory 这样的格式。
内置局部过滤器有很多都继承自 AbstractGatewayFilterFactory以 SetStatusGatewayFilterFactory 为例演示一下 SetStatus 过滤器的用法。
使用 SetStatus 可以修改响应码
spring:cloud:gateway:routes:- id:uri: ## 其他属性...filters: # 过滤器在请求传递过程中对请求做一些手脚- SetStatus222 # 将响应码改为 2227.1.2 自定义局部过滤器
1、添加一个日志级别过滤器 该过滤器并没有什么实质的意义只是用于演示过滤器的自定义逻辑
spring:cloud:gateway:routes:- id:uri: ## 其他属性...filters: # 过滤器在请求传递过程中对请求做一些手脚- Logtrue,false # LogconsoleLog,cacheLog 开启consoleLog不开启cacheLog2、编写过滤器工厂类
Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactoryLogGatewayFilterFactory.Config {public LogGatewayFilterFactory() {super(LogGatewayFilterFactory.Config.class);}public ListString shortcutFieldOrder() {return Arrays.asList(consoleLog, cacheLog);}public GatewayFilter apply(LogGatewayFilterFactory.Config config) {return new GatewayFilter() {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {if (config.isConsoleLog()) {System.out.println(consoleLog 开启了);} else if (config.isCacheLog()) {System.out.println(cacheLog 开启了);}// 将过滤器链传递下去return chain.filter(exchange);}};}DataNoArgsConstructorpublic static class Config {private boolean consoleLog;private boolean cacheLog;}
}3、测试 请求网关路由接口后台观察日志
7.2 全局过滤器
全局过滤器作用于所有路由无需配置。通过全局过滤器可以实现对权限的统一校验安全性验证等功能。
7.2.1 内置全局过滤器 7.2.2 自定义全局过滤器
自定义全局鉴权过滤器。 如上图所示当客户端第一次访问的时候网关服务会先去授权中心请求登录授权并颁发token凭证然后客户端每次访问微服务的时候就携带 token 进行请求。那么在网关中我们就可以自定义一个全局的鉴权过滤器来完成第一次请求的鉴权工作。
这里简单实现鉴权的逻辑颁发凭证等更细节的内容不做展开。
1、自定义全局过滤器类
Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token exchange.getRequest().getQueryParams().getFirst(token);if (!StringUtils.equals(admin, token)) {System.out.println(鉴权失败);exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 调用 chain.filter 继续向下执行return chain.filter(exchange);}Overridepublic int getOrder() {return 0;}
}2、测试鉴权过滤 全局过滤器无需配置自动生效我们写好 AuthGlobalFilter 之后将其注册到 Spring 容器中即可。打开浏览器访问路由接口发现返回结果为 401 若添加 tokenadmin则可以访问成功
八、网关限流
官方文档网关限流
网关是所有请求的公共入口所以可以在网关进行限流本节采用 Sentinel 组件来实现网关限流。Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流网关进行限流。 从 1.6.0 版本开始Sentinel 提供了 Spring Cloud Gateway 的适配模块可以提供两种资源纬度的限流
route 纬度即在Spring 配置文件中配置路由条目资源名为对应的 routeId自定义API纬度用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
8.1 route纬度的网关限流
1、在服务网关模块加入 sentinel 的网关适配依赖 dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-spring-cloud-gateway-adapter/artifactId/dependency2、编写配置类 基于 Sentinel 的 Gateway 限流是通过其提供的 Filter 来完成的使用时只需要注入对应的 SentinelGatewayFilter 实例以及 SentinelGatewayBlockExceptionHandler 实例即可。
Configuration
public class GatewayConfiguration {private final ListViewResolver viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public GatewayConfiguration(ObjectProviderListViewResolver viewResolversProvider,ServerCodecConfigurer serverCodecConfigurer) {this.viewResolvers viewResolversProvider.getIfAvailable(Collections::emptyList);this.serverCodecConfigurer serverCodecConfigurer;}BeanOrder(Ordered.HIGHEST_PRECEDENCE)public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {// Register the block exception handler for Spring Cloud Gateway.return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);}BeanOrder(Ordered.HIGHEST_PRECEDENCE)public GlobalFilter sentinelGatewayFilter() {return new SentinelGatewayFilter();}
}
8.2 自定义 API 分组的网关限流
官方参考文档网关限流
8.3 网关流控实现原理
当通过 GatewayRuleManager 加载网关流控规则GatewayFlowRule时无论是否针对请求属性进行限流Sentinel 底层都会将网关流控规则转化为热点参数规则ParamFlowRule存储在 GatewayRuleManager 中与正常的热点参数规则相隔离。转换时 Sentinel 会根据请求属性配置为网关流控规则设置参数索引idx并同步到生成的热点参数规则中。
外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性并依照参数索引顺序组装参数数组最终传入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则根据传入的参数依次进行规则检查。若某条规则不针对请求属性则会在参数最后一个位置置入预设的常量达到普通流控的效果。
8.4 网关流控控制台
Sentinel 1.6.3 引入了网关流控控制台的支持用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控管理网关规则和 API 分组配置。
在 API Gateway 端用户只需要在原有启动参数的基础上添加如下启动参数即可标记应用为 API Gateway 类型
# 注通过 Spring Cloud Alibaba Sentinel 自动接入的 API Gateway 整合则无需此参数
-Dcsp.sentinel.app.type1添加正确的启动参数并有访问量后我们就可以在 Sentinel 上面看到对应的 API Gateway 了。我们可以查看实时的 route 和自定义 API 分组的监控和调用信息并针对其配置规则
总结
api 服务网关提供统一的服务入口通过路由、断言、过滤器可以实现诸如负载均衡、路由判定、网关限流、鉴权等功能。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931012.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!