gateway
gateway网关主要就是对外接收各种请求,然后根据自己内容的路由逻辑将请求发给服务
graph TD
Start --> gateway
gateway --> 路由
路由 --> user
路由 --> base
路由 --> order
路由 --> ...
gateway服务搭建
第1步:依赖
构建一个gateway服务只需要增加相应的依赖
xml
<?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>org.example</groupId>
<artifactId>gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud-alibaba-version>2021.1</spring-cloud-alibaba-version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
<spring-boot.version>2.4.2</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第2步:创建yaml文件
主要是要新增路由逻辑配置
yaml
server:
port: 9999
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: 10.106.114.1:8848
gateway:
routes:
- id: user
uri: http://10.106.114.1:9001/
predicates:
- Path=/user/**
上面配置的gateway.routes就是路由
-
id:标记路由
-
predicates:路由配置
- Path:其中一个路径,上面
/user/**表示当请求localhost:9999/user/xxx时,会将请求转发到http://10.106.114.1:9001/user/xxx
- Path:其中一个路径,上面
-
uri:转发的地址
第3步:启动类
java
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayStartApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayStartApplication.class,args);
}
}
第4步创建user服务
user服务主要要注意的是,由于请求是http://10.106.114.1:9001/user/xxx多了一个user,所以需要在user服务里面增加context-path。下面是user服务的配置
yaml
server:
port: 9001
servlet:
context-path: /user/
spring:
application:
name: user
cloud:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoint:
web:
exposure:
include:'*'
第5步验证
- 启动nacos
- 启动gateway
- 启动user
- 访问9001:http://10.106.114.1:9001/user/hello 确定user服务正常
- 访问9999:http://10.106.114.1:9999/user/hello

自定义路由
上面使用的配置文件来实现路由。也可以使用自定义类来实现路由模式。
第1步:注释yaml里面的路由配置

第2步:创建自定义类路由
java
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
System.out.println("加载路由");
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("user",
r->r.path("/user/**").uri("http://10.106.114.1:9001/"));
return routes.build();
}
}
第3步:验证
效果同样
