• springcloud网关和过滤器的初步使用


    1、创建数据库
    在实际开发过程中,如果使用 Nacos 的话,为了确保高可用,我们一般都
    会对其进行集群的部署。 Nacos 规定集群中 Nacos 节点的数量需要 大于等
    3 ;同时,单机模式下 Nacos 的数据默认保存在其内嵌数据库中 deby
    不方便观察数据存储的基本情况。而且如果集群中启动多个默认配置下的
    Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题, Nacos
    采用了集中式存储的方式来支持集群化部署,目前只支持 MySQL 的存储;
    此外,我们还需要借助 Nginx 实现负载均衡。这一过程的部署架构图如下所
    示:

     

    创建成功后

     1.1. 指定使用mysql作为数据存储

    1.2 配置集群文件

     

    注意:在连接数据库之前,要先测试数据库是否可以远程连接,如果不能,则需要为数据库配置远程连接。

    1.3 停止nacos并复制三份

    然后找到 bin/startup.cmd 将三个nacos全部启动

    启动成功后

     1.4 搭建nginx代理上面三个nacos

    注意:这里开启的nginx是windows版本

    打开 conf/nginx.conf

    在任务管理中的详细信息找到如下图所示,表示成功

     开启成功后,登录nacos。账号和密码默认都是nacos,出现下图的情况,就证明集群模式创建成功了

    1.5 微服务注册到nacos集群上

    2. gateway网关

    2.1 网关的使用

     (1)创建一个gateway微服务模块

    (2) 加入相关的依赖
    
    
        org.springframework.cloud
        spring-cloud-starter-gateway
    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-discovery
    

    (3)配置文件

    server :
      port : 7000
      spring :
      application :
      name : springcloud-gateway
      # 路由转发 List routes
      cloud :
      gateway :
      routes : 12 - id : springcloud-product
      # 路由转发的真实地址
      uri : http : //localhost : 8081
      # predicates: 当满足断言时,才会转发到真实的 uri
    址。
      predicates :
       - Path=/product/**

    (4)主启动类

    @SpringBootApplication
    public class Gateway {
        public static void main(String[] args) {
            SpringApplication.run(Gateway.class,args);
        }
    }
    

    2.2 gateway网关从注册中心拉取服务型

    (1 )引入依赖
            com.alibaba.cloud
            spring-cloud-starter-alibaba- nacos-discovery
    (2 )配置文件中指定注册中心的地址

    如果在访问订单微服务也就是 lb://springcloud-order  时出现 503 的情况 ,可以将lb://springcloud-order 装换为http://127.0.0.1:(订单微服务的端口号)

    2.3 gateway自动路由

    修改配置文件
    将上面“配置文件中指定注册中心的地址”图片中的代码全部注释(后面还要用)然后写下面的代码
    cloud:
        gateway:
          discovery:
            locator:
              enabled: true
    
        nacos:
          server-addr: localhost:81
    

    访问时 :
    http:// 网关的 ip: 网关的 port/ 微服务名称 / 资源路径

    2.4 网关的跨域问题

    (1)配置类进行跨域

     

    (2)注解进行网关跨域

    cloud:
      gateway:
        globalcors:
          cors-configurations:
            '[/**]':
              allowedOrigins: "*"
              allowedMethods:
                - GET
                - POST
                - DELETE
                - PUT
                - OPTION

     3 Gateway断言

    3.1了解断言

    gateway 中内置很多断言器,
    SpringCloud Gateway 包括许多内置的断言工厂,所有这些断言都与
    HTTP 请求的不同属性匹配体如下:
    l * 基于 **Datetime** 类型的断言工厂 *
    此类型的断言根据时间做判断,主要有三个:
    AfterRoutePredicateFactory : 接收一个日期参数,判断请求日期是
    否晚于指定日期
    BeforeRoutePredicateFactory : 接收一个日期参数,判断请求日期
    是否早于指定日期 BetweenRoutePredicateFactory : 接收两个日期参数,判断请求日
    期是否在指定时间段内
    -After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]
    l * 基于远程地址的断言工厂 *
    *RemoteAddrRoutePredicateFactory** *
    接收一个 IP 地址段,判断请求主机地址是否在地址段中
    -RemoteAddr=192.168.1.1/24
    l * 基于 **Cookie** 的断言工厂 *
    CookieRoutePredicateFactory :接收两个参数, cookie 名字和一个
    正则表达式。 判断请求
    cookie 是否具有给定名称且值与正则表达式匹配。
    -Cookie=chocolate, ch.
    l * 基于 **Header** 的断言工厂 *
    HeaderRoutePredicateFactory :接收两个参数,标题名称和正则表
    达式。 判断请求 Header 是否
    具有给定名称且值与正则表达式匹配。 key value
    -Header=X-Request-Id, \d+
    l * 基于 **Host** 的断言工厂 *
    HostRoutePredicateFactory :接收一个参数,主机名模式。判断请求
    Host 是否满足匹配规则。
    -Host=**.testhost.org
    l * 基于 **Method** 请求方法的断言工厂 *
    MethodRoutePredicateFactory :接收一个参数,判断请求类型是否
    跟指定的类型匹配。
    -Method=GET
    l * 基于 **Path** 请求路径的断言工厂 * PathRoutePredicateFactory :接收一个参数,判断请求的 URI 部分是
    否满足路径规则。
    -Path=/foo/{segment} 基于 Query 请求参数的断言工厂
    QueryRoutePredicateFactory :接收两个参数,请求 param 和正则表
    达式, 判断请求参数是否具
    有给定名称且值与正则表达式匹配。
    -Query=baz, ba.
    l * 基于路由权重的断言工厂 *
    WeightRoutePredicateFactory :接收一个 [ 组名 , 权重 ], 然后对于同一
    个组内的路由按照权重转发
    routes:
    -id: weight_route1 uri: host1 predicates:
    -Path=/product/**
    -Weight=group3, 1
    -id: weight_route2 uri: host2 predicates:
    -Path=/product/**
    -Weight= group3, 9
    如果上面内置的断言不能满足你的需求:可以自定义断言。
    注意 : 名称必须为 XXXRoutePredicateFactory 并且继承
    AbstractRoutePredicateFactory
    使用xxx=

    4、过滤器

    作用 : 认证校验 黑白名单 敏感词

    过滤器的使用

    (1)引入依赖

    
        com.alibaba
        fastjson
        1.2.83
    

    (2)创建一个实体类

    @Component
    @ConfigurationProperties(prefix = "anon")
    public class Anon {
        private List url;
    
        public List getUrl() {
            return url;
        }
    
        public void setUrl(List url) {
            this.url = url;
        }
    }

    (3)过滤器的相关代码

    1. @Component
    2. public class LoginFilter implements GlobalFilter, Ordered {
    3. @Autowired
    4. private Anon anon;
    5. //过滤方法 过滤业务
    6. @Override
    7. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    8. ServerHttpRequest request = exchange.getRequest();
    9. ServerHttpResponse response = exchange.getResponse();
    10. //0.获取请求
    11. String path = request.getPath().toString();
    12. //1.判断当前的请求路径是否为放行路径
    13. if(anon.getUrl().contains(path)){
    14. return chain.filter(exchange);//放行
    15. }
    16. //2. 判断是否携带token
    17. String token = request.getHeaders().getFirst("token");
    18. if(StringUtils.hasText(token)&&"admin".equals(token)){//redis
    19. return chain.filter(exchange);//放行
    20. }
    21. //3.返回一个json数据。
    22. //3.1设置状态码
    23. response.setStatusCode(HttpStatus.UNAUTHORIZED);
    24. //3.2封装返回数据
    25. Map map = new HashMap<>();
    26. map.put("msg", "未登录");
    27. map.put("code", 4000);
    28. //3.3作JSON转换
    29. byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8);
    30. //3.4调用bufferFactory方法,生成DataBuffer对象
    31. DataBuffer buffer = response.bufferFactory().wrap(bytes);
    32. //4.调用Mono中的just方法,返回要写给前端的JSON数据
    33. return response.writeWith(Mono.just(buffer));
    34. }
    35. //优先级 返回的值越小优先级越高
    36. @Override
    37. public int getOrder() {
    38. return 0;
    39. }
    40. }

    (4)设置放行的路径

  • 相关阅读:
    主流的深度学习推理架构有哪些(NCNNN)
    JavaSE入门--初始Java
    [Python]百钱买鸡流程图及程序设计
    Linux进程/线程几个经典问题
    多核处理器
    LeetCode简单题之重排字符形成目标字符串
    【动手学深度学习PyTorch版】18 使用块的网络 VGG
    超级水王问题
    2022/11/18[指针] 关于指针的初步理解
    4个视频教你正确使用华为云代码托管服务CodeArts Repo!
  • 原文地址:https://blog.csdn.net/younger123rtyui9/article/details/126473524