zoukankan      html  css  js  c++  java
  • SpringCloud GateWay 使用 网关路由

    GateWay之路由转发和过滤

    在一个Gateway项目(配置了eureka等组件)中进行配置

    server:
      port: 9006
    spring:
      application:
        name: zhao-service-gateway
      cloud:
        gateway:
          routes:
           - id: service-autodeliver-router
             #uri: http://127.0.0.1:8091
             uri: lb://zhao-service-autodeliver
             predicates:
              - Path= /autodeliver/**
           - id: service-resume-router
             #uri: http://127.0.0.1:8081
             uri: lb://zhao-service-resume
             predicates:
               - Path=/resume/**
             filters:
               - StripPrefix=1

    通过第一个服务hao-service-autodeliver的配置形式,使用固定ip和服务名均可正常通过网关项目访问到服务,但是固定ip的方式不太灵活,而 lb://zhao-service-autodeliver可以实现随机的负载均衡,且不用填写固定ip也避免了不要的麻烦
    file
    第二个服务配置中 filters:- StripPrefix=1这个配置会过滤掉第一个路径配置,所以我们在最后访问的时候,除了需要加上第一个过滤掉的配置,还需要加上原本的配置。访问形式如下
    file

    GateWay断言

    上述针对路径的配置即是断言predicates的配置,而Gateway还内置了以下几种断言
    file
    基本上上述断言都是基于请求携带的信息进行过滤的,在实际操作过程中可以综合使用这些信息来达到我们想要的操作

    GateWay自定义全局过滤器

    //www.fhadmin.cn
    @Component
    @Slf4j
    public class BlackListFilter implements GlobalFilter, Ordered{
        private  static final List<String> blackList=new ArrayList<>();
        static {
            blackList.add("0:0:0:0:0:0:0:1");//模拟本机ip地址
        }
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response =exchange.getResponse();
            String clientIp = request.getRemoteAddress().getHostString();
            if (blackList.contains(clientIp)){
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                log.error(clientIp+"在黑名单中,拒绝访问");
                String data = "request be denied";
                DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
                return response.writeWith(Mono.just(wrap));
            }
            return chain.filter(exchange);
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }

    通过该过滤器拦截了黑名单中的请求(该操作在实际中可借助mysql或redis等数据存储实现),实现效果
    file

    GateWay的高可用

    ⽹关作为⾮常核⼼的⼀个部件,如果挂掉,那么所有请求都可能⽆法路由处理,因此我们需要做GateWay的⾼可⽤。GateWay的⾼可⽤很简单:可以启动多个GateWay实例来实现⾼可⽤,在GateWay的上游使⽤Nginx等负载均衡设备进⾏负载转发以达到⾼可⽤的⽬的。启动多个GateWay实例(假如说两个,⼀个端⼝9002,⼀个端⼝9003),剩下的就是使⽤Nginx等完成负载代理即可。

  • 相关阅读:
    mybatis批量处理sql
    jdbc连接数据库使用sid和service_name的区别
    js 监听浏览器刷新还是关闭事件
    websocket
    hutool java工具架包功能介绍
    SpringMvc+ajax 实现json格式数据传递
    springMVC form表单提交多个对象集合--使用ajax提交--前台json格式数据封装方法
    linux C之判断文件或目录是否存在 access函数
    Linux C -> symlink 和 readlink -> 符号链接
    linux c开发: 在程序退出时进行处理
  • 原文地址:https://www.cnblogs.com/teacher11/p/15029623.html
Copyright © 2011-2022 走看看