设计网站怎么收费,手机百度识图网页版入口,招聘网站分析如何做,想做交友网站怎么做本文主要介绍微服务中网关的作用#xff0c;并比较了几种主流网关的区别#xff0c;重点介绍了网关gateway。 一、背景介绍
在微服务架构中#xff0c;一个系统会被拆封成多个微服务#xff0c;每个微服务可以单独对外提供服务#xff0c;如果需要统一的对外服务入口则需… 本文主要介绍微服务中网关的作用并比较了几种主流网关的区别重点介绍了网关gateway。 一、背景介绍
在微服务架构中一个系统会被拆封成多个微服务每个微服务可以单独对外提供服务如果需要统一的对外服务入口则需要网关来实现网关记录业务微服务的服务名和地址每次调用可以正确的映射到正确的真实地址上。总的来说网关的作用有
路由转发外部接口对微服务的调用转发到对应的真实地址上。鉴权认证网关作为系统的入口可以在进入系统前进行鉴权和认证。流控对于进入的流量进行控制如果流量过大可以进行限流。监控针对进入的流量进行监控和告警也可以设置黑白名单等。
常见的网关对比
Zuul 1.0 : Netflix开源的网关使用Java开发基于Servlet架构构建便于二次开发。因为基于Servlet内部延迟严重并发场景不友好一个线程只能处理一次连接请求。Zuul 2.0 : 采用Netty实现异步非阻塞编程模型一个CPU一个线程能够处理所有的请求和响应请求响应的生命周期通过事件和回调进行处理减少线程数量开销较小。相比于zuul 1.0zuul 2.0实现的异步非阻塞的特性在性能上有较大提升。Gateway是springcloud的全新API网关项目旨在替换zuul的网关服务基于spring framework5.0springboot 2.0webFlux开发其也实现了异步非阻塞的特性有较高的性能其有丰富的过滤器类型可以根据自身需求来自定义过滤器。Nginx : 使用Nginx的反向代理和负载均衡实现对API服务器的负载均衡以及高可用一般放在整个系统的前端进行静态资源的负载均衡。Kong : 基于OpenRestyNginx Lua模块编写的高可用、易扩展的性能高效且稳定支持多个可用插件限流、鉴权等开箱即可用只支持HTTP协议且二次开发扩展难缺乏更易用的管理和配置方式
二、Gateway介绍
1.基本概念
Route(路由)路由是构建网关的基本模块它是由ID目标URI,一系列的断言和过滤器组成如果断言为true则匹配该路由。Predicate(断言)开发人员可以匹配HTTP请求中的所有内容(例如请求头或者请求参数)如果请求和断言相匹配则进行路由。Filter(过滤器)指的是spring框架中GatewayFiletr实例使用过滤器可以在请求被路由前或者后对请求进行修改。
2.主要流程 流程说明
Gateway Client 向 Spring Cloud Gateway 发送请求。请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文。然后网关的上下文会传递到 DispatcherHandler 它负责将请求分发给 RoutePredicateHandlerMapping。RoutePredicateHandlerMapping 负责路由查找并根据路由断言判断路由是否可用。如果过断言成功由 FilteringWebHandler 创建过滤器链并调用。通过特定于请求的 Fliter 链运行请求Filter 被虚线分隔的原因是Filter可以在发送代理请求之前pre和之后post运行逻辑。执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后将运行“post”过滤器逻辑。处理完毕之后将 Response 返回到 Gateway 客户端。
3.过滤器
todo
4.核心思想
用户发送的请求到达Gateway后根据请求的匹配条件来匹配真正地址这个匹配条件可以是URL也可以是服务名这个匹配条件即是断言Predicate匹配后的请求会经过一系列的过滤这个就是过滤器起作用的时候。
三、代码实践
利用Gateway作为微服务网关需要注册中心进行服务注册在本次实践中我们选用nacos作为注册中心。 1.配置pom文件
!--Gateway网关--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId!-- Maven整个生命周期内排除内置容器排除内置容器导出成war包可以让外部容器运行spring-boot项目--exclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions
/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId
/dependency!--nacos服务发现依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdexclusionsexclusiongroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/exclusion/exclusions
/dependency
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId
/dependencypom文件主要引入spring-cloud-starter-gateway网关和spring-cloud-starter-loadbalancer负债均衡其中可能存在以下问题
1由于spring-cloud-starter-gateway采用的是响应式的WebFlux web容器这和spring-boot-starter-web默认的web容器会冲突所以需要排除。一般的报错信息如下
Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type org.springframework.http.codec.ServerCodecConfigurer that could not be found.2引入负债均衡spring-cloud-starter-loadbalancer需要配排除nacos中的spring-cloud-starter-netflix-ribbon这两者会包冲突到时无法使用服务名来进行路由转发。
2.配置文件
server:port: 9010
spring:application:name: test-gatewaycloud:nacos:discovery:server-addr: x.x.x.x:8848enabled: truegateway:routes: # 网关路由配置- id: my-test # 路由id自定义只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://my-test # 路由的目标地址 lb就是负载均衡后面跟服务名称predicates: # 路由断言也就是判断请求是否符合路由规则的条件- Path/my-test/** # 这个是按照路径匹配只要以/user/开头就符合要求配置文件中主要在 s p r i n g . g a t e w a y . g a t e w a y 中其中 {spring.gateway.gateway}中其中 spring.gateway.gateway中其中{routes.uri}表示需要转发到的URL或者服务名。
3.过滤器
Slf4j
Component
public class MyFilter implements Ordered, GlobalFilter {/*** param exchange 可以拿到对应的request和response* param chain 过滤器链* return 是否放行*/Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {String name exchange.getRequest().getQueryParams().get(name).get(0);log.info(用户{} 开始进入系统, name);if (!StringUtils.isEmpty(name)) {if (name.equals(noName)) {log.info(用户没有访问权限);exchange.getResponse().setStatusCode(HttpStatus.PROXY_AUTHENTICATION_REQUIRED);return exchange.getResponse().setComplete();}}return chain.filter(exchange);}/*** 设定过滤器的优先级值越小则优先级越高* return*/Overridepublic int getOrder() {return 0;}
}如果需要在Gateway中实现过滤器可以实现GlobalFilter接口以上Filter是用来进行鉴权的如果进入网关的请求没有权限就会被拦截。 TODO 把过滤器的类别和作用写的更具体。
参考资料
这篇SpringCloud GateWay 详解你用的到https://juejin.cn/post/7107911617601339423#heading-1Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter 官方文档14.服务网关Zuul和Gatewayhttps://www.cnblogs.com/wmd-l/p/16324387.htmlSpring Cloud Gateway过滤器配置https://juejin.cn/post/7138740852720926733#heading-26