SpringCloud之网关Gateway

Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0和Project Reactor等技术开发的网关

旨在为微服务框架提供一种简单而有效的统一的API路由管理方式,统一访问接口。

Spring Cloud Gateway作为Spring Cloud生态体系中的网关,目标是替代Netflix的Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等等。

它是基于Netty的响应式开发模式。

1、路由(route):路由是网关最基础的部分,路由信息由一个ID,一个目的URL、一组断言工厂和一组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。

2、断言(Predicate):Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自http Request中的任何信息,比如请求头和参数等。

3、过滤器(Filter):一个标准的Spring WebFilter,Spring Cloud Gateway中的Filter分为两种类型:Gateway Filter和Global Filter。过滤器Filter可以对请求和响应进行处理

2、基本搭建


①、新建模块

 ②、导入依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

com.gateway

code

0.0.1-SNAPSHOT

gateway

Demo project for Spring Boot

<maven.compiler.source>8</maven.compiler.source>

<maven.compiler.target>8</maven.compiler.target>

<spring-boot.version>2.4.1</spring-boot.version>

<spring-cloud.version>2020.0.0</spring-cloud.version>

<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>

org.springframework.boot

spring-boot-starter-webflux

org.springframework.boot

spring-boot-starter-test

org.springframework.cloud

spring-cloud-starter-gateway

org.springframework.boot

spring-boot-starter-actuator

org.projectlombok

lombok

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

org.springframework.cloud

spring-cloud-loadbalancer

com.alibaba

fastjson

1.2.35

org.springframework.boot

spring-boot-dependencies

${spring-boot.version}

pom

import

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud.version}

pom

import

com.alibaba.cloud

spring-cloud-alibaba-dependencies

${spring-cloud-alibaba.version}

pom

import

org.apache.maven.plugins

maven-compiler-plugin

3.8.1

1.8

1.8

UTF-8

org.springframework.boot

spring-boot-maven-plugin

2.4.1

com.gateway.code.GatewayApplication

repackage

repackage

③、nacos中注册服务

yml文件:

server:

#此处的8084端口号,就好像以前外置的tomcat的8080,让我们通过浏览器进行访问

#但此服务只是做了一个路由,它会将请求路由到其它微服务(一般是消费者)进行处理

port: 8084

spring:

application:

#微服务名

name: gateway

cloud:

nacos:

discovery:

#指定nacos注册中心的地址

server-addr: 127.0.0.1:8848

gateway:

discovery:

locator:

以前:localhost:8082/user/aa

路由:localhost:8084/consumer/user/aa

路由:localhost:8084/provider/user/aa

#是否与服务发现组件进行结合,通过service-id(必须设置成大写)转发到具体的服务实例。默认false

#为true代表开启基于服务发现的路由规则。

enabled: false

#配置之后访问时service-id无需大写

lower-case-service-id: true

routes: #路由

# 路由标识(id:标识,具有唯一性)

- id: user-consumer-api

#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死

uri: lb://consumer

#优先级,越小越优先

#order: 999

#路由条件(predicates:断言)

predicates:

# 路径匹配,

localhost:8082/user/aa 不能进入

localhost:8082/cum/user/aa 能

- Path=/cum/**

filters: #过滤器

#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo

#前缀过滤,请求地址:http://localhost:8084/usr/hello

#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务

#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉

- StripPrefix=1

#生产者

# 路由标识(id:标识,具有唯一性)

- id: user-provider-api

#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死

uri: lb://provider

#优先级,越小越优先

#order: 999

#路由条件(predicates:断言)

predicates:

# 路径匹配,

- Path=/api/prv/**

filters:

#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo

#前缀过滤,请求地址:http://localhost:8084/usr/hello

#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务

#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉

- StripPrefix=2

logging:

level:

#开启spring-Cloud-gateway的日志级别为debug,方便debug调试

org.springframework.cloud.gateway: trace

org.springframework.http.server.reactive: debug

org.springframework.web.reactive: debug

reactor.ipc.netty: debug

#springboot监控Actuator,暴露所有端点

management:

endpoints:

web:

exposure:

include: ‘*’

#自定义配置

gateway:

nacos:

#配置中心地址

server-addr: ${spring.cloud.nacos.discovery.server-addr}

#指定环境

namespace: xxx-xx-xx-xx

#读取配置管理中的Data Id

data-id: dynamic-routing.json

group: DEFAULT_GROUP

④、启动类GatewayApplication

增加注解

@EnableDiscoveryClient

运行:

3、路由方式1


yml文件:

gateway:

discovery:

locator:

#是否与服务发现组件进行结合,通过service-id(必须设置成大写)转发到具体的服务实例。默认false

#为true代表开启基于服务发现的路由规则。

enabled: true

#配置之后访问时service-id无需大写

lower-case-service-id: true

得到三种服务方式:

4、路由定义


路径分离:

yml文件:

routes: #路由

路由标识(id:标识,具有唯一性)

  • id: user-consumer-api

#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死

uri: lb://consumer

#优先级,越小越优先

#order: 999

#路由条件(predicates:断言)

predicates:

路径匹配,

localhost:8082/user/aa 不能进入

localhost:8082/cum/user/aa 能

  • Path=/cum/**

filters: #过滤器

#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo

#前缀过滤,请求地址:http://localhost:8084/usr/hello

#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务

#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉

  • StripPrefix=1

#生产者

路由标识(id:标识,具有唯一性)

  • id: user-provider-api

#目标服务地址(uri:地址,请求转发后的地址),会自动从注册中心获得服务的IP,不需要手动写死

uri: lb://provider

#优先级,越小越优先

#order: 999

#路由条件(predicates:断言)

predicates:

路径匹配,

  • Path=/api/prv/**

filters:

#路径前缀删除示例:请求/name/bar/foo,StripPrefix=2,去除掉前面两个前缀之后,最后转发到目标服务的路径为/foo

#前缀过滤,请求地址:http://localhost:8084/usr/hello

#此处配置去掉1个路径前缀,再配置上面的 Path=/usr/,就将转发到指定的微服务

#因为这个api相当于是服务名,只是为了方便以后nginx的代码加上去的,对于服务提供者service-client来说,不需要这段地址,所以需要去掉

  • StripPrefix=2

5、动态路由设置


①、自定义配置

yml文件:

#自定义配置

gateway:

nacos:

#配置中心地址

server-addr: ${spring.cloud.nacos.discovery.server-addr}

#指定环境

namespace: xxx-xx-xx-xx

#读取配置管理中的Data Id

data-id: dynamic-routing.json

group: DEFAULT_GROUP

在配置列表中新增配置dynamic-routing.json:

配置内容:

{

“refreshGatewayRoute”: true,

“routeList”: [

{

“id”: “consumer-api”,

“predicates”: [

{

“name”: “Path”,

“args”: {

“_genkey_0”: “/cum/**”

}

}

],

“filters”: [

{

“name”: “StripPrefix”,

“args”: {

“_genkey_0”: “1”

}

}

],

“uri”: “lb://consumer”,

“order”: 0

},

{

“id”: “provider-api”,

“predicates”: [

{

“name”: “Path”,

“args”: {

“_genkey_0”: “/api/pvr/**”

}

}

],

“filters”: [

{

“name”: “StripPrefix”,

“args”: {

“_genkey_0”: “2”

}

}

],

“uri”: “lb://provider”,

“order”: 0

}

]

}

②、解析

Ⅰ、yml注入到实体类

FilterEntity:

package com.gateway.code.pojo;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.experimental.Accessors;

import java.util.LinkedHashMap;

import java.util.Map;

/**

  • @author hgh

*/

@SuppressWarnings(“all”)

@Data

@NoArgsConstructor

@AllArgsConstructor

@Accessors(chain = true)

public class FilterEntity {

//过滤器对应的Name

private String name;

//路由规则

private Map<String, String> args = new LinkedHashMap<>();

}

GatewayNacosProperties:

package com.gateway.code.pojo;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.experimental.Accessors;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

@SuppressWarnings(“all”)

@Data

@NoArgsConstructor

@AllArgsConstructor

@Accessors(chain = true)

@ConfigurationProperties(prefix = “gateway.nacos”)

@Component

public class GatewayNacosProperties {

private String serverAddr;

private String dataId;

private String namespace;

private String group;

}

PredicateEntity:

package com.gateway.code.pojo;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.experimental.Accessors;

import java.util.LinkedHashMap;

import java.util.Map;

/**

  • @author hgh

*/

@SuppressWarnings(“all”)

@Data

@NoArgsConstructor

@AllArgsConstructor

@Accessors(chain = true)

public class PredicateEntity {

//断言对应的Name

private String name;

//断言规则

private Map<String, String> args = new LinkedHashMap<>();

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-ZhhXGWDg-1713418452690)]

[外链图片转存中…(img-4GBCKliT-1713418452691)]

[外链图片转存中…(img-wYlJeioB-1713418452691)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
[外链图片转存中…(img-KnWEZWOh-1713418452691)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值