当前位置: 首页 > 后端技术 > Java

springcloudgateway路由、过滤器

时间:2023-04-01 23:03:16 Java

1pom.xml中引入依赖,最新GA版本org.springframework.cloudspring-cloud-starter-gateway3.1.02启动类@SpringBootApplicationpublicclassDemoApplication{@BeanpublicRouteLocatorcustomRouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("routeA",r->r.path("/pathA").uri("http://www.a.com")).build();}publicstaticvoidmain(String[]args){System.setProperty("reactor.netty.ioWorkerCount","n");SpringApplication.run(DemoApplication.class,args);}}3application.ymlserver:port:80logging:level:org.springframework.cloud.gateway:INFOorg.springframework.http.server.reactive:INFOorg.springframework.web.reactive:INFOreactor.ipc.netty:INFO反应堆.netty:信息pring:cloud:gateway:routes:-id:routeBuri:http://www.b.compredicates:-Path=/pathB4启动后具有最简单的工程能力,有两个静态路由功能:pathA转发到www.a.compathB转发到www.b.com5动态路由需要实现这个接口:packageorg.springframework.cloud.gateway.route;publicinterfaceRouteDefinitionRepositoryextendsRouteDefinitionLocator,RouteDefinitionWriter{}接下来简单的小看一个例子:@ComponentpublicclassDemoRouteDefinitionRepositoryimplementsRouteDefinitionRepository{privateintidx=1;@OverridepublicFluxgetRouteDefinitions(){System.out.println("===========executegetRouteDefinitions");RouteDefinition定义=newRouteDefinition();definition.setId("路由C");如果(idx++%2==0){definition.setUri(URI.create("http://www.c1.com"));}else{definition.setUri(URI.create("http://www.c2.com"));}PredicateDefinitionpredicate=newPredicateDefinition();predicate.setName("路径");Mapmap=newHashMap<>();map.put("模式","/pathC");predicate.setArgs(地图);definition.setPredicates(Arrays.asList(predicate));返回Flux.fromIterable(Arrays.asList(定义));}@OverridepublicMonosave(Monoroute){returnnull;}@OverridepublicMonodelete(MonorouteId){returnnull;可以看到getRouteDefinitions()提供了路由信息,启动时会读取一次这里为了模拟动态情况,需要一个事件来触发对getRouteDefinitions()的调用以更新路由。触发的动作是发送RefreshRoutesEvent事件:@RestControllerpublicclassHomeControllerimplementsApplicationEventPublisherAware{privateApplicationEventPublisherpublisher;@GetMapping("/change")publicMonomsg(){publisher.publishEvent(newRefreshRoutesEvent(this));返回Mono.empty();}@OverridepublicvoidsetApplicationEventPublisher(ApplicationEventPublisherapplicationEventPublisher){this.publisher=applicationEventPublisher}每次调用;change,路由信息会改变一次,当然你也可以增加或删除一条路由信息,保存和删除在本例中没有实现。5依赖依赖远程远程服务过滤器继承继承继承继承继承继承继承的的的的的类,一一一nameValue参数:公共摘要类摘要类摘要abractivalnamevaluegatewaywaywayfilterfactors扩展}@OverridepublicListshortcutFieldOrder(){returnArrays.asList(GatewayFilter.NAME_KEY,GatewayFilter.VALUE_KEY);}@ValidatedpublicstaticclassNameValueConfig{@NotEmpty受保护的字符串名称;@NotEmpty受保护的字符串值;publicStringgetName(){返回名称;}publicNameValueConfigsetName(Stringname){this.name=name;归还这个;}publicStringgetValue(){返回值;}publicNameValueConfigsetValue(Stringvalue){this.value=value;归还这个;}@OverridepublicStringtoString(){returnnewToStringCreator(this).append("name",name).append("value",value).toString();}}}比配置yml的时候:@ComponentpublicclassDemoGatewayFilterFactoryextendsAbstractNameValueGatewayFilterFactory{privateWebClientclient=WebClient.create();@OverridepublicGatewayFilterapply(NameValueConfigconfig){System.out.println("config.getName()="+config.getName());System.out.println("config.getValue()="+config.getValue());return(exchange,chain)->{System.out.println("====0"+Thread.currentThread()+System.currentTimeMillis());returnclient.get().uri("http://127.0.0.1:1701/abc1").exchangeToMono(response->{System.out.println("====1"+Thread.currentThread()+System.currentTimeMillis());returnresponse.bodyToMono(String.class);}).map(abc->{System.out.println("====2"+Thread.currentThread()+System.currentTimeMillis());exchange.getRequest().mutate().header("abc","a1").build();返回交换;}).flatMap(chain::filter);};}}