28.项目搭建网关

news2024/11/18 12:34:57

项目搭建网关

一、项目架构

1667754234083

二、创建模块,引入依赖,创建启动类,添加application.yml配置文件

2.1依赖

<dependencies>
    <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>

    <!-- 监控检查-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- nacos配置中心依赖支持
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    -->
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>tanhua-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

2.2启动类

@SpringBootApplication
public class GatewayApplication {

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

3.跨域问题配置类

package com.itheima.gateway.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;
import org.springframework.web.util.pattern.PathPatternParser;

/**
 * 跨域支持
 */
@Configuration
public class CorsConfig {

    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source =
                new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

2.4application.yml配置文件

server:
  port: 10010
spring:
  profiles:
    active: prod
  application:
    name: tanhua-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.136.160:8848
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowedHeaders: "*"
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION
      routes:
        # 探花系统
        - id: tanhua-app-server
          uri: lb://tanhua-app-server
          predicates:
            - Path=/app/**
          filters:
            - StripPrefix= 1
        # 后台系统
        - id: tanhua-admin
          uri: lb://tanhua-admin
          predicates:
            - Path=/admin/**
          filters:
            - StripPrefix= 1
gateway:
  excludedUrls: /user/login,/user/loginVerification,/system/users/verification,/system/users/login

三、统一鉴权

在网关内部可以通过过滤器完成统一鉴权,限流,日志记录等操作

1667755445774

1.定义一个类实现GlobalFilter、Ordered这俩个接口;重写里面的方法

filter:过滤器核心业务

getOrder:执行顺序

package com.tanhua.gateway.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tanhua.commons.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 全局过滤器
 * 1.定义一个类实现GlobalFilter接口,Orderd借口
 * 2.重写方法
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {


    //1.定义不需要处理token的请求,例如获取手机验证码,登录等;用list集合装起来
    @Value("${gateway.excludedUrls}")
    List<String> excludeUrls;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //1.排除掉不需要校验的请求路径
        //获取当前请求路径
        String currentPath = exchange.getRequest().getURI().getPath();
        if(excludeUrls.contains(currentPath)){
            //放行,不需要校验
            return chain.filter(exchange);
        }
        //2.获取token并校验
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");

        if(!StringUtils.isEmpty(token)){
           token  =  token.replaceAll("Bearer ", "");
        }

        boolean result = JwtUtils.verifyToken(token);

        if(!result){
            //3.校验失败,响应错误状态码
            Map<String, Object> responseData = new HashMap<>();
            responseData.put("errCode", 401);
            responseData.put("errMessage", "用户未登录");
            return responseError(exchange.getResponse(),responseData);
        }

        //放行
        return chain.filter(exchange);
    }



    //响应错误数据
    private Mono<Void> responseError(ServerHttpResponse response, Map<String, Object> responseData){
        // 将信息转换为 JSON
        ObjectMapper objectMapper = new ObjectMapper();
        byte[] data = new byte[0];
        try {
            data = objectMapper.writeValueAsBytes(responseData);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        // 输出错误信息到页面
        DataBuffer buffer = response.bufferFactory().wrap(data);
        response.setStatusCode(HttpStatus.UNAUTHORIZED);
        response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
        return response.writeWith(Mono.just(buffer));
    }


    /**
     * 设置过滤器的执行顺序
     * @return
     */
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}


四、nacos配置管理

将配置交给Nacos管理的步骤

①在Nacos中添加配置文件

②在微服务中引入nacos的config依赖

③在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件

bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml

1667755857138

1.引入Nacos的配置管理客户端依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、在resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml

spring:
  profiles:
    active: prod  #多环境配置,开发、测试、生产
  application:
    name: tanhua-gateway
  cloud:
    nacos:
      discovery:   #服务注册发现
        server-addr: 192.168.1.8:8848
      config:     #配置管理
        server-addr: 192.168.1.8:8848
        file-extension: yml

3.然后在nacos管理页面添加配置,项目启动的时候会读取bootstrap.yml找到nacos地址,完成服务注册;以及会拉取配置

server:
  port: 10010
spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        corsConfigurations:
          '[/**]':
            allowedHeaders: "*"
            allowedOrigins: "*"
            allowedMethods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION
      routes:
        # 用户微服务
        - id: tanhua-app-server
          uri: lb://tanhua-app-server
          predicates:
            - Path=/app/**
          filters:
            - StripPrefix= 1
        # 文章微服务
        - id: tanhua-admin
          uri: lb://tanhua-admin
          predicates:
            - Path=/admin/**
          filters:
            - StripPrefix= 1
gateway:
  excludedUrls: /user/login,/user/loginVerification,/system/users/verification,/system/users/login

   - StripPrefix= 1
    # 文章微服务
    - id: tanhua-admin
      uri: lb://tanhua-admin
      predicates:
        - Path=/admin/**
      filters:
        - StripPrefix= 1

gateway:
excludedUrls: /user/login,/user/loginVerification,/system/users/verification,/system/users/login


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI with ML】第 9 章 :了解序列和时间序列数据

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【linux】linux环境变量初始化与对应文件的生效顺序

1.认识环境变量&#xff08;PATH) 环境变量&#xff08;PATH&#xff09;是一个列表&#xff0c;里面是有序的一些程序的地址&#xff08;一般是xxx/bin&#xff09;&#xff0c;添加环境变量后&#xff0c;系统在任何目录输入命令&#xff0c;都可以识别命令并执行命令对应程…

一个工程师的自我修养!

Datawhale干货 Tw93&#xff0c;前端工程师&#xff0c;Datawhale邀约作者对计算机科学的掌握程度&#xff0c;决定了一个计算机行业从业者能走多远。吴军博士在《浪潮之巅&#xff08;第四版&#xff09;》对工程师做了五个级别的划分&#xff1a;一级&#xff1a;能够开创一个…

询问ChatGPT来了解什么是边缘计算,有哪些特点,有哪些关键技术,和云计算的关系是什么?

什么是云计算 云计算是一种计算架构&#xff0c;它使用互联网作为基础设施&#xff0c;允许用户通过网络访问共享的计算资源&#xff0c;而不需要拥有专门的本地计算机硬件和软件。云计算提供了计算能力、存储空间、应用程序和服务等&#xff0c;并使用计费模型收取使用费用。…

springboot基于ssm框架实现的家具商城管理系统

一、项目简介 本项目是一套基于springboot框架实现的家具商城管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…

为什么在SPI通信中提供不同的模式?

SPI传输模式 因为SPI是全双工也就是说&#xff08;MOSI和MISO&#xff09;上同时发送和接收数据 时钟极性&#xff08;CPOL&#xff09; 时钟相位&#xff08;CPHA&#xff09;是定义SPI总线使用的时钟格式得主要参数&#xff0c;根据SPOL参数&#xff0c;SPI时钟可以是反向或…

寻找两个正序数组的中位数K个一组翻转链表

文章目录1. [寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/)2. [K个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)1. 寻找两个正序数组的中位数 首先&#xff0c; 中位数的作用就是将正序数组的两端进行分…

[内网渗透]—权限维持

Skeleton Key(万能密码) 原理 当拿到域控权限后,使用mimikatz可以注入Skeleon Key,将 Skeleton Key 注入域控制器的 lsass.exe 进程,这样会在域内的所有账号中添加一个 Skeleton Key,而这个key是自己设定的所以可以随时共享访问。 PS:由于注入到lsass.exe进程中,所以每…

JS图解 | Java程序员的JS | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘JS 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答了…

跟腾讯架构大师学网络框架与后台架构

目录 跟腾讯架构大师学网络框架与后台架构 单机服务 1、单机服务&#xff1a;基本概念 2、单机服务&#xff1a;同步阻塞​编辑 3、单机服务&#xff1a;异步非阻塞框架 4、单机服务&#xff1a;典型框架&#xff1a; 5、单机服务&#xff1a;协程框架 6、单机服务&…

Spring之自定义Bean何时被扫描注册?

1. 前言 在AnnotationConfigApplicationContext的构造函数里&#xff0c;Spring会创建AnnotatedBeanDefinitionReader对象&#xff0c;它的基本作用是将基于注解的BeanClass封装成BeanDefinition&#xff0c;并注册到BeanFactory中。同时AnnotatedBeanDefinitionReader的构造函…

计算机毕业设计springboot+vue景区疫情预警系统

项目介绍 本景区疫情预警系统是针对目前景区疫情预警的实际需求,从实际工作出发,对过去的景区疫情预警系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结…

垃圾回收器

文章目录1. 垃圾回收器分类2. 不同垃圾回收器概述3. Serial与Serial Old垃圾回收器&#xff1a;串行回收4. ParNew垃圾回收器&#xff1a;并行回收5. Parallel与Parallel Old垃圾回收器&#xff1a;吞吐量优先6. CMS回收器&#xff1a;低延迟7. G1回收器&#xff1a;区域分代式…

web前端-javascript-初识Array数组(说明,初步创建,添加元素和读取元素,获取和修改数组的 length 长度,最后一个位置添加元素)

初识 Array 数组 1. 说明 数组也是一个对象它和普通的对象功能类似&#xff0c;也是用来存储一些值的不同的是普通对象是使用字符串作为属性名的 而数组是使用数字来作为索引来操作元素 索引&#xff1a; 从 0 开始的整数就是索引 数组的存储性能比普通对象要好&#xff0c;在…

【记录】Ubuntu20.04安装CUDA和cuDNN

本文记录下如何在Ubuntu20.04系统中安装CUDA和cuDNN。 这里简要介绍下CUDA和cuDNN分别是什么。CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力&#xff0c;可大幅提升计算性能&#xff1b;cuDNN(深度神经网络库)是GPU加速的用于深度…

《西西弗神话》笔记——不期待人生可以过得很顺利,但我希望碰到人生难关的时候,自己可以是它的对手

目录 一、作者生平 二、经典摘录 1、悲剧从本质上讲是对苦难的反抗 2、自杀实质上是一种逃避&#xff0c;它是反抗的对立面 3、不是否认生活本身 4、书的宗旨就是要讨论荒谬与自杀的关系 5、真正严肃的哲学问题只有一个&#xff1a;自杀 6、了解人是否能够义无反顾地生…

【2022.12.16】备战春招Day11——每日一题 + 142. 环形链表 II + 93. 复原 IP 地址

【每日一题】 1785. 构成特定和需要添加的最少元素 题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的最少元素数量 &#xff0c;添…

SQL语句练习05

目录 一、建表并插入数据 二、查询语句练习 一、建表并插入数据 一、建立如下 &#x1d446; 表(命名格式“姓名拼音_三位学号_week7s”&#xff0c;如LBJ_023_week7s&#xff09;&#xff0c;并插入数据 create table LYL_116_week7s(SNO varchar(3),SNAME varchar(10), CI…

【数据结构Java版】Stack栈的妙用

目录 一、栈的概念 二、栈的使用 &#xff08;1&#xff09;主要方法 &#xff08;2&#xff09;实例演示 三、栈的模拟实现 四、栈相关练习题 &#xff08;1&#xff09;有效的括号 &#xff08;2&#xff09;栈的压入、弹出序列 &#xff08;3&#xff09;逆波兰表达…

SpringBoot中mapper-locations配置多个mapper包路径

1 问题描述 大家都知道mapper-locations是配置mapper路径的&#xff0c;但是有时候mapper路径可能不止一个 比如说有两个包A和B&#xff0c;A和B里面的业务模块不同就需要写各自的mapper&#xff0c;这时候如果只配置A的mapper路径&#xff0c;那么B的mapper路径肯定扫码不到…