实现动态路由需要注册中心的支持,这里选择 Eureka 作为注册中心。
默认情况下 Gateway 会根据注册中心注册的`微服务名`为路径创建动态路由进行转发,从而实现动态路由的功能,这样就不用写死一个地址了。
![](https://img.kancloud.cn/e0/ce/e0ce13e098f405c10e0109b7b940b848_1592x530.png)
上面的两个微服务名是一样的,但请求地址不一样,下面网关通过微服务名来访问这两个微服务。
<br/>
动态路由实现步骤如下:
**1. 在网关模块引入 netflix-eureka-client**
```xml
<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>
```
**2. 在网关模块配置路由规则**
```yml
server:
port: 9527
spring:
application:
name: assemb-server-gateway
cloud:
gateway:
routes:
- id: assemb-server-payment #路由ID,自定义
uri: lb://assemb-server-payment #lb://微服务名
predicates:
- Path=/order/**
discovery:
locator:
enabled: true #开启注册中心动态路由功能
#网关也要注册到注册中心
eureka:
client:
service-url:
defaultZone: http://www.eureka7001.com:7001/eureka/
```
**3. 在网关模块的启动类上标记注解`@EnableDiscoveryClient`开启服务发现**
```java
@EnableDiscoveryClient
@SpringBootApplication
public class Gateway9527Application {
public static void main(String[] args) {
SpringApplication.run(Gateway9527Application.class, args);
}
}
```
**4. 测试**
1. 分别启动注册中心 eureka7001、微服务 payment8001/payment8002、网关gateway9527。
2. 通过网关访问微服务:http://127.0.0.1:9527/order/findById/99
![](https://img.kancloud.cn/87/7d/877da3baec8ff84a86eb67efb5a30891_1202x356.gif)
不停刷新,可以看到轮询地调用微服务 payment8001/payment8002。