通過gateway配合nacos做動態(tài)路由一共兩種方式琉历,第一種時(shí)通過json,解析json進(jìn)行動態(tài)路由,另一種通過設(shè)置properties文件進(jìn)行路由
一乾胶、通過解析json
gateway的動態(tài)路由可以配置在nacos的配置中心上,gateway啟動的時(shí)候來讀取配置朽寞,對各個(gè)請求進(jìn)行路由
配置文件如下所示
server:
port:9537
spring:
application:
name: cloud-alibaba-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: json
group: DEFAULT_GROUP#nacos分組
? ? gateway:#路由
? ? ? discovery:
locator:
enabled:true? ? ? #開啟從注冊中心動態(tài)創(chuàng)建路由的功能识窿,利用微服務(wù)名進(jìn)行路由
management:
endpoints:
web:
exposure:
include: cloud-alibaba-gateway
1、新建配置類
package com.gateway.springcloud.config;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;
/**
* 配置動態(tài)路由
*/
@Configuration
public class NacosDynamicRouteServiceimplements ApplicationEventPublisherAware {
private StringdataId ="cloud-alibaba-gateway";
? ? private Stringgroup ="DEFAULT_GROUP";
? ? @Value("${spring.cloud.nacos.config.server-addr}")
private StringserverAddr;
? ? @Autowired
? ? private RouteDefinitionWriterrouteDefinitionWriter;
? ? private ApplicationEventPublisherapplicationEventPublisher;
? ? private static final ListROUTE_LIST =new ArrayList<>();
? ? @PostConstruct
? ? public void dynamicRouteByNacosListener() {
try {
Properties properties =new Properties();
? ? ? ? ? ? properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
? ? ? ? ? ? ConfigService configService = NacosFactory.createConfigService(properties);
? ? ? ? ? ? String config = configService.getConfig(dataId, group, 5000);
? ? ? ? ? ? configService.addListener(dataId, group, new Listener() {
@Override
? ? ? ? ? ? ? ? public void receiveConfigInfo(String configInfo) {
clearRoute();
? ? ? ? ? ? ? ? ? ? try {
List gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class);
? ? ? ? ? ? ? ? ? ? ? ? for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {
addRoute(routeDefinition);
? ? ? ? ? ? ? ? ? ? ? ? }
publish();
? ? ? ? ? ? ? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? ? ? ? ? ? ? }
}
@Override
? ? ? ? ? ? ? ? public ExecutorgetExecutor() {
return null;
? ? ? ? ? ? ? ? }
});
? ? ? ? }catch (NacosException e) {
e.printStackTrace();
? ? ? ? }
}
private void clearRoute() {
for(String id :ROUTE_LIST) {
this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
? ? ? ? }
ROUTE_LIST.clear();
? ? }
private void addRoute(RouteDefinition definition) {
try {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
? ? ? ? ? ? ROUTE_LIST.add(definition.getId());
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
}
private void publish() {
this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));
? ? }
@Override
? ? public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
? ? }
}
2、啟動gateway網(wǎng)關(guān)
這一步一定要在nacos添加配置之前甥温,因?yàn)榕渲妙愄砑拥谋O(jiān)聽如果nacos上的配置沒有進(jìn)行添加或者修改锻煌,網(wǎng)關(guān)是讀不到配置的,因?yàn)樗O(jiān)聽的是改變姻蚓。
3宋梧、nacos添加配置
里面的name參數(shù)狰挡,gateway已經(jīng)規(guī)定好了,不允許隨意修改加叁,值如下圖所示倦沧。
二、通過properties配置文件
本方式不需要建配置類它匕,原理就是通過配置中心直接把動態(tài)路由的配置讀到配置文件中,首先新建properties文件豫柬,
server.port=9547
spring.application.name=cloud-alibaba-gatewayaa
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.gateway.discovery.locator.enabled=true
進(jìn)入nacos,新建配置
yml配置如下所示