我正在尝试将正在使用的网关迁移spring-cloud-starter-netflix-zuul到 Spring Cloud Gateway,但我遇到了请求路由问题。
我浏览了以下有关为 DiscoveryClient 路由配置谓词和过滤器的文档:
这是我的 Netflix Zuul 配置中的一个片段:
zuul:
routes:
account-service: /accounts/**
Run Code Online (Sandbox Code Playgroud)
这是 Spring Cloud Gateway 配置中的一个片段,我试图在其中配置等效路由:
spring:
cloud:
gateway:
routes:
- id: account-service-route
uri: lb://account-service
predicates:
- Path=/accounts/**
Run Code Online (Sandbox Code Playgroud)
我使用 Spring Cloud Eureka 作为我的发现服务器(在一个单独的微服务中),并且我目前没有配置DiscoveryClient 路由的谓词和过滤器中概述的任何配置
如果我向 发出请求/accounts/***,我会收到 404 响应。如果我将 Spring Cloud Gateway 配置更改为以下内容并向 发出相同的请求/account-service/***,则会收到 403 Forbidden 响应:
spring:
cloud:
gateway:
routes:
- id: account-service-route
uri: lb://account-service
predicates:
- Path=/account-service/**
Run Code Online (Sandbox Code Playgroud)
我怀疑这与 Spring Cloud Gateway 在配置 DiscoveryClient 路由方面的默认行为有关,但我在日志中没有看到足够的信息来指出正确的方向。 …
我开发了异步Spring Cloud Stream服务,我正在尝试开发一种边缘服务,它使用@MessagingGateway来提供对异步服务的同步访问.
我目前正在获得以下堆栈跟踪:
Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:355)
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:271)
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:188)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
... 47 common frames omitted
Run Code Online (Sandbox Code Playgroud)
我的@MessagingGateway:
@EnableBinding(AccountChannels.class)
@MessagingGateway
public interface AccountService {
@Gateway(requestChannel = AccountChannels.CREATE_ACCOUNT_REQUEST,replyChannel = AccountChannels.ACCOUNT_CREATED, replyTimeout = 60000, requestTimeout = 60000)
Account createAccount(@Payload Account account, @Header("Authorization") String authorization);
}
Run Code Online (Sandbox Code Playgroud)
如果我通过@StreamListener在回复频道上使用该消息,它可以正常工作:
@HystrixCommand(commandKey = "acounts-edge:accountCreated", fallbackMethod = "accountCreatedFallback", commandProperties = {@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")}, ignoreExceptions = {ClientException.class})
@StreamListener(AccountChannels.ACCOUNT_CREATED)
public void accountCreated(Account account, @Header(name …Run Code Online (Sandbox Code Playgroud) spring-integration spring-rabbitmq spring-cloud-stream spring-integration-amqp
使用 Spring CloudHoxton.SR4和 Spring Boot2.2.9.RELEASE库,我的 Spring Boot 微服务可以正确启动,并且在本地环境中针对 localstack 运行时运行得很好,但是当我升级到 时Hoxton.SR7,我得到以下堆栈跟踪:
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.getToken(InstanceMetadataServiceResourceFetcher.java:91)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:69)
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371)
at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38)
at org.springframework.cloud.aws.context.annotation.OnAwsCloudEnvironmentCondition.matches(OnAwsCloudEnvironmentCondition.java:38)
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDefinitionReader.java:469)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:131)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at com.acme.Bootstrapper.main(Bootstrapper.java:33)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at …Run Code Online (Sandbox Code Playgroud) 我能够弄清楚如何设置它的唯一方法是在我的配置中使用以下覆盖:
@Bean("myFactory")
@ConditionalOnClass(SqsAsyncClient.class)
SqsMessageListenerContainerFactory<Object> mySqsListenerContainerFactory(
SqsAsyncClient sqsAsyncClient) {
return SqsMessageListenerContainerFactory.builder()
.configure(
options ->
options.acknowledgementMode(
AcknowledgementMode.valueOf("ON_SUCCESS")))
.sqsAsyncClient(sqsAsyncClient)
.build();
}
Run Code Online (Sandbox Code Playgroud)
这在我的@SQSListener:
@SqsListener(
value = "myQueue",
factory = "myFactory")
Run Code Online (Sandbox Code Playgroud)
我还没有弄清楚如何配置它,以便io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration类可以设置确认模式,并且我可以获得让 Spring 自动配置我需要的一切的好处。谁能告诉我应该如何继续发展?
在 Spring Cloud AWS 3.x 之前,我们设置如下@SQSListener,似乎不再支持:
@SqsListener(
value = "myQueue",
deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
Run Code Online (Sandbox Code Playgroud)