当前位置: 代码网 > it编程>编程语言>Java > 一文掌握spring cloud gateway(总结篇)

一文掌握spring cloud gateway(总结篇)

2024年12月24日 Java 我要评论
什么是gateway在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:1.请求路由:根据请求的url路径和

什么是gateway

在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:
1.请求路由:根据请求的url路径和其他参数,将请求路由到正确的后端服务。
2.负载均衡:在多个服务实例之间分配流量,以提高可用性和可扩展性。
3.认证和授权:检查用户是否有权访问特定的服务。
4.限流:控制访问后端服务的请求速率,以防止过载。
5.监控:收集关于api使用情况的统计数据,用于分析和计费。
6.日志记录:记录所有通过网关的请求和响应,以便进行问题排查和性能监控。
7.缓存:提高响应速度和减少后端负载,通过缓存常见的响应。
8.过滤:检验当前的请求是否符合请求的规则。

客户端向 spring cloud gateway 发出请求。如果 gateway handler mapping 确定请求与路由匹配,则将其发送到 gateway web handler。此处理程序通过特定于该请求的过滤器链运行该请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。所有“前”过滤器逻辑都​​会执行。然后发出代理请求。发出代理请求后,运行“后”过滤器逻辑。

如何导入gateway依赖

1.导包

<dependencymanagement>
        <dependencies>
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupid>com.alibaba.cloud</groupid>
                <artifactid>spring-cloud-alibaba-dependencies</artifactid>
                <version>2021.0.6.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencymanagement>
		<dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-gateway</artifactid>
 		</dependency>

2.配置yaml文件

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: circuitbreaker
          args:
            name: mycircuitbreaker
            fallbackuri: forward:/fallback //默认的兜底策略
      routes:
      - id: fee-service
        uri: lb://fee-service //指定的服务
        predicates:
        - path=/query  //断言

路由配置

1.配置路由谓词工厂和网关过滤器工厂
配置谓词和过滤器有两种方式:快捷方式和完全展开参数。
名称和参数名称将列code在每个部分的第一句或第二句中。参数通常按快捷方式配置所需的顺序列出。
快捷方式配置由过滤器名称识别,后跟等号(=),后跟用逗号分隔的参数值(,)。
配置文件实现:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - cookie=mycookie,mycookievalue

java代码实现过滤方式:

@configuration
public class gateconfig {
    @bean
    public routelocator routelocator(routelocatorbuilder builder) {
        return builder.routes()
                .route(r -> r.path("/check")
                        .filters(f -> f.filter(new ipwhitelistfilter()))  // 注册过滤器
                        .uri("lb://fee-service"))
                .build();
    }
}
package com.umpay.config;
import lombok.extern.slf4j.slf4j;
import org.springframework.cloud.gateway.filter.gatewayfilter;
import org.springframework.cloud.gateway.filter.gatewayfilterchain;
import org.springframework.context.annotation.configuration;
import org.springframework.core.ordered;
import org.springframework.http.httpstatus;
import org.springframework.web.server.serverwebexchange;
import reactor.core.publisher.mono;
/**
 * @author zq
 * data 2024-12-18
 */
@configuration
@slf4j
public class ipwhitelistfilter implements gatewayfilter, ordered {
    private static final string allowed_ips = "allowedips";
    private static final string denied_ips = "deniedips";
    @override
    public mono<void> filter(serverwebexchange exchange, gatewayfilterchain chain) {
        string clientip=exchange.getrequest().getremoteaddress().getaddress().gethostaddress();
        log.info("获取到的ip:============:{}",clientip);
        string responsebody = "{\"error\": \"custom error message\"}";
        if(!"1111111".equals(clientip)){
            exchange.getresponse().setstatuscode(httpstatus.bad_request);
            exchange.getresponse().getheaders().add("content-type", "application/json");
            return exchange.getresponse()
                    .writewith(mono.just(exchange.getresponse()
                            .bufferfactory().wrap(responsebody.getbytes())));
        }
        return chain.filter(exchange);
    }
    @override
    public int getorder() {
        return 0;
    }
}

gateway配置断路器

导包

<dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-circuitbreaker-resilience4j</artifactid>
        </dependency>
        <dependency>
            <groupid>io.github.resilience4j</groupid>
            <artifactid>resilience4j-feign</artifactid>
        </dependency>
        <dependency>
            <groupid>io.github.resilience4j</groupid>
            <artifactid>resilience4j-reactor</artifactid>
        </dependency>

配置

spring:
  cloud: 
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: circuitbreaker
          args:
            name: mycircuitbreaker
            fallbackuri: forward:/fallback
      routes:
      - id: fee-service
        uri: lb://fee-service
        predicates:
        - path=/query
        filters:
        - name: circuitbreaker
          args:
            name: mycircuitbreaker
            fallbackuri: forward:/fallback
 //断路器配置
 resilience4j:
  circuitbreaker:
    instances:
      mycircuitbreaker:
        slidingwindowsize: 10
        failureratethreshold: 50
        minimumnumberofcalls: 5
        waitdurationinopenstate: 10s

兜底接口

@restcontroller
@slf4j
public class gatecontroller {
    @autowired
    private feginclients feginclients;
    @getmapping("/fallback")
    public wrapper query(){
        log.info("test:================");
        return wrappermapper.error();
    }
}

到此这篇关于spring cloud gateway 总结的文章就介绍到这了,更多相关spring cloud gateway内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com