石家庄做网站建设的公司排名,flashxml网站模板,wordpress 推特,游戏开发制作培训相关类介绍
动态路由#xff08;自己控制#xff0c;非注册中心控制#xff09;涉及两个很重要的Bean#xff1a;
RouteDefinitionWriter#xff1a;用于添加、修改、删除路由规则。RouteDefinitionLocator#xff1a;用于查询路由规则。
以及一个相关事件#xff1a…相关类介绍
动态路由自己控制非注册中心控制涉及两个很重要的Bean
RouteDefinitionWriter用于添加、修改、删除路由规则。RouteDefinitionLocator用于查询路由规则。
以及一个相关事件
RefreshRoutesEvent用于更新路由规则使上述的操作生效。
依赖及配置
先引入相关依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.chilun/groupIdartifactIdAPI_OPEN_SPACE_GATEWAY/artifactIdversion1.0-SNAPSHOT/versionpropertiesjava.version17/java.versionmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.7.9/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2021.0.5/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2021.0.5.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2021.0.5.0/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactIdversion3.0.3/version/dependency/dependencies
/project
以及配置文件application.yml
server:port: 8002
logging:level:org.springframework.cloud.gateway: DEBUG
myGateway:RoutePrefix: api
spring:profiles:active: devmvc:pathmatch:matching-strategy: ant_path_matchercloud:gateway:enabled: true服务中心相关配置
spring.cloud.nacos.config.server-addr127.0.0.1:8848
spring.application.namegateway
核心代码
定义服务层接口
import com.chilun.apiopenspace.gateway.entity.dto.DeleteRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.InitRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.SaveOrUpdateRouteRequest;
import com.chilun.apiopenspace.gateway.entity.pojo.RoutePOJO;
import reactor.core.publisher.Mono;import java.util.List;/*** author 齿轮* date 2024-02-08-22:39*/
public interface RouteService {void init(InitRouteRequest request);void saveOrUpdate(SaveOrUpdateRouteRequest request);void delete(DeleteRouteRequest request);void refresh();MonoListRoutePOJO getAll();
}
实现类适配器模式
package com.chilun.apiopenspace.gateway.service.impl;import com.chilun.apiopenspace.gateway.entity.dto.DeleteRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.InitRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.SaveOrUpdateRouteRequest;
import com.chilun.apiopenspace.gateway.entity.pojo.RoutePOJO;
import com.chilun.apiopenspace.gateway.service.RouteService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.net.URI;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;/*** author 齿轮* date 2024-02-08-22:43*/
Service
public class RouteServiceAdepter implements RouteService, ApplicationEventPublisherAware {Resourceprivate RouteDefinitionWriter routeDefinitionWriter;Resourceprivate RouteDefinitionLocator locator;Value(${myGateway.RoutePrefix})private String routePrefix;// PostConstruct
// public void test(){
// SaveOrUpdateRouteRequest saveOrUpdateRouteRequest new SaveOrUpdateRouteRequest();
// saveOrUpdateRouteRequest.setUri(https://www.baidu.com);
// saveOrUpdateRouteRequest.setId(1);
// saveOrUpdate(saveOrUpdateRouteRequest);
// }Overridepublic void init(InitRouteRequest request) {request.getList().forEach(this::saveOrUpdate);this.publisher.publishEvent(new RefreshRoutesEvent(this));}Overridepublic void saveOrUpdate(SaveOrUpdateRouteRequest request) {RouteDefinition routeDefinition new RouteDefinition();routeDefinition.setId(request.getId());routeDefinition.setUri(URI.create(request.getUri()));String Path / routePrefix / request.getId();routeDefinition.setPredicates(Collections.singletonList(new PredicateDefinition(Path Path)));routeDefinition.setFilters(Collections.singletonList(new FilterDefinition(SetPath/)));routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();}Overridepublic void delete(DeleteRouteRequest request) {routeDefinitionWriter.delete(Mono.just(request.getId())).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));}Overridepublic void refresh() {this.publisher.publishEvent(new RefreshRoutesEvent(this));}Overridepublic MonoListRoutePOJO getAll() {return locator.getRouteDefinitions().map(routeDefinition - {RoutePOJO routePOJO new RoutePOJO();routePOJO.setId(routeDefinition.getId());routePOJO.setURI(routeDefinition.getUri().toString());routePOJO.setPredicates(routeDefinition.getPredicates().stream().map(predicate - predicate.getArgs().values().toString()).collect(Collectors.toList()));routePOJO.setFilters(routeDefinition.getFilters().stream().map(FilterDefinition::getName).collect(Collectors.toList()));return routePOJO;}).collectList();}private ApplicationEventPublisher publisher;Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher applicationEventPublisher;}
}Controller层代码
package com.chilun.apiopenspace.gateway.controller;import com.chilun.apiopenspace.gateway.entity.dto.DeleteRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.InitRouteRequest;
import com.chilun.apiopenspace.gateway.entity.dto.SaveOrUpdateRouteRequest;
import com.chilun.apiopenspace.gateway.entity.pojo.RoutePOJO;
import com.chilun.apiopenspace.gateway.service.RouteService;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;import javax.annotation.Resource;
import java.util.List;/*** author 齿轮* date 2024-02-13-22:13*/
RestController
RequestMapping(/manage)
public class RouteController {ResourceRouteService service;PostMapping(/update)public void add(RequestBody SaveOrUpdateRouteRequest request) {service.saveOrUpdate(request);}PostMapping(/init)public void init(RequestBody InitRouteRequest request) {service.init(request);}PostMapping(/delete)public void delete(RequestBody DeleteRouteRequest request) {service.delete(request);}GetMapping(/getAll)public MonoListRoutePOJO getAll() {return service.getAll();}GetMapping(/refresh)public void refresh(){service.refresh();}
}
代码请自行查看看不懂就问大语言模型。
代码逻辑较简单仅基本增删改查功能其他延伸方面如安全等请自行探索。
其他代码
实体类
package com.chilun.apiopenspace.gateway.entity.dto;import lombok.Data;/*** author 齿轮* date 2024-02-13-20:01*/
Data
public class DeleteRouteRequest {String id;
}package com.chilun.apiopenspace.gateway.entity.dto;import lombok.Data;import java.util.List;/*** author 齿轮* date 2024-02-13-20:00*/
Data
public class InitRouteRequest {ListSaveOrUpdateRouteRequest list;
}package com.chilun.apiopenspace.gateway.entity.dto;import lombok.Data;/*** author 齿轮* date 2024-02-13-19:55*/
Data
public class SaveOrUpdateRouteRequest {String id;String uri;
}package com.chilun.apiopenspace.gateway.entity.pojo;import lombok.Data;import java.util.List;/**** Route实体类用于远程调用接受参数* author 齿轮* date 2024-02-13-19:53*/
Data
public class RoutePOJO {String id;String URI;ListString Predicates;ListString Filters;
}swagger文档配置类
package com.chilun.apiopenspace.gateway.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** author 齿轮* date 2024-02-14-1:32*/
Configuration
EnableSwagger2
Profile({dev})
public class Knife4jConfig {Beanpublic Docket defaultApi2() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(new ApiInfoBuilder().title(API开放平台接口文件).description(API开放平台).contact(new Contact(chilun, http://home.shoumingchilun.cn, 2265501251qq.com)).version(1.0).build()).select()// 指定 Controller 扫描包路径.apis(RequestHandlerSelectors.basePackage(com.chilun.apiopenspace.gateway.controller)).paths(PathSelectors.any()).build();}
}