文章目录
GATEWAY 路由使用
1 、路由的核心概念
1.1 router(路由)
路由是构建网关的基本模块,他由ID,目标的URI ,一系列的断言和过滤器组成,如果断言为true则匹配该路由
1.1.1 URI:的类型
- http://hostname/ip:port http协议
- ws://hostname/ip:port websocket 协议
- lb://applicatin-ame 为通过注册中心,注册的应用名称对请求进行自动负载均衡(较为常见,下划线不能被用作应用名,否则不能通过网关)
1.2 predicate(断言)
参考是java8重点java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(请求头,请求参数),如果请求与断言想匹配则进行路由。
1.3 fiter(过滤)
spring框架中gatewayFilter的实例,使用过滤器,可以在请求被路由前,或者路由后对请求进行修改。
2 GATEWAY的原理
-
客户端向springcloud gateway 发出请求。然后在gateway Handler mapping中找到与请求向匹配的路由,将其发送到Gateway web handler。
-
handler 在通过制定的过滤器链来讲请求发动到我们实际的服务之星业务逻辑。过滤器之间用虚线分开始分开是因为过滤器可能会再发送代理请求之前(“pre”) 或者之后(“post”)执行业务逻辑
-
filter 在 “pre” 类型的过滤器可以做参数的校验,权限校验,流量监控,日志输出,协议转换等。在“post”类型的过滤器中可以做响应内容、响应头的修改、日志输出,流量监控等有着非常重要的作用。
3 配置实例
3.1 创建父工程
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liu</groupId>
<artifactId>cloud-efk</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
</modules>
<packaging>pom</packaging>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.2</lombok.version>
<mysql.version>8.0.15</mysql.version>
<druid.version>1.1.10</druid.version>
<mybatis.spring.boot.version>3.2.0</mybatis.spring.boot.version>
<springfox.version>2.7.0</springfox.version>
<hutool.version>4.6.3</hutool.version>
<lang3.version>3.9</lang3.version>
<beanutils.verson>1.9.2</beanutils.verson>
</properties>
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据源-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mybatis-plugins-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--swgger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--commons-utils-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${lang3.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanutils.verson}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.1.RELEASE</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.2 创建网关
3.2.0 改pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-efk</artifactId>
<groupId>com.liu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>efk-gateway9001</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
</project>
3.2.1 bootstrap.yaml
server:
port: 9001
spring:
application:
name: efk-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
#dataId 匹配规则 nacos
#${spring.application.name}-${spring.profiles.active}.${spring.cloud.config.file-extension}
3.2.2 application.yml
spring:
profiles:
active: dev
3.2.3 启动类
package com.liu.efk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class Gateway9001 {
public static void main(String[] args) {
SpringApplication.run(Gateway9001.class,args);
}
}
3.3 创建测试模块
3.3.0 测试项目结构
3.3.1 改pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-efk</artifactId>
<groupId>com.liu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>efk-gateway-test9002</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
3.3.2 启动类
//9002 项目
package com.liu.efk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class GateWayTest9002 {
public static void main(String[] args) {
SpringApplication.run(GateWayTest9002.class,args);
}
}
//9003 项目
package com.liu.efk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class GateWayTest9003 {
public static void main(String[] args) {
SpringApplication.run(GateWayTest9003.class,args);
}
}
3.3.3 修改配置类application.yaml
#9002
server:
port: 9002
spring:
profiles:
active: dev
application:
name: efk-gateway-test
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 # 配置中心地址
file-extension: yaml #指定yaml格式的配置
#9003
server:
port: 9002 #9003
spring:
profiles:
active: dev
application:
name: efk-gateway-test
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 # 配置中心地址
file-extension: yaml #指定yaml格式的配置
3.4 配置中心文件
lb 协议: 通过应用服务名完成,负载均衡
spring:
cloud:
gateway:
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: lb://efk-gateway-test #匹配后提供服务的路由地址
predicates:
- Path=/gateway/** #断言,路径相匹配的进行路由
3.5 测试
localhost:9002/gateway/test
这里返回的是9002
localhost:9003/gateway/test
这里返回的是9003
localhost:9001/gateway/test
3.6 结果
通过这个实例完成, nacos+config+gateway+appid 动态负载均衡