Feign与Gateway
Gateway的简介
Gateway是SpringCloud中的API网关,提供鉴权和路由的功能,以前用户可以直接访问服务,而有了网关,就像有了保安一样,需要核实身份信息,才可以放入访问服务。
Gateway的工作机制
客户端发送请求给Gateway网关,网关将请求发送给处理器映射(HandlerMapping)
网关通过路由的匹配,将请求发送给Web处理器处理,请求就需要经过一系列过滤器
过滤器分为“pre"前置和”post"后置两种,前置过滤器实现鉴权作用,后置过滤实现性能统计或日志收集
通过过滤器就到达需要的服务
Geteway的路由
Geteway路由规则
时间点后匹配
spring: cloud:gateway: routes:- id: after_route uri: https://example.org predicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
时间点前匹配
spring: cloud:gateway: routes: - id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
远程地址匹配
spring: cloud:gateway: routes: - id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24
使用注册中心时,uri以 lb: //开头(lb代表从注册中心获取服务),后面是需要转发到的服务名称
使用方法:
1)创建网关项目, 引入eureka-client和gateway依赖
2)编写配置
server: port: 9999spring: application:name: gateway-service cloud:gateway: routes:- id: goods-service-route uri: lb://goods-service predicates:- Path=/goods/**- id: order-service-route uri: lb://order-service predicates:- Path=/order/**,/orders/**eureka: client:register-with-eureka: truefetch-registry: trueserviceUrl: defaultZone: http://localhost:8888/eureka
Gareway的过滤器
从过滤器生命周期(影响时机点)的角度来说,主要有两个pre和post:
生命周期时机点 | 作用 |
pre | 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。 |
post | 这种过滤器在路由到微服务以后执行。这种过滤器可以用来为响应添加标准的HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。 |
从过滤器类型的角度,Spring Cloud GateWay的过滤器分为GateWayFilter和GlobalFilter两种
过滤器 | 影响范围 |
GateWayFilter | 应用到单个路由上 |
GlobalFilyer | 应用到所有的路由上 |
/** * 自定义全局过滤器,用于用户权限验证 */@Slf4j@Componentpublic class AuthenticationFilter implements GlobalFilter, Ordered {//过滤请求和响应@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获得请求和响应ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();//获得请求参数 如果有token=123456 就表示登录String token = request.getQueryParams().getFirst("token");log.info("url==>"+request.getURI());log.info("token==>"+token);if(!"123456".equals(token)){//如果没有参数token=123456,拒绝访问response.setStatusCode(HttpStatus.UNAUTHORIZED);String msg = "Request Denied!!";DataBuffer wrap = response.bufferFactory().wrap(msg.getBytes());retu response.writeWith(Mono.just(wrap));}//如果有就放行retu chain.filter(exchange);}//返回过滤器顺序,越小越靠前@Overridepublic int getOrder() {retu 0;}}
作者:爆爆啊
来源链接:https://blog.csdn.net/weixin_61195714/article/details/121959782
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。