项目示例 - 3.服务网关 - 3.Gateway

这篇具有很好参考价值的文章主要介绍了项目示例 - 3.服务网关 - 3.Gateway。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目示例 - 3.服务网关 - 3.Gateway

关联知识:

  • 分布式微服务 - 3.服务网关 - 4.Gateway

内容提要:文章来源地址https://www.toymoban.com/news/detail-839634.html

  • 基本使用
  • 自定义断言
  • 自定义局部、全局过滤器

基本使用

  1. 建Module:微服务起名为gateway-server
  2. 改pom:引入以下依赖
    <dependencies>
        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--Nacos服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
  1. 写yml:在resources目录下创建application.yml文件,并做以下配置
server:
  port: 80

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        # nacos的地址
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 从服务注册中心根据别名来进行路由
          enabled: true
      routes:
        # 路由Id,自定义,唯一即可
        - id: nacos-provider-test
          # 成功匹配后,要转换成的路由地址(配合服务注册中心使用别名)
          uri: lb://nacos-provider
          # 成功匹配后,要转换成的路由地址(不配合服务注册中心)
          #uri: http://localhost:8001
          # 断言
          predicates:
            # 路径匹配的进行路由
            - Path=/**
  1. 主启动:在src下创建如下主启动类
package learn.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayServer {

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

}
  1. 测试:
    1. 启动nacos,能正常打开nacos首页
    2. 启动nacos-provider微服务,浏览器访问localhost:8001/nacos/provider/test 接口,能正常返回信息,且在nacos服务列表中可看到成功注册
    3. 启动本微服务后,浏览器访问localhost/nacos/provider/test 接口,能正常返回信息

自定义断言

  1. 创建自定义断言类:
package learn.demo.config;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {

    public CustomRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("key", "value");
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                List<String> strings = serverWebExchange.getRequest().getHeaders().get(config.key);
                if (strings==null || strings.isEmpty())
                    return false;
                return config.value.equals(strings.get(0));
            }
        };
    }

    public static class Config {
        private String key;
        private String value;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}
  1. application.yml中配置断言:
server:
  port: 80

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        # nacos的地址
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 从服务注册中心根据别名来进行路由
          enabled: true
      routes:
        # 路由Id,自定义,唯一即可
        - id: nacos-provider-test
          # 成功匹配后,要转换成的路由地址(配合服务注册中心使用别名)
          uri: lb://nacos-provider
          # 成功匹配后,要转换成的路由地址(不配合服务注册中心)
          #uri: http://localhost:8001
          # 断言
          predicates:
            # 路径匹配的进行路由
            - Path=/**
            - Custom=test, a
  1. 测试:
    1. 启动nacos,能正常打开nacos首页
    2. 启动nacos-provider微服务,浏览器访问localhost:8001/nacos/provider/test 接口,能正常返回信息,且在nacos服务列表中可看到成功注册
    3. 启动本微服务后,API工具访问localhost/nacos/provider/test 接口,返回404。在header中,携带key为test、value为a的参数后再次访问,可以正常返回信息。

自定义过滤器

自定义局部过滤器

  1. 创建自定义过滤器类:
package learn.demo.config;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> {

    public CustomGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("key", "value");
    }

    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                // pre操作
                String pre;
                List<String> strings = exchange.getRequest().getHeaders().get("pre");
                if (strings==null || strings.isEmpty())
                    pre="no args";
                else
                    pre=strings.get(0);

                return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                    // 异步post操作
                    exchange.getResponse().getHeaders().set(config.key, pre+" | "+config.value);
                }));
            }
        };
    }

    public static class Config {
        private String key;
        private String value;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}
  1. 添加配置:
server:
  port: 80

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        # nacos的地址
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 从服务注册中心根据别名来进行路由
          enabled: true
      routes:
        # 路由Id,自定义,唯一即可
        - id: nacos-provider-test
          # 成功匹配后,要转换成的路由地址(配合服务注册中心使用别名)
          uri: lb://nacos-provider
          # 成功匹配后,要转换成的路由地址(不配合服务注册中心)
          #uri: http://localhost:8001
          # 断言
          predicates:
            # 路径匹配的进行路由
            - Path=/**
            - Custom=test, a
          filters:
            - Custom=post,test
  1. 测试:
    1. 启动nacos,能正常打开nacos首页
    2. 启动nacos-provider微服务,浏览器访问localhost:8001/nacos/provider/test 接口,能正常返回信息,且在nacos服务列表中可看到成功注册
    3. 启动本微服务后,API工具访问localhost/nacos/provider/test 接口,返回404。在header中,携带key为test、value为a的参数后再次访问,可以正常返回信息,查看响应头中有key为post、value为no args | test的参数。

自定义全局过滤器

  1. 创建自定义过滤器类:
package learn.demo.config;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // pre操作
        String pre;
        List<String> strings = exchange.getRequest().getHeaders().get("pre");
        if (strings==null || strings.isEmpty())
            pre="no args";
        else
            pre=strings.get(0);

        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            // 异步post操作
            exchange.getResponse().getHeaders().set("post", pre+" | test");
        }));
    }

    // 值越小,优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}
  1. 修改配置文件:
server:
  port: 80

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        # nacos的地址
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 从服务注册中心根据别名来进行路由
          enabled: true
      routes:
        # 路由Id,自定义,唯一即可
        - id: nacos-provider-test
          # 成功匹配后,要转换成的路由地址(配合服务注册中心使用别名)
          uri: lb://nacos-provider
          # 成功匹配后,要转换成的路由地址(不配合服务注册中心)
          #uri: http://localhost:8001
          # 断言
          predicates:
            # 路径匹配的进行路由
            - Path=/**
            - Custom=test, a
  1. 测试:
    1. 启动nacos,能正常打开nacos首页
    2. 启动nacos-provider微服务,浏览器访问localhost:8001/nacos/provider/test 接口,能正常返回信息,且在nacos服务列表中可看到成功注册
    3. 启动本微服务后,API工具访问localhost/nacos/provider/test 接口,返回404。在header中,携带key为test、value为a的参数后再次访问,可以正常返回信息,查看响应头中有key为post、value为no args | test的参数。

到了这里,关于项目示例 - 3.服务网关 - 3.Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

    Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。 Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了

    2024年02月11日
    浏览(37)
  • 【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

    为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道,这就是我们需要服务网关的原因。 我们

    2024年02月11日
    浏览(47)
  • 【微服务】服务网关----Gateway

    上篇文章讲解了如何实现服务容错,这篇就介绍下,服务网关— Gateway 。在本篇文章中,你将了解到什么是服务网关?什么是Gateway?如何实现Gateway?Gateway的核心架构有哪些ÿ

    2024年01月24日
    浏览(39)
  • 两天学会微服务网关Gateway-Gateway路由规则

    锋哥原创的微服务网关Gateway视频教程: Gateway微服务网关视频教程(无废话版)_哔哩哔哩_bilibili Gateway微服务网关视频教程(无废话版)共计17条视频,包括:1_Gateway简介、2_Gateway工作原理、3_Gateway HelloWorld快速入门等,UP主更多精彩视频,请关注UP账号。 https://www.bilibili.com

    2024年03月18日
    浏览(47)
  • SpringCloud:Gateway服务网关

    网关(Gateway)是将两个使用不同协议的网络段连接在一起的设备。 网关的作用就是对两个网络段中的使用不同传输协议的数据进行互相的翻译转换。 创建服务 导入依赖 编写启动类 添加配置 Route Predicate Factories :: Spring Cloud Gateway 对所有路径都生效 全局过滤器的作用也是处理

    2024年02月01日
    浏览(57)
  • 【SpringCloud】Gateway服务网关

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的

    2024年02月13日
    浏览(51)
  • SpringCloud - GateWay服务网关

    gateway 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 在微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务

    2024年02月07日
    浏览(52)
  • 微服务-统一网关Gateway

    对用户请求做身份认证、权限校验 将用户请求路由到微服务,并实现负载均衡 对用户请求做限流 创建新module,命名为Gateway,引入依赖(1.SpringCloudGateway依赖;2.Eureka客户端依赖或者nacos的服务发现依赖)。在本案例中使用的是Eureka。 配置Application.yml的网关服务 路由id:路由

    2024年02月08日
    浏览(43)
  • 微服务-GateWay(网关)

    所谓网关是什么意思?        相当于就是你们小区家的保安,进出小区都得获得保安的同意,守护你们小区的生命财产健康,网关也是如此,对每个请求都严格把关,将合法的或者是获得权限的请求进入服务器 网关的功能: 身份验证和权限校验 服务路由、负载均衡 请求限

    2024年02月12日
    浏览(36)
  • 微服务网关Gateway

    springcloud官方提供的网关组件spring-cloud-starter-gateway,看pom.xml文件,引入了webflux做响应式编程,请求转发用到了netty的reactor模型,支持的请求数在1W~1.5W左右。hystrix停止维护后,官方推荐resilience4j做服务熔断,网关这里也能看到依赖。 对于网关提供的功能,大方向上主要是服

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包