文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloudGateway网关功能介绍与使用

2022-12-09 12:01

关注

一、什么是API网关

API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。

总结:网关就是所有项目的一个统一入口。

二、基本使用

1.准备Eureka注册中心

2.准备一个微服务工程

3.搭建Gateway网关微服务

(1)导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

(2)编写配置文件

server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
# 自动发现工具的本地路由规则是:
# 请求路径 - http://网关IP:网关端口/微服务的服务名/要访问的具体地址
# gateway自动解析,把请求地址中的'微服务的服务名'截取,从Eureka Client发现的服务列表中查看,如果有同名服务,则开始转发。
spring:
  application:
    name: cloud-gateway
  cloud: # spring cloud相关配置的常用前缀
    gateway: # 网关技术配置前缀
      discovery: # 自动发现工具
        locator: # 本地逻辑
          enabled: true # 开启自动发现工具的本地路由逻辑
          lower-case-service-id: true # 把从EurekaServer上发现的服务名称,转换成全小写

(3)编写启动类

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

三、谓词

谓词:当满足条件在进行路由转发。

在Spring Cloud Gateway中谓词实现GatewayPredicate接口。其中类名符合:XXXRoutePredicateFactory,其中XXX就是在配置文件中谓词名称。

所有的谓词都设置在predicates属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。

(1)Path

用于匹配路由地址规则的谓词。

spring:
  application:
    name: cloud-gateway
  cloud: 
    gateway:
      discovery:
        locator:
          enabled: false # 关闭自动发现工具的本地路由逻辑
          lower-case-service-id: true 
      routes:  # 配置多路由策略的属性,类型是List。配置方案是:回车 + 缩进 + - + 空格。集合中的每个对象的属性,对齐多行配置
        - id: application-service # 路由的唯一名称
          uri: lb://application-service # 规则满足后,转发到的地址。lb是spring cloud gateway支持的一种协议名
          predicates: # 谓词
            - Path=/service @Component public class MyKeyResolver implements KeyResolver { @Override public Mono<String> resolve(ServerWebExchange exchange) { String ip = exchange.getRequest() // 获取请求对象 .getRemoteAddress() // 获取客户端地址对象 InetSocketAddress .getAddress() // 获取客户端地址对象 InetAddress .getHostAddress(); // 获取客户端的主机地址(IP或唯一的主机名) return Mono.just(ip); // 创建返回结果对象 } }

(3)编写配置文件

server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: cloud-gateway
  cloud: 
    gateway: 
      discovery: 
        locator: 
          enabled: false 
          lower-case-service-id: true
      routes:
        - id: rateLimiter
          uri: lb://application-service
          predicates:
            - Path=/limiter @Controller public class FallbackController { @RequestMapping(value = "/fallback", produces = {"text/html; charset=UTF-8"}) @ResponseBody public String fallback(){ return "<div style='color:red; text-align: center'>服务器忙,请稍后重试!</div>"; } }

(3)配置文件

- id: hystrix
  uri: lb://application-service
  predicates:
    - Path=/hystrix @Component public class MyGlobalFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("前置全局过滤"); Mono<Void> result = chain.filter(exchange); System.out.println("后置全局过滤"); return result; } }

八、自定义路由过滤器

定义针对于Router的Filter。必须经由配置才能生效。 注意:

(1)编辑路由过滤器


@Component
public class LoggerFilterGatewayFilterFactory
            extends AbstractGatewayFilterFactory<LoggerFilterGatewayFilterFactory.Config> {
    
    public LoggerFilterGatewayFilterFactory(){
        this(Config.class);
    }
    public LoggerFilterGatewayFilterFactory(Class<Config> configClass){
        super(configClass);
    }
    
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("remark");
    }
    
    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                System.out.println("前置 - 日志过滤器 - config.remark = " + config.getRemark());
                Mono<Void> result = chain.filter(exchange);
                System.out.println("后置 - 日志过滤器 - config.remark = " + config.getRemark());
                return result;
            }
        };
    }
    
    public static class Config{
        private String remark;
        public String getRemark() {
            return remark;
        }
        public void setRemark(String remark) {
            this.remark = remark;
        }
    }
}

(2)编辑配置文件

- id: logger
  uri: lb://application-service
  predicates:
    - Path=/logger/**
  filters:
    - StripPrefix=1
    - LoggerFilter=simpleTestGatewayFilter
    - name: LoggerFilter
        args:
          remark: fullyTestGatewayFilter

到此这篇关于SpringCloud Gateway网关功能介绍与使用的文章就介绍到这了,更多相关SpringCloud Gateway内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯