之前,我们是这样调用服务提供者的
但是,如果服务提供者部署了多个实例,怎么实现负载均衡呢?答案就是使用Ribbon。
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
1)新建maven项目microservice-consumer,pom.xml文件引入spring boot、spring cloud和eureka-client的相关依赖。
4.0.0
cn.zhh
microservice-consumer
1.0
org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.M7
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
spring-milestones
Spring Milestones
https://repo.spring.io/libs-milestone
false
org.springframework.boot
spring-boot-maven-plugin
2)在application.yml加上以下配置。
server:
port: 8082
spring:
application:
name: consumer-order
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8080/eureka/
3)创建RestTemplate实例并注入到Spring容器。注意需要添加LoadBalanced注解,就可为其整合Ribbon,使其具备负载均衡的能力。
@Configuration
public class BeanConf {
@Bean
@LoadBalanced // 整合Ribbon,使其具备负载均衡的能力
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4)编写订单控制器,远程调用支付服务。并增加一个方法,用来测试Ribbon的负载均衡情况。
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/order/pay")
public String pay() {
System.out.println("订单服务开始调用支付服务...");
return restTemplate.getForObject("http://provider-pay/pay", String.class);
}
@GetMapping("/order/ribbon_test")
public String testRibbon() {
ServiceInstance serviceInstance = loadBalancerClient.choose("provider-pay");
return serviceInstance.getServiceId() + "-->" + serviceInstance.getHost() + ":" + serviceInstance.getPort();
}
}
5)启动Eureka Server和3个服务提供者(上一篇博客SpringCloud2.x——Eureka已经写了)。
此时,Eureka首页可以看到PROVIDER-PAY有了3个实例。
访问http://localhost:8082/order/pay成功,然后多次访问http://localhost:8082/order/ribbon_test,可以看到依次轮询地返回不同的服务提供者地址信息,说明负载均衡功能实现了。
也可以使用Java代码自定义Ribbon配置,不过比较麻烦,这里就不介绍了。
还是使用上面的项目microservice-consumer,在application.yml加上以下内容
provider-pay:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
这样,就可以将负载均衡规则修改为随机。
1)复制一份上面的项目microservice-consumer,将ArtifactId修改为microservice-consumer-ribbon-withot-eureka,并将pom.xml的eureka依赖去掉,引入Ribbon。
4.0.0
cn.zhh
microservice-consumer-ribbon-withot-eureka
1.0
org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.M7
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
spring-milestones
Spring Milestones
https://repo.spring.io/libs-milestone
false
org.springframework.boot
spring-boot-maven-plugin
2)修改application.yml。
server:
port: 8082
spring:
application:
name: consumer-order
provider_pay:
ribbon:
listOfServers: localhost:8081,localhost:8181
3)剩下操作和测试结果跟上面整合Eureka的例子一样,就不介绍了。