微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域

1. nacos的集群模式

1.1 分析

nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建

在这里插入图片描述

  1. nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库,保证数据的一致

  2. 模拟nacos在window中搭建集群。因为在2.0以后,nacos增加理论两个端口,偏移量为1000和1001,所以需要注意端口号

  3. 使用8850【9850,9851】

​ 8860【9860,9861】

​ 8870【9870,9871】

1.2 实现

1. 修改conf/application.properties文件

在这里插入图片描述

2.创建数据库nacos并导入sql语句

在这里插入图片描述

3. 修改cluster.conf.example文件

把该文件命名为cluster.conf并修改里面的内容

#it is ip
#example 注意:把虚拟机的ip关闭
ip:端口号
ip:端口号
ip:端口号

4. 修改bin文件中的startup.cmd配置文件为集群

在这里插入图片描述

nacos中的startup.cmd文件中默认情况下就为集群模式,若使用单机模式的话,就需要将其改为单机模式

5. 在设置中关闭VM网络

在这里插入图片描述

6. 启动三台nacos服务

在这里插入图片描述

7. 微服务连接

在这里插入图片描述

若是在虚拟机中实现,还需要配置nginx的conf文件,配置相应的ip和端口号,但现在是在windows下模拟,nginx支持tcp协议,而windows不支持tcp协议,所以在此通过步骤7模拟

2. Gateway网关

2.1 概述

大家都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端【pc、androud、ios、平板】要如何去调用这么多的微服务呢?

如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。

这样的架构,会存在着诸多的问题

  1. 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
  2. 认证复杂,每个服务都需要独立认证
  3. 存在跨域请求,在一定场景下处理相对复杂。

在这里插入图片描述

网关:所有微服务的入口点

作用:

  1. 路由转发
  2. 认证校验
  3. 跨域统一解决
  4. 黑白名单

2.2 常用的网关组件

  • nginx+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用 。lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本

  • Kong

基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:

只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

  • Zuul 1.0(慢 servlet 2.0)zuul2.0没出来

Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发 问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx

  • Spring Cloud Gateway

Spring公司为了替换Zuul而开发的网关服务,将在下面具体介绍。

注意:SpringCloud alibaba技术栈中并没有提供自己的网关,我们可以采用Spring Cloud

2.3 概述gateway网关

Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 Project Reactor 等术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。

  • 优点
  1. 性能强劲:是第一代网关Zuul的1.6倍
  2. 功能强大:内置了很多实用的功能,例如转发、监控、限流等
  3. 设计优雅,容易扩展
  • 缺点
  1. 其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
  2. 不能将其部署在Tomcat、Jetty等Servlet容器里,只能达成jar包执行web.jar
  3. 需要springboot 2.0以及上的版本,才支持

gateway内置了服务器netty服务器,千万不要在使用tomcat作为服务器

2.4 使用gateway网关-转发地址写死

1. 创建网关微服务

在这里插入图片描述

2. 添加依赖

 <dependencies><!--如果引入了gateway的依赖,不能再引用spring-boot-starter-web,否则会报错。因为web内置了tomcat服务器,而gateway内置netty服务器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>

如果依赖中引入了gateway依赖,就不能再引入spring-boot-starter-web依赖,否则会报错。因为web内置了tomcat服务器,而gateway中内置了netty服务器

3. 创建yml配置文件,配置网关

server:port: 88spring:application:name: zmq-gateway#配置路由转发cloud:gateway:routes:- id: zmq-product  #路由id,没有实际意义。如果自己设置,就会通过UUID随机生成uri: http://localhost:8001 #表示路由真实转发的微服务的地址predicates:- Path=/product/**- id: zmq-orderuri: http://localhost:9001predicates:- Path=/order/**
  1. 配置端口号 88
  2. 微服务名称
  3. 配置路由转发

4. 在com.zmq包下创建主启动类

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

5. 测试

在这里插入图片描述

  • 若资源路径中的断言路径写错,报错如下图所示

在这里插入图片描述

  • 若资源路径中的后面路径写错,报错如下图所示

在这里插入图片描述

2.5 增强版—转发地址解耦

现在在配置文件中写死了转发路径的地址,前面我们已经分析过地址写死带来的问题,不符合前闭后开原则,接下来我们从注册中心获取此地址

思考:gateway网关它也是一个微服务,那么它也可以从注册中心拉取服务器清单列表

实现步骤

1. 引入nacos依赖

<!--nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2. 修改配置文件

server:port: 88spring:application:name: zmq-gateway#配置路由转发cloud:gateway:routes:- id: zmq-product  #路由id,没有实际意义。如果自己设置,就会通过UUID随机生成uri: lb://zmq-product #表示路由真实转发的微服务的地址predicates:- Path=/product/**- id: zmq-orderuri: lb://zmq-orderpredicates:- Path=/order/**#nacos的配置nacos:discovery:server-addr: localhost:8848register-enabled: false #是否注册到nacos上

将转发路径的地址进行解耦,使gateway微服务可以通过nacos组件从注册中心拉取【gateway可以只做拉取,而不注册到nacos上,在配置文件中设置即可】

register-enabled: false #是否注册到nacos上,默认为true,注册到nacos上,改为false后就可以实现只做拉取

lb:loadblance

2.6 简洁版-自动定位模式

增强版虽然实现了转发地址的解耦,但是需要手动配置转发地址相关参数,若微服务过多,可以使用简洁版实现自动定位模式,减少工作量

实现步骤

1. 修改配置文件

  • 删除关于转发路径的配置
  • 添加开启gateway的定位功能的配置
server:port: 88spring:application:name: zmq-gateway#nacos的配置nacos:discovery:server-addr: localhost:8848# register-enabled: false #是否注册到nacos上cloud:gateway:discovery:locator:enabled: true #开启gateway的定位功能

2. 在访问资源时,需要在原本的路径上加上微服务的名称

在这里插入图片描述

3. Gateway用于认证校验

通过过滤器filter实现

实现步骤

1. 创建登录过滤器类

//在网关中定义的过滤器,只能在网关中使用
@Component
public class LoginFilter implements GlobalFilter, Ordered {@Autowiredprivate UrlVo urlVo;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获取request对象ServerHttpRequest request = exchange.getRequest();//获取response对象ServerHttpResponse response = exchange.getResponse();//获取上述两个对象是为了便于获取path和token//1.获取请求路径String path = request.getPath().toString();System.out.println(path);//对获取到的请求路径字符串进行截取,获取符合的地址路径【断言+资源路径】,便于后面比较判断是否放行path = path.substring(1);System.out.println(path);path=path.substring(path.indexOf("/"));//从第一个/的下标开始截取,indexOf,获取指定字符的索引System.out.println(path);//2.判断该路径是否属于放行路径——类似于白名单if(urlVo.getWhite().contains(path)){//放行return  chain.filter(exchange);}//3. 判断用户是否登录String token = request.getHeaders().getFirst("token");//4. 校验token是否为空,以及是否合法if(StringUtils.hasText(token)&&"admin".equals(token)){//放行return chain.filter(exchange);}//4.2 封装返回数据Map<String,Object> map=new HashMap<>();map.put("msg","未登录");map.put("code",501);//4.3 JSON转换byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8);// 4.4 调用bufferFactory方法,生成DataBuffer对象DataBuffer wrap = response.bufferFactory().wrap(bytes);//5. 调用Mono中的just方法,返回要写给前端的JSON数据return response.writeWith(Mono.just(wrap));}//优先级,值越小优先级越高@Overridepublic int getOrder() {return 0;}
}
  1. 该过滤器类需要实现两个接口:GlobalFilter, Ordered,并重写接口的方法
  2. 重写fifter方法时
    • 首先通过exchange获取request对象和response对象,便于后面调用
    • 然后通过request的getPath方法,拦截获取请求路径,并将其转化为字符串,便于后面比较。
    • 对获取的路径字符串进行截取,获取用于判断的字符串,如下图

在这里插入图片描述

  1. 判断通过截取后的字符串是否在放行名单中,此时,需要在配置文件中添加需要放行的路径,并创建一个vo类,便于获取配置文件中的集合数据
  • 配置文件

    url:white:- /login- /register- /sendMsg
    
  • UrlVo类

    @Component
    @ConfigurationProperties(prefix="url")
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class UrlVo {private List<String> white;
    }
    
    1. 因为需要用到@Data等相关的注解,所以添加lombok依赖
     <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
    
    1. @ConfigurationProperties注解:是SpringBoot提供的,用于将外部配置文件中的属性映射到Java类中,绑定到Java类的字段上。可以方便地将配置文件中的属性注入到应用程序中,从而实现配置的集中管理和解耦

    prefix="XXX":意味着该类的字段会绑定到配置文件中以XXX为前缀的属性


  1. 通过request获取头文件中的token,校验token是否为空,是否合法

  2. 如果合法,就放行。

  3. 封装返回的数据,需要转换为JSON数据返回给前端,所以需要添加fastjson依赖

 <!--fastjosn--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.22</version></dependency>
  • 测试

    在postman中进行测试,此时测试时需要带上token

    此时,该程序并没有连接关于用户登录的数据库,仅将token写死来测试

    • token不正确

    在这里插入图片描述

    • token正确

    在这里插入图片描述

测试时需要在原有的路径上面加上微服务的名称,因为使用的是自动定位模式

4. Gateway解决跨域问题【2种】

对之前的实现前后端分离项目中的前端项目做如下修改,便于测试

  1. main.js文件中,修改端口号为网关的端口号,并注释前置路由守卫,便于测试

    //a2.设置axios的基础路径
    axios.defaults.baseURL = 'http://localhost:88'
    //a3.将axios挂载到vue对象中
    Vue.prototype.$axios=axios;
    

    设置请求拦截器中将token写死——admin

    //设置请求拦截器——携带token令牌
    axios.interceptors.request.use(config=>{var token = sessionStorage.getItem("token");if(token){config.headers.token = "admin";}return config;
    })
    
  2. Home.vue文件中添加按钮,用于访问后端getById的路径

    在这里插入图片描述

实现getById方法

在这里插入图片描述

在不做跨域解决时,点击按钮,会报错,出现跨域问题

在这里插入图片描述

两种解决方法都是在gateway下解决

4.1 通过配置类

创建配置类,来解决跨域问题——在gateway微服务下

package com.zmq.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true); // 允许认证config.addAllowedOrigin("*"); // 允许任何源config.addAllowedHeader("*"); // 允许任何头config.addAllowedMethod("*"); // 允许任何方法source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}
  • 测试时,需要手动加上token——token值为admin

    在这里插入图片描述

4.2 通过配置文件

配置类和配置文件只能择其一

在配置文件中添加相关配置

cloud:gateway:discovery:locator:enabled: true #开启gateway的定位功能globalcors: #全局的跨域处理add-to-simple-url-handler-mapping: true #解决浏览器向服务器发options请求被拦截问题,这样网关就不拦截这个请求了cors-configurations:'[/**]': #拦截一切请求allowedOrigins: "*" #允许任意域的跨域请求allowedMethods: "*" #允许的跨域ajax的请求方式allowedHeaders: "*" #允许在请求中携带的头信息,这里是允许所有的请求头allowCredentials: true #是否允许携带cookiemaxAge: 360000 #这次跨域检测的有效期

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析中国蚁剑的木马加密流量

简介 在蓝帽杯 2022 初赛中&#xff0c;domainhacker 的流量分析题目聚焦于中国蚁剑这款 webshell 管理工具的流量特征。通过对比赛提供的数据包进行解析&#xff0c;本文将深入分析蚁剑在连接木马时产生的加密流量。 公司安全部门&#xff0c;在流量设备中发现了疑似黑客入侵的…

idea使用free流程,2024idea免费使用

1.先到官网下载&#xff0c;这里选择win系统的&#xff0c;点击下图的.exe https://www.jetbrains.com/idea/download/?sectionwindows 2.下载好后基本上就是一直点击“下一步”到直到安装好&#xff0c;安装好后先打开软件后关闭退出 3.下载配配套资料 链接: https://pan.ba…

MySQL内存模型与相关技术

MySQL实例的大概结构如下 如上图所示&#xff0c;InnoDB的存储引擎右多个内存块 维护所有进程/线程需要访问多个内部数据结构缓存磁盘上的数据&#xff0c;方便快速读取&#xff0c;且修改的数据缓存在此&#xff0c;满了后统一写入磁盘重做日志&#xff08;redo log&#xf…

5.3 需求分析

需求分析 软件需求定义分类练习题 需求工程需求获取练习题 需求分析状态转化图数据流图DFD顶层数据流图0层数据流图1层数据流图 练习题 需求规约需求定义方法 需求验证需求管理版本控制需求跟踪变更控制练习题 考试大概3分 软件需求 定义 软件需求&#xff1a;是指用户对目标…

【QT常用技术讲解】tableWidget右键菜单及多进程编程

前言 本文在QT项目的开发框架的基础上&#xff08;源代码&#xff09;增加tableWidget的右键菜单功能&#xff0c;并使用进程实现ping计算机的功能来讲解&#xff0c;本文不对进程间通信进行讲解。 概述 一个项目在开发过程中&#xff0c;通常面临着引入“第三方应用”&#x…

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

【代码随想录训练营第42期 Day22打卡 回溯Part1 - LeetCode 77. 组合 216.组合总和III 17.电话号码的字母组合

目录 一、做题心得 二、回溯基础知识 1.定义 2.适用问题 3.一个思想 4.代码实现 三、题目与题解 题目一&#xff1a;77. 组合 题目链接 题解&#xff1a;回溯 题目二&#xff1a;216.组合总和III 题目链接 题解&#xff1a;回溯 题目三&#xff1a;17.电话号码的字…

第十九天(2024.8.7)Vue Element-plus

1.Vue 1.创建vue文件 1.创建一个文件夹来存储vue文件 我在D盘下创建了一个EasyVue文件夹来存储vue文件 2.在控制台中输入 如果在控制台中按下面步骤成功不了的话&#xff0c;尝试&#xff1a;1.用管理员身份运行控制台 2.关闭防火墙 3.打开编码工具&#xff08;Visual St…

WPF学习(5)- Border控件(边框布局)+GridSplitter分割窗口

严格来说&#xff0c;Border并不是一个布局控件&#xff0c;因为它并不是Panel的子类&#xff0c;而是Decorator装饰器的子类&#xff0c;而Decorator继承于FrameworkElement。我们要先看看它的父类Decorator。 public class Decorator : FrameworkElement, IAddChild {public…

CUDA编程05 - GPU内存架构和数据局部性

一&#xff1a;概述 到目前为止&#xff0c;我们已经学会了如何编写 CUDA 核函数&#xff0c;以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构&#xff0c;以及线程在硬件上调度执行过程。在本章中&#xff0c;我们将重点关注 GPU 的片上(on-chi…

Redisson 实现分布式锁

文章目录 Redisson 是什么Redisson 使用客户端模式单节点模式哨兵模式主从模式集群模式Spring Boot 整合 Redisson 中的锁Redisson 可重入锁Redisson 公平锁Redisson 联锁Redisson 读写锁Redisson Redlock Redisson 的看门狗机制RedLock 解决单体故障问题如何使用 RedLockMarti…

【C语言篇】操作符详解(上篇)

文章目录 操作符详解&#xff08;上篇&#xff09;前言sizeof强制类型转换算术操作符赋值操作符逻辑操作符逻辑取反运算符逻辑与运算符逻辑或运算符 关系操作符自增自减操作符和-逗号表达式 操作符详解&#xff08;上篇&#xff09; 前言 操作符又被叫做运算符&#xff0c;是不…

进程状态(三)----- linux 中具体的进程状态(下)

目录 前言1. T && t 状态2. X 与 Z 状态3. 孤儿进程 前言 继上一篇文章 进程状态&#xff08;二&#xff09;----- linux 中具体的进程状态&#xff08;上&#xff09; 介绍了 linux 系统中具体的 R、S、D 状态&#xff0c;而这篇文章继续介绍 linux 系统中剩下的三种…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

探索七款前沿UI设计软件:创新与实践

之前我们分享了制作原型的有用工具。制作完原型后&#xff0c;我们需要优化界面&#xff0c;这就是 UI 设计师的任务了。UI 设计软件对设计师来说非常重要。UI 设计工具的使用是否直接影响到最终结果的质量&#xff0c;所以有人会问&#xff1a;UI 界面设计使用什么软件&#x…

Java批量查询CSDN质量分

文章目录 前言代码实现pom.xml实体类工具类质量分查询 效果开源仓库 前言 在CSDN平台申请“专家博主”、“优质创作者”等称号的时候&#xff0c;往往会对博客的质量分有一定的要求&#xff0c;这时候我们需要审视以往所发表的博客&#xff0c;找出质量分较低的博客&#xff0…

nordic 蓝牙ble 配对绑定的流程 原理

目录 配对和绑定的基本概念 配对和绑定的流程 1. 配对请求和响应 2. 配对方法选择 3. 密钥生成和交换 4. 配对完成和绑定 配对和绑定的代码实现 初始化Peer Manager 处理Peer Manager事件 处理BLE事件 启动广播 在Nordic芯片上实现蓝牙低功耗(BLE)设备的配对和绑定…

Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)

在使用Excel进行数据处理和分析时&#xff0c;对特定单元格进行背景颜色填充不仅能够提升工作表的视觉吸引力&#xff0c;还能帮助用户快速识别和区分不同类别的数据&#xff0c;增强数据的可读性和理解性。 本文将通过以下三个示例详细介绍如何使用Python在Excel中设置不同的单…

sql注入——sqlilabs1-15

目录 sql注入靶场练习--sqlilabs 1.less-1​编辑 1.测试发现单引号为逃逸符号 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.查询用户表的列名字 6.查询用户信息 2.less-2​编辑 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.…

机械学习—零基础学习日志(高数23——无穷小运算)

零基础为了学人工智能&#xff0c;真的开始复习高数 这段时间&#xff0c;把张宇老师讲解考研的第一部分基本全部学习完毕了。 这里把第一部分的内容最后汇总一下。 无穷小运算——吸收律 这里展示一些无穷小的具体计算思路 无穷小运算——计算方法 泰勒展开的原则 夹逼准则…