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_route uri: https://example.org predicates: - Before=2017-01-20T17:42:47.789-07:00[America/Denver]远程地址匹配
spring: cloud: gateway: routes: - id: remoteaddr_route uri: https://example.org predicates: - RemoteAddr=192.168.1.1/24使用注册中心时,uri以 lb: //开头(lb代表从注册中心获取服务),后面是需要转发到的服务名称
使用方法:
1)创建网关项目, 引入eureka-client和gateway依赖
2)编写配置
server: port: 9999 spring: application: name: gateway-service cloud: gateway: routes: - id: goods-service-route uri: lb://goods-service predicates: - Path=/goods @Slf4j @Component public class AuthenticationFilter implements GlobalFilter, Ordered { //过滤请求和响应 @Override public Monofilter(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()); return response.writeWith(Mono.just(wrap)); } //如果有就放行 return chain.filter(exchange); } //返回过滤器顺序,越小越靠前 @Override public int getOrder() { return 0; } } 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)