刚刚上班,第一个项目是前辈写的公司内部的服务平台,我们进行二期的功能完善,一开始啥也不会,就只会增删改查,看见动态路由,什么都不懂,就只能百度,之后问老师傅,然后慢慢写,下面这个是我写完之后的动态路由的,希望能给和我一样的萌新一点启发。
首先,要有三个model类,分别是route (路由类),pedicate(断言类)还有filter(过滤器类),这三个类是我要存进数据库中需要的类。
mport com.baomidou.mybatisplus.annotations.TableField;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
public class Route {
//路由ID
private String route_id;
//路由断言
private String predicate;
//路由断言集合配置
@TableField(exist = false)
private List<Predicate> predicates = new ArrayList<>();
//路由过滤器
private String filter_code;
//路由过滤器集合配置
@TableField(exist = false)
private List<Filter> filters = new ArrayList<>();
//路由规则转发的目标uri
private String uri;
//路由执行的顺序
public int order = 0;
//备注
public String remark;
//创建时间
public Date create_date;
}
import lombok.Data;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
public class Predicate {
/**
* 断言名称
*/
private String name;
/**
* 断言规则
*/
private Map<String,String> args = new LinkedHashMap<>();
}
import lombok.Data;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
public class Filter {
/**
* 过滤器名称
*/
private String name;
/**
* 过滤规则
*/
private Map<String,String> args = new LinkedHashMap<>();
}
之后,因为使用了mybatis plus 所以我有一个 DAO,也就是RouteDao,里面只有一个findlist方法,这里就不写出来了。
题外话,要是你要分页的话,一定要写一下mp的分页配置,这个坑我先踩为敬~
之后就是我们的Service还有Impl,
Service这边一共有两个,分别是DynamicRouteService(动态路由)还有数据库的RouteSQLService(数据库路由),其中动态路由是实际上使用的路由服务的,也就是增删改查这些东西,数据库,大家都懂的。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.cloud.gateway.support.NotFoundException;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
public class DynamicRouteService implements ApplicationEventPublisherAware {
@Autowired
private RouteDefinitionWriter routeDefinitionWriter;
private ApplicationEventPublisher publisher;
//增加路由
public String add(RouteDefinition definition) {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
notifyChanged();
return "success";
}
//更新路由
public String update(RouteDefinition definition) {
try {
delete(definition.getId()).subscribe();
} catch (Exception e) {
return "update fail,not find route routeId: " + definition.getId();
}
try {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
notifyChanged();
return "