【问题标题】:Issue Microservice routed to Gateway问题微服务路由到网关
【发布时间】:2021-04-02 10:32:20
【问题描述】:

我已经单独构建了:

尤里卡服务器, Spring Cloud Gateway(+发现客户端), Spring Web App(+发现客户端)

Eureka Server Main Class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ServiceRegistryApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRegistryApplication.class, args);
    }

}

application.yml

server:
   port: 8761
   
eureka:
   client:
      fetch-registry: false
      register-with-eureka: false

Gateway Main Class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

application.yml

server:
   port: 8080
   
spring:
   application:
      name: GATEWAY
   cloud:
      gateway:
         routes:
            -id: MICROSERVICE
            uri: lb://MICROSERVICE
            predicates:
                - Path: /service/**

         
eureka:
   client:
      register-with-eureka: true
      fetch-registry: true
      service-url: 
         defualtZone: http://localhost:8761/eureka
   instance: localhost

Microservice Main Class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class MicroserviceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceApplication.class, args);
    }

}

Microservice Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping
@RestController
public class HelloController {

    @GetMapping("/test")
    public String getWelcomed() {
        return "Welcome to Microservice !";
    }
}

application.yml

server:
   port: 8099

spring:
   application:
      name: MICROSERVICE
   
eureka:
   client:
      register-with-eureka: true
      fetch-registry: true
      service-url: 
         defualtZone: http://localhost:8761/eureka
   instance: localhost

我现在的问题是我无法通过网关访问我的微服务“/test”调用。 我不断收到此错误:

Whitelabel 错误页面此应用程序没有配置错误视图, 所以你认为这是一个后备。

2020 年 12 月 23 日星期三 21:10:14 WEST [3c6a9e3d-9] 发生了意外 错误(类型=未找到,状态=404)。 org.springframework.web.server.ResponseStatusException:404 NOT_FOUND 在 org.springframework.web.reactive.resource.ResourceWebHandler.lambda$handle$0(ResourceWebHandler.java:325) 抑制: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:错误有 在以下站点观察到:|_ 检查点⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] |_ 检查点 ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] |_ 检查点 ⇢ HTTP GET "/service/test" [ExceptionHandlingWebHandler] 堆栈跟踪:在 org.springframework.web.reactive.resource.ResourceWebHandler.lambda$handle$0(ResourceWebHandler.java:325) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) 在 reactor.core.publisher.Mono.subscribe(Mono.java:4252) 在 reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) 在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:174) 在 reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) 在 reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:359) 在 reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:211) 在 reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:161) 在 reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:86) 在 reactor.core.publisher.Mono.subscribe(Mono.java:4252) 在 reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) 在 reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) 在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) 在 reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) 在 reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76) 在 reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:274) 在 reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:851) 在 reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) 在 reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2344) 在 reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162) 在 reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2152) 在 reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2026) 在 reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) 在 reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) 在 reactor.core.publisher.Mono.subscribe(Mono.java:4252) 在 reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:441) 在 reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:211) 在 reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:161) 在 reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:86) 在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) 在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) 在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) 在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) 在 reactor.core.publisher.Mono.subscribe(Mono.java:4252) 在 reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) 在 reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) 在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) 在 reactor.netty.http.server.HttpServerHandle.onStateChange(HttpServerHandle.java:65) 在 reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:518) 在 reactor.netty.tcp.TcpServerBind$ChildObserver.onStateChange(TcpServerBind.java:278) 在 reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:475) 在 reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在 reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:191) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在 io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) 在 io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) 在 io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) 在 io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) 在 io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在 java.base/java.lang.Thread.run(Thread.java:834)

根据我发现的一些建议,我尝试从我的 eureka 服务器隐藏网关,但通过将其添加到我的application.yml in gateway 中,问题仍然存在:

eureka:
   client:
      register-with-eureka: false
      fetch-registry: false

【问题讨论】:

    标签: spring spring-boot microservices netflix-eureka spring-cloud-gateway


    【解决方案1】:

    控制器应该是

    @RestController
    @RequestMapping("/service")
    public class HelloController
    

    和网址:http://localhost:8080/service/test

    或者您可以将@RequestMapping() 留在控制器中并使用此路径创建网关:

    predicates:
     -Path=/**
    

    那么 URL 应该是:http://localhost:8080/test

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2023-04-10
      • 2023-02-03
      • 2015-07-06
      • 2021-04-01
      • 2019-02-14
      • 1970-01-01
      • 2020-09-15
      • 2018-02-08
      相关资源
      最近更新 更多