如何在Netflix Ribbon中添加实例以实现多端口负载均衡?
问题描述
当前生产者使用默认端口1013,配置信息如下:
server.port=1013 eureka.client.serviceUrl.defaultZone=http://localhost:1000/eureka eureka.instance.instanceId= ${spring.application.name}:${random.int}
请问如何在Netflix Ribbon中添加另一个实例,让负载均衡可以选择任意端口?
解决方案
其实Ribbon的负载均衡核心依赖于服务实例的发现,最省心的方式是依托Eureka自动管理实例,当然也支持静态配置,下面分两种情况说明:
方式一:依托Eureka自动发现(推荐)
因为你的生产者已经配置了注册到Eureka,所以只需要启动另一个生产者实例并让它也注册到同一个Eureka Server即可:
- 启动新实例时指定不同端口:
你可以通过命令行参数直接指定端口,比如假设你的生产者jar包名为producer-service.jar,执行:
或者用IDE启动时,在运行配置里添加程序参数java -jar producer-service.jar --server.port=1014--server.port=1014就行。 - 确保新实例的Eureka配置一致:
新实例的eureka.client.serviceUrl.defaultZone必须和现有实例保持一致(都是http://localhost:1000/eureka),这样它才能被Eureka Server识别并完成注册。另外你的instanceId配置用了${random.int},每个实例会生成唯一ID,Eureka能正确区分不同实例。 - 验证负载均衡:
当消费者服务调用这个生产者时,Ribbon会自动从Eureka拉取所有已注册的实例(1013、1014,后续新增的实例也会自动纳入),然后按照默认的轮询策略(或者你自定义的策略)分配请求,自动实现负载均衡。
方式二:手动静态配置实例列表(适合无Eureka场景)
如果不想依赖Eureka做服务发现,也可以在消费者的配置文件里直接指定Ribbon的服务实例列表:
- 打开消费者的
application.properties(或application.yml) - 添加以下配置(替换
your-producer-service-name为你的生产者服务名):
这样Ribbon就会在这两个端口的实例间做负载均衡。不过这种方式是静态的,后续新增实例需要手动修改配置并重启消费者,灵活性远不如Eureka自动发现。your-producer-service-name.ribbon.listOfServers=localhost:1013,localhost:1014
内容的提问来源于stack exchange,提问作者Bhaskar
相关产品推荐
相关产品推荐

