在前文的示例中,是将Ribbon与Eureka配合使用的。但现实中可能不具备这样的条件,例如一些遗留的微服务,它们可能并没有注册到Eureka Server上,甚至根本不是使用Spring Cloud开发的,此时要想使用Ribbon实现负载均衡,要怎么办呢?
Ribbon支持脱离Eureka使用,此时,架构如图5-3所示。
图5-3 脱离Eureka使用Ribbon架构图
下面笔者通过一个简单的示例为大家讲解如何脱离Eureka使用Ribbon。
1.复制项目microservice-consumer-movie-ribbon,将ArtifactId修改为microservice-consumer-movie-without-eureka。
2.为了让测试更具说服力,干脆为项目去掉Eureka的依赖spring-cloud-starter-netflix-eureka-client,只使用Ribbon的依赖spring-cloud-starter-netflix-ribbon。在项目的pom.xml中,找到:
将其修改为:
3.去掉启动类上的@EnableDiscoveryClient注解(如果有的话)。
4.将application.yml改成如下:
其中,属性microservice-provider-user.ribbon.listOfServers用于为名为microservice-provider-user的Ribbon客户端设置请求的地址列表。
测试
1.启动两个或更多microservice-simple-provider-user实例。
2.启动microservice-consumer-movie-without-eureka。
3.多次访问 http://localhost:8010/log-user-instance ,控制台打印如下日志。
由结果可知,尽管电影微服务和用户微服务此时并没有注册到Eureka上,Ribbon仍可正常工作,请求依旧会分摊到两个用户微服务节点上。
当EurekaClient依赖在项目的classpath下时,如果想单独使用Ribbon,而不使用Eurkea的服务发现功能,需添加配置ribbon.eureka.enabled=false。
某些场景下,我们可能只想让指定名称的Ribbon Client去使用指定的URL请求,其他Ribbon Client依旧与Eureka配合使用,那么可配置如下:
这样,对于名为<clientName>的Ribbon Client,即可从地址列表localhost:8000,localhost:8001中选择地址去请求,而其他名称的Ribbon Client依旧可与Eureka配合使用——自动从Eureka Server获得目标服务的地址,并选择一个去请求。
参考文档: https://github.com/spring-cloud/spring-cloud-netflix/issues/1995 .