向同一服务的多个副本发送负载平衡(ribbon)和路由(zuul)SpringRESTAPI(SpringDataJPA)请求

向同一服务的多个副本发送负载平衡(ribbon)和路由(zuul)SpringRESTAPI(SpringDataJPA)请求,spring,rest,jpa,spring-boot,load-balancing,Spring,Rest,Jpa,Spring Boot,Load Balancing,我似乎找不到以下场景的清晰示例/解决方案;如有任何帮助/信息,将不胜感激 我有一个SpringRESTAPI服务,它使用SpringDataJPA与后端数据库服务器进行接口。我在多台机器上运行完全相同的服务,我有一个反向代理,将客户端请求(使用Netflix Zuul)路由到这些API服务,以便访问数据库中的数据。但是,我希望负载平衡请求(通过反向代理和Netflix Ribbon),以便每个请求只发送到单个API服务器(以负载平衡的方式) SpringDataJPA根据我定义的实体类和rest

我似乎找不到以下场景的清晰示例/解决方案;如有任何帮助/信息,将不胜感激

我有一个SpringRESTAPI服务,它使用SpringDataJPA与后端数据库服务器进行接口。我在多台机器上运行完全相同的服务,我有一个反向代理,将客户端请求(使用Netflix Zuul)路由到这些API服务,以便访问数据库中的数据。但是,我希望负载平衡请求(通过反向代理和Netflix Ribbon),以便每个请求只发送到单个API服务器(以负载平衡的方式)

SpringDataJPA根据我定义的实体类和rest存储库自动配置端点。一种解决方案是在反向代理上为API服务上的每个端点生成一个等效端点,然后使用功能区客户端分别对每个端点进行负载平衡。然而,这似乎不是合适的解决方案

我的问题是,Netflix Zuul或Ribbon是否提供任何功能来处理这种情况?从本质上说,我希望能够设置一个YAML配置,根据可用的listOfServers功能区配置,它只告诉Zuul使用一个功能区客户端,并自动将所有请求负载平衡到给定的端点

application.yml

例如:

DatabaseAPI:
  ribbon:
    eureka:
      enabled: false
  listOfServers: localhost:8080, localhost:8181, localhost:8282
  ServerListRefreshInterval: 15000

zuul:
  routes:
    data:
      path: /db/**
      ServiceId: DatabaseAPI

现在,例如,我希望以循环方式将对/db/**的每个请求发送到服务器列表中的一个可用服务器。注意:在这个配置示例中,每个请求都会同时发送到所有可用的服务器。我只希望它们中的一个接收每个请求。

我发现这实际上是为您自动配置的,如果您在类路径上有Zuul和Ribbon。基本上,我创建了三个这样的项目:

eureka服务器

bootstrap.properties

应用程序属性

EurekaServer

微服务项目

bootstrap.properties

应用程序属性

MsApplication

微服务网关

bootstrap.properties

应用程序属性

MSGateway应用程序

注意在此microservice gateway项目中,您必须对类路径具有功能区依赖关系

要运行第二个microservice实例,请使用以下命令:

java-jar-Dserver.port=8082 -Deureka.instance.metadataMap.instanceId=INSTANCE2 microservice-0.0.1-SNAPSHOT.jar


当您点击此url时,您将交替收到响应:端口上的Microservice:8081,端口上的Microservice:8082(这意味着Ribbon使用循环算法调用这两个实例)

默认情况下,Zuul使用Ribbon通过发现找到要转发到的实例(例如,您的案例中的Eureka)。因此,在网关应用程序(Zuul)中,类路径中不需要Ribbon

如果您没有通过Zuul看到实例之间的负载平衡,请尝试将请求相乘(例如>200个请求)

如果我没有错,“您希望其中一个实例接收每个请求”,为什么不使用Zuul筛选器(预筛选器)处理此问题。还有一件事我想澄清以上的答案


我也面临同样的困境,你找到解决办法了吗?除了我在上面的问题中提出的一些不合理的、可能的解决办法之外,没有,我还没有找到一个好的解决办法!我暂时把它放在一边,但我希望很快找到解决办法。他的问题中没有任何迹象表明他在使用尤里卡;事实上,他明确地禁用了它
ribbon.eureka.enabled=false
,即使他禁用了它,pegasus也在试图解释循环行为。这就是问题所在。
spring.application.name=eureka-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {

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

}
spring.application.name=microservice
server.port=8081
@SpringBootApplication
@EnableDiscoveryClient
public class MsApplication {

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

}

@RestController
class DummyController {

    @Value("${server.port}")
    private int serverPort;

    @GetMapping("/")
    public String home() {
        return "Microservice on port: " + serverPort;
    }

    @GetMapping("/test")
    public String someLogic() {
        return "Some hard stuff is done here";
    }

}
spring.application.name=microservice-gateway
server.port=9090
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class MsGatewayApplication {

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

}