1.引入依赖
这里配合nacos注册中心使用
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.配置启动类
使用时需要将网关进行启动
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(GatewayApplication.class, args);
}
}
3.路由配置
1.静态路由配置:
spring配置文件中配置:
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.150.101:8848 #nacos注册中心ip地址、端口号
gateway:
routes:
- id: item # 路由规则id,自定义,唯一
uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
- Path=/items/**,/search/** # 这里是以请求路径作为判断规则
- id: cart
uri: lb://cart-service
predicates:
- Path=/carts/**
- id: user
uri: lb://user-service
predicates:
- Path=/users/**,/addresses/**
- id: trade
uri: lb://trade-service
predicates:
- Path=/orders/**
- id: pay
uri: lb://pay-service
predicates:
- Path=/pay-orders/**
网关路由有四个常用配置:
-
id
:路由的唯一标示 -
predicates
:路由断言,其实就是匹配条件 -
filters
:路由过滤条件 -
uri
:路由目标地址,lb://
代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问
2.动态路由配置
1.引入依赖
<!--统一配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--加载bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.添加bootstrap.yml文件并配置
spring:
application:
name: gateway
profiles:
active: dev
cloud:
nacos:
server-addr: 192.168.3.129:8848 #nacosIP地址及端口号
config:
file-extension: yaml
shared-configs:
- data-id: log.yml #日志配置,在nacos中添加的配置
3.使用相关api进行路由的监听及保存
@Slf4j
@RequiredArgsConstructor
@Component
public class DynamicRouteLoader {
private final NacosConfigManager nacosConfigManager;
private final String dataId="gateway.json"; //需要与nacos配置项名相同
private final String group="DEFAULT_GROUP"; //与上类似
private Set<String> routeIds=new HashSet<>();
private final RouteDefinitionWriter routeDefinitionWriter;
@PostConstruct
public void initRouteConfigListener() throws NacosException {
String configInfo=nacosConfigManager.
getConfigService()
.getConfigAndSignListener(dataId, group, 5000, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
//更新路由配置
updateRouteConfig(configInfo);
}
});
//第一次启动加载路由配置
updateRouteConfig(configInfo);
}
private void updateRouteConfig(String configInfo){
log.info("update route config:{}",configInfo);
//解析路由配置
List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);
//删除旧的路由
for (String routeId : routeIds) {
routeDefinitionWriter.delete(Mono.just(routeId)).subscribe();
}
//清空保存的路由id
routeIds.clear();
routeDefinitions.forEach(routeDefinition -> {
// 保存路由id
routeIds.add(routeDefinition.getId());
//更新路由
routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();
});
}
}
4.进入nacos添加配置
由于代码中使用json工具类解析nacos配置,故需要使用json格式填写配置内容
[
{
"id": "item",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/items/**", "_genkey_1":"/search/**"}
}],
"filters": [],
"uri": "lb://item-service"
},
{
"id": "cart",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/carts/**"}
}],
"filters": [],
"uri": "lb://cart-service"
},
{
"id": "user",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/users/**", "_genkey_1":"/addresses/**"}
}],
"filters": [],
"uri": "lb://user-service"
},
{
"id": "trade",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/orders/**"}
}],
"filters": [],
"uri": "lb://trade-service"
},
{
"id": "pay",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/pay-orders/**"}
}],
"filters": [],
"uri": "lb://pay-service"
}
]