前几篇文章学习了Spring Cloud的注册中心,服务注册,服务发现与消费。
假设现在这样一种场景:
商场开的海底捞生意太过火爆,每天很多人排队,供不应求怎么办呢,商场又入驻了一家海底捞,现在有了两家海底捞入驻到商场,分别是6666号分店和8888号分店。这样当一家店爆满的时候可以去另外一家消费。把这种情景搬到业务场景中,就相当于负载均衡,将人流量均匀的分配到各个分店(将请求负载到各个服务上),在Spring Cloud中是有一种叫做Ribbon的组件支持我们来做客户端负载均衡。
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面对服务的REST模块请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon几乎存在于每一个Spring Cloud构建的微服务和基础设施中。
参阅链接:Spring Cloud Ribbon简介
在上一篇文章中已经将一个海底捞6666号分店入驻到了商场,为了增加一家店铺,我们需要再将8888号分店也入驻到商场,可以直接参考我们创建6666号分店时候的过程,换个店名,换个端口(我的6666号分店端口是9001,那我8888号分店端口就用9002吧)然后注册到注册中心。
目前,我们的项目目录已经是这样的:
eureka-register port:8000 (Eureka注册中心)(商场)
eureka-provider1 port:9001 (服务提供者1)(海底捞6666号分店)
eureka-provider2 port:9002 (服务提供者2)(海底捞8888号分店)
分别按此顺序运行:eureka-register ==> eureka-provider1 ==> eureka-provider2
运行完毕后,打开Eureka注册中心后台页面,可以观察到我们注册的服务是这样的:
org.springframework.boot
spring-boot-starter-parent
1.3.5.RELEASE
com.jqcode
ribbon
0.0.1
ribbon
Spring cloud Ribbon
1.8
org.springframework.boot
spring-boot-starter
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
org.springframework.cloud
spring-cloud-dependencies
Brixton.RELEASE
pom
import
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonApplication {
@Bean
@LoadBalanced // 开启客户端负载均衡的能力
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
@RestController
public class RibbonController {
private static final String SERVER_URL = "http://FOOD-SERVICE/eat?customerName=小白";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/ribbonConusme", method = RequestMethod.GET)
public String ribbonConusme() {
return restTemplate.getForEntity(SERVER_URL, String.class).getBody();
}
}
#Ribbon服务启动端口
server.port=9101
#Ribbon服务名称
spring.application.name=ribbon
#Eureka注册中心服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka
可以看到网页输出内容为:
再次访问此网址,输出内容为:
可以多次访问,发现其实现的负载均衡方式为轮询。也可以观察下eureka-provider1和eureka-provider2服务日志,发现分别被请求了一次,即完成了负载均衡。
可能有人会比较好奇,在我们的pom文件里也没有引入相关ribbon组件的依赖,为什么可以实现客户端的负载均衡呢?其实在我们引入的
Spring-Cloud-Starter-Eureka里已经内部包含了ribbon的相关组件的。大家可以通过idea的依赖关系看到ribbon是存在的。