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) 加入相关的依赖
<!--只需要添加该依赖,不要使用spring-boot-starter- web依赖。 3 因为gateway内置了服务器netty.而web的jar内置 tomcat 4 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(3)配置文件

server :
  port : 7000
  spring :
  application :
  name : springcloud-gateway
  # 路由转发 List<RouteDefinition> 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 )引入依赖
<dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba- nacos-discovery</artifactId>
</dependency>
(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)引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

(2)创建一个实体类

@Component
@ConfigurationProperties(prefix = "anon")
public class Anon {
    private List<String> url;

    public List<String> getUrl() {
        return url;
    }

    public void setUrl(List<String> url) {
        this.url = url;
    }
}

(3)过滤器的相关代码

@Component
public class LoginFilter implements GlobalFilter, Ordered {

    @Autowired
    private Anon anon;
    //过滤方法 过滤业务
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //0.获取请求
        String path = request.getPath().toString();
        //1.判断当前的请求路径是否为放行路径
        if(anon.getUrl().contains(path)){
            return chain.filter(exchange);//放行
        }

        //2. 判断是否携带token
        String token = request.getHeaders().getFirst("token");
        if(StringUtils.hasText(token)&&"admin".equals(token)){//redis
            return chain.filter(exchange);//放行
        }
        //3.返回一个json数据。
        //3.1设置状态码
        response.setStatusCode(HttpStatus.UNAUTHORIZED);

        //3.2封装返回数据
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "未登录");
        map.put("code", 4000);

        //3.3作JSON转换
        byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8);

        //3.4调用bufferFactory方法,生成DataBuffer对象
        DataBuffer buffer = response.bufferFactory().wrap(bytes);

        //4.调用Mono中的just方法,返回要写给前端的JSON数据
        return response.writeWith(Mono.just(buffer));
    }

    //优先级 返回的值越小优先级越高
    @Override
    public int getOrder() {
        return 0;
    }


}

(4)设置放行的路径

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340