文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloud Gateway的基本入门和注意点详解

2024-04-02 19:55

关注

1.gateway和zuul

Spring Cloud Finchley版本的gateway比zuul 1.x系列的性能和功能整体要好,且使用 Gateway 做跨域相比应用本身或是 Nginx 的好处是规则可以配置的更加灵活.

这两者相同的地方就是都是作为网关,处理前段的请求,可以进行路由到对应的服务或者url,也可以针对权限做过滤处理,也可以对其他服务响应的结果做处理

截至目前SpringCloud gateway最新版本是2.1.0 RC3,可见官方网站SpringCloud gateway,每个版本增加的功能都比较多,改动的地方也比较多,前几个版本有比较坑的地方,建议使用最新版本

2.使用gateway的路由功能

1. 搭载springcloud gateway

准备一个spring cloud工程,包括eureka-server注册中心,service-client服务提供者,端口8090

service-client提供一个接口:


@RestController
@Slf4j
public class ProducerController {
  @RequestMapping("/hi")
  public String hi(@RequestParam String name) {
    log.info("[client服务] [hi方法]收到请求");
    return "hi " + name + ",i am from service-client";
  }
}

再建一个spring cloud工程,service-gateway网关,端口8088

pom的依赖:


 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
 </parent>
 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
<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>

application启动类:


package com.zgd.springcloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

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

这样基本的框架就搭好了,先启动eureka-server注册中心,再启动service-client和service-gateway

直接调用 localhost:8090/hi?name=zgd,可以收到


hi zgd,i am from service-client

2.简单使用gateway

GateWay大体可以分为路由工厂Route Predicate Factories,网关过滤器工厂GatewayFilter Factories,全局过滤器工厂Global Filters处理请求。

对于路由转发,Spring Cloud gateway内置了很多校验条件谓语(predicate)来实现路由功能。

比如

有两种方式配置,一种是配置文件application的方式,一种是代码配置

1.application配置

a. 路由到其他地址


spring:
  cloud:
    gateway:
      #可以根据请求参数,cookie,host,请求时间,请求头等进行校验判断路由, 下面根据先后顺序转发
      routes:
        - id: host_route
          uri: http://httpbin.org:80/get
          predicates:
            - Path=/zzzgd*;q=0.8", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Accept-Language": "zh-CN,zh;q=0.9", 
    "Connection": "close", 
    "Cookie": "SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=undefined; SL_wptGlobTipTmp=undefined", 
    "Forwarded": "proto=http;host=\"localhost:8088\";for=\"0:0:0:0:0:0:0:1:55782\"", 
    "Host": "httpbin.org", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", 
    "X-Forwarded-Host": "localhost:8088"
  }, 
  "origin": "0:0:0:0:0:0:0:1, 119.147.213.42", 
  "url": "http://localhost:8088/get?name=zgd"
}

上面的是根据地址来路由,还有下面多种路由配置:

根据域名来转发路由:


routes:
 - id: host_route
   uri: http://httpbin.org:80/get
   predicates:
     - Host=**.csdn.** # 请求域名携带csdn的,则转发
 - id: query_route
   uri: http://httpbin.org:80/get
   predicates:
     - Query=username, zzz* # 请求参数含有username,且值满足zzz开头的,则转发(对值的匹配可以省略)
 - id: header_route
   uri: http://httpbin.org:80/get
   predicates:
     - Header=request, \d+ # 如果请求头含有request,且为数字,则转发
 - id: cookie_route
      uri: http://httpbin.org:80/get
      predicates:
        - Cookie=name, zzzgd # 如果携带cookie,参数名为name,值为zzzgd,则转发
    - id: path_route
      uri: http://httpbin.org:80/get
      predicates:
        - Path=/zzzgd
@Configuration
public class GateWayConfig {
  @Bean
  public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route(r -> r.path("/fluent/**").and().query("name")
                    .uri("http://httpbin.org:80/get"))
            .build();
  }
}

启动,访问

http://localhost:8088/fluent/1/?name=bb

成功!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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