Spring Cloud之Gateway网关应⽤

news2024/11/24 12:03:06

使⽤⽹关对静态化微服务进⾏代理(添加在它的上游,相当于隐藏了具体微服务的信息,对外暴露的是⽹关)。

1. 右键⽗⼯程【 yx-parent 】选择【 New - Module 】选项,然后选择创建【 Maven 】类型项⽬(不勾选模 板),将项⽬名称设置为 注意这⾥不选择⽗⼯程

项⽬的pom.xml⽂件引⼊以下依赖。注意,Gateway不需要使⽤Web模块,使⽤的是 WebFlux(类似于Spring MVC)模块,因此不要引⼊starter-web模块,⽽引⼊的是starter-webflux模块。

    <!-- Spring Boot父启动器依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath />
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- Gateway网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- 引入WebFlux -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!-- 日志依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!-- 测试依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Lombok工具 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <!-- 引入Jaxb开始 -->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- 引入Jaxb结束 -->
        <!-- Actuator可以帮助你监控和管理Spring Boot应用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 链路追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!-- Spring Cloud依赖版本管理 -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- 编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <!-- 打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
3. 如果导⼊ Maven 依赖后,提示 'parent.relativePath' of POM com.yx:yx-cloud-gateway:1.0-SNAPSHOT 问题,则 解决⽅案是在 <parent> 标签中加上 <relativePath /> 标签,然后重新编译,解决问题

 

错误原因:
1.xxx parent ⾥写的并不是 xxx 的上⼀级,⽽是继承了 Spring Boot
2.Maven 构建 jar 包的时候查找顺序: relativePath 元素中的地址 -> 本地仓库 -> 远程仓库。
3. <relativePath /> 设定⼀个空值将始终从仓库中获取,不从本地路径获取。

.在项⽬的com.yx.gateway包下创建GatewayApplication启动类。

package com.qf.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient  //将当前的项目标记为注册中心的客户端,然后向注册信息
public class ProductApplication9001 {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication9001.class,args);
    }
}

在项⽬的resources⽬录下创建application.yml配置⽂件并添加以下内容。

server:
  port: 9300
eureka:
  client:
    serviceUrl: # Eureka Server的路径
      defaultZone: http://YXCloudEurekaServerC:9200/eureka,http://YXCloudEurekaServerD:9201/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
spring:
  application:
   name: yx-cloud-gateway
  # gateway⽹关配置
  cloud:
    gateway:   # gateway⽹关配置
      routes: # 配置路由
        - id: service-page-router
           # 动态路由:从(消费)注册中⼼获取对应服务的实例
          #lb://表示从注册中心获取服务信息(//后更的是具体服务实例的具体名称)
          uri:  lb://yx-service-page
          predicates: # 当断⾔匹配成功后,则将请求转发给某个微服务
            - Path=/page/**
        - id: service-product-router
          uri: lb://yx-service-product
          predicates:
    # http://127.0.0.1:9300/product/query/1 - /query/1 - 商品微服务
            - Path=/product/**
          filters:
    # 访问uri时,会过滤掉uri中Path取值匹配上的前⼀部分,uri中第⼆部分才是⽬标访问路径
            - StripPrefix=1

 

⾃定义全局过滤器实现 IP 访问限制
y.filter 包下创建 BlackListGlobalFilter 全局过滤器
package com.qf.product.fifter;

import lombok.extern.slf4j.Slf4j;
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.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;

/**
 * 定义全局过滤器,会对所有路由⽣效
 */
@Slf4j
@Component
public class BlackListGlobalFilter implements GlobalFilter, Ordered {
    // 模拟⿊名单(实际可以去数据库或者Redis中查询)
    private static List<String> blackList = new ArrayList<>();

    static {
        // 模拟本机地址
        blackList.add("127.0.0.1");
        blackList.add("10.48.185.11");
    }

    /**
     * 过滤器核⼼⽅法
     *
     * @param exchange 封装了request和response对象的上下⽂
     * @param chain    ⽹关过滤器链(包含全局过滤器和单路由过滤器)
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        /* 实现思路:获取客户端IP,判断是否在⿊名单中,在的话就拒绝访问,不在的话就放⾏ */
        // 从上下⽂中取出request和response对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        // 从request对象中获取客户端IP
        String clientIP = request.getRemoteAddress().getHostString();
        log.info("=====>IP: " + clientIP);
        // 获取到客户端IP后去⿊名单中查询,存在的话就决绝访问
        if (blackList.contains(clientIP)) {
            // 状态码
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            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;
    }
}

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

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

相关文章

以高质量产业载体为底色,绘就珠海高新区产业发展新图景

【作者】珠海高新招商 “珠海高新招商”以招商运营为核心&#xff0c;聚焦珠海工业园区、珠海5.0产业园等招商引资工作&#xff0c;依托专业的招商团队和丰富的创新资源&#xff0c;为企业提供产业园入驻、平台搭建、产业政策咨询、科技服务等全流程专业服务。推动高新区招商引…

17 数组动态初始化

动态初始化&#xff1a;初始化时只指定数组长度&#xff0c;由系统为数组分配初始值。 格式&#xff1a;数据类型[] 数组名 new 数据类型[数组长度] package demo;public class Demo11 {public static void main(String[] args) {// 动态初始化数组&#xff1a;数据类型[] 数…

日撸java三百行day77-80

文章目录 说明GUI1. GUI 总体布局2. GUI 代码理解2.1 对话框相关控件2.1.1 ApplicationShowdown.java&#xff08;关闭应用程序&#xff09;2.1.2 DialogCloser.java&#xff08;关闭对话框&#xff09;2.1.3 ErrorDialog.java&#xff08;显示错误信息&#xff09;2.1.4 HelpD…

深度学习模型量化、剪枝、压缩

fp16是指采用2字节(16位)进行编码存储的一种数据类型&#xff1b; fp32是指采用4字节(32位)&#xff1b; fp16和fp32相比对训练的优化&#xff1a; 1.内存占用减少&#xff1a;应用fp16内存占用比原来更小&#xff0c;可以设置更大的batch_size 2.加速计算&#xff1a;加速…

CentOS5678 repo源 阿里云/腾讯云开源镜像站 repo 地址

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS5678 repo 地址 腾讯云开源镜像站 http://mirrors.cloud.tencent.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirror…

DuDuTalk :做4G智能工牌领域标杆品牌,用语音智能构建完美沟通

数字经济高速发展&#xff0c;AI 成为数字经济时代的核心生产力&#xff0c;驱动数字经济纵深发展&#xff0c;在此情境下&#xff0c;作为AI基石的语音数据价值也在不断释放。企业纷纷加强对客服、营销等服务和销售资源部门的投入&#xff0c;试图从语音数据入手&#xff0c;利…

如何使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户…

NodeJS实现支付宝沙箱支付 ②③

文章目录 前言版权声明Alipay SDK 沙箱环境简介Node环境要求沙箱环境配置下载所需模块准备前端静态页面以及Node服务器文件夹规范AlipaySdk 配置准备AlipaySdk 代码演示 Alipay实例化 ~ alipay.sdk 文件 AlipayForm ~ alipayForm文件 AlipayFormStatus ~ alipayForm文件 …

deeplabv3+源码之慢慢解析 第四章network文件夹(1)backbone文件夹(a1)hrnetv2.py--4个函数和可执行代码

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…

使用NRF52840 USB Dongle进行Wireshark蓝牙抓包

一、搭建软硬件环境 1.1、准备NRF52840 USB Dongle一个&#xff1a; 1.2、下载Wireshark软件 https://2.na.dl.wireshark.org/win64/Wireshark-win64-4.0.7.exe 1.3、下载Nodic官方解析工具包 nRF Sniffer for Bluetooth LE - Downloads - nordicsemi.com 1.4、下载Python P…

中文数据下载

研究AI离不开数据&#xff0c;数据库可以说是AI的半壁天下。有链接的数据库下载是很nice的。 语音数据集整理 目录 1.Mozilla Common Voice. 2 2.翻译和口语音频的大型数据库Tatoeba. 2 3.VOiCES Dataset 3 4. LibriSpeech. 4 5.2000 HUB5 English&#xff1a;... 4 6.…

Java文件流和网络流的原理以及流解析过程

流我们可以理解为水流&#xff0c;流的传输就相当于在水管里传输&#xff0c;本篇博客主要介绍流的原理和解析过程&#xff0c;学疏才浅&#xff0c;抛砖引玉&#xff0c;大佬勿喷。 文件流 假设我们收到了一个以Unicode编码的文件流&#xff0c;对于该文件流所表示的内容我们…

Java显示日期和时间中间的CST表示什么意思

例如&#xff0c;用Java代码System.out.println(new Date())语句打印出了当前的日期和时间信息&#xff0c;结果显示&#xff1a;Tue Jul 18 18:42:57 CST 2023 package com.thb;import java.util.Date; import java.util.Locale; import java.util.TimeZone;public class Tes…

Office史上最大升级!GPT-4接入Office全家桶!Excel到PPT动嘴就能做!

3月17日&#xff0c;微软宣布将GPT-4融入了Office全家桶。 这意味着&#xff0c;不管是Word、PPT、Excel&#xff0c;还是Outlook、Teams、Microsoft Viva、Power Platform&#xff0c;所有这些办公软件&#xff0c;通通都会得到GPT-4的加持&#xff01; 直接改名吧&#xff0…

this指针/闭包及作用域(进阶)

一.作用域链 1.通过一个例子 let aglobalconsole.log(a);//globalfunction course(){let bjsconsole.log(b);//jssession()function session(){let cthisconsole.log(c);//Windowteacher()//函数提升function teacher(){let dstevenconsole.log(d);//stevenconsole.log(test1,…

Ae 效果:CC Kaleida

风格化/CC Kaleida Stylize/CC Kaleida 万花筒是一种装置或玩具&#xff0c;通过多次反射和镜像&#xff0c;将图像分割成多个对称和重复的图案。CC Kaleida&#xff08;CC 万花筒&#xff09; 效果通过类似的方式在图像上创建镜像和对称的视觉效果。 提示&#xff1a; 由于 CC…

SpringBoot项目中WEB页面放哪里--【JSB系列之008】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录Resources目录Resources子目录实操一个helloworld!总结作业&#xff08;难度★✰✰✰✰ &#xff09;配套资源题外话 本系列环境 环境win11工具idea 2017jdk1.8数据库my…

AD导入封装以及器件(立创)

这里我们以立创商城为例 https://www.szlcsc.com/?cBD&sdclkidA5f6152zxrDiArD6A52&bd_vid12150450211089112893 1&#xff09;先搜索&#xff0c;然后点击数据手册&#xff1b; ​ 2&#xff09;出现如下界面&#xff0c;点击立即打开&#xff1b; ​ 3&#xff…

前端学习记录~2023.7.17~CSS杂记 Day9 浮动float 定位position 多列布局 响应式设计

前言一、浮动1、使盒子浮动起来2、清除浮动3、清除浮动元素周围的盒子&#xff08;1&#xff09;clearfix 小技巧&#xff08;2&#xff09;使用 overflow&#xff08;3&#xff09;display: flow-root 二、定位1、定位有哪些2、top、bottom、left 和 right3、定位上下文4、介绍…

宏下开展的#,##

宏下开展的#&#xff0c;## #表示字符串化 ##表示链接符号 #include <stdio.h>#define ABC(x) #x int main() {printf(ABC(abc));return 0; }#include <stdio.h>#define ABC(x) #x #define DAY(x) myday##x int main() {int myday1 10;int myday2 20;printf(AB…