前言
在上一篇博客我们谈到,服务的提供者把自己交给Eureka管理,而服务的消费者,当需要服务的时候,就可以到Eureka中寻找上面有的服务。一个服务可以给多个消费者消费。当然一个消费者,有可以消费多个服务。在互联网高流量,高并发的背景下,常常一个相同的微服务部署多份,供消费者使用。这种多个相同的应用组建起来的集群,必然也就是涉及到一个问题负载均衡。
负载均衡(Load Blanced):在微服务或分布式集群中常用的一种应用,负载均衡简单来说就是:将请求按一定规则平摊到多个服务器上面,从而达到系统的HA(高可用)
一、什么是Ribbon
Ribbon
是基于Netfilx Ribbon下实现的一套 客户端 负载均衡 工具。它可以很好地控制HTTP和TCP客户端的行为。(Ribbon会自动帮你基于某种规则:简单轮询,随机连接。去连接这些机器,我们也容易使用Ribbon实现自定义的负载均衡算法。)
二、工程搭建
代建目标:
microservice_product_provider8002
microservice_product_provider8003
再创建两个服务的提供者,创建过程与microservice_product_provider8001
相同,内容也相同。都作为服务的提供者,提供相同的服务。
需要注意更改的地方
1、端口号
2、eureka.instance.instance-id
3、服务访问的数据库
创建另外两个服务之后,应该注意的地方
1、端口号三个服务的端口 分别是 8001
,8002
,8003
。
2、eureka.instance.instance-id属性,每个id取对应服务提供者的名字如:microservice-provider-dept-8002
,microservice-provider-dept-8003
3、数据库访问的url因为这个是微服务,为了体现出微服务的架构风格,我们每一个微服务连接的数据库都不同。三个工程的分别连接
jdbc:mysql://localhost:3306/springcloud001
jdbc:mysql://localhost:3306/springcloud002
,jdbc:mysql://localhost:3306/springcloud003
创建完成之后 。启动下面的服务。microservice_eureka_7001
,microservice_product_provider8001
,microservice_product_provider8002
,microservice_product_provider8003
,我们检查一下这个三个相同服务是否能正常注册到Eureka注册中心。
(耐心等待,当4个服务都启动成功之后)进去Eureka的注册中心http://eureka7001:7001/eureka/
三个服务都能够正常注册到,我们的Eureka当中。好啦基础环境我们已经搭建好了。要开始我们的Ribbon负载均衡。
三、配置Ribbon负载均衡
操作:
1、引入依赖(之前已经创建) 2、使用注解 3、消费者工程改造
1、引入Ribbon依赖(之前已经导入)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2、开启负载均衡
在消费者服务microservice_product_consumer80
注入RestTemplate
方法上添加注解@LoadBalanced
@Configuration
public class ConfigBean {
@LoadBalanced //实现负载均衡 (Ribbon客户端 负载均衡工具)
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
哇靠,就是这么简单。这样就算开启负载均衡啦。
3、使用带有负载均衡的RestTemplate访问服务
之前我们使用URL路径进行访问服务,现在我们将调用服务的Eureka-ID来访问目标服务。Eureka-ID是什么呢,这个其实就是这个就是我们的Eureka-ID。也是我们所配置的spring.application,name
(三个服务需要对外暴露统一的名字)
对原来的消费者Controller
进行改造。
@GetMapping("/consumer/product/list")
public List<Product> list(){
//restTemplate.getForObject(REST_URL_PREFIX+"product/list",List.class)使用url访问
return restTemplate.getForObject("http://MICROSERVICE-PROVIDER/product/list",List.class) ;
}
我们看到,与之前访问不同的是,我们直接用服务在注册中心的ID,进行访问。修改完成之后。我们启动消费者服务microservice_product_consumer80
4、进行测试
访问路径http://localhost/consumer/product/list
第一次访问:
[{"pid":1,"dbSource":"springcloud003","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud003","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud003","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud003","pname":"冰箱"},{"pid":5,"dbSource":"springcloud003","pname":"电视"},{"pid":6,"dbSource":"springcloud003","pname":"苹果"}]
第二次访问:
[{"pid":1,"dbSource":"springcloud002","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud002","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud002","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud002","pname":"冰箱"},{"pid":5,"dbSource":"springcloud002","pname":"电视"},{"pid":6,"dbSource":"springcloud002","pname":"苹果"}]
第三次访问:
[{"pid":1,"dbSource":"springcloud001","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud001","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud001","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud001","pname":"冰箱"},{"pid":5,"dbSource":"springcloud001","pname":"电视"},{"pid":6,"dbSource":"springcloud001","pname":"苹果"}]
可以发现,默认是按照轮询算法来进行负载均衡的。
Ribbon自带的7中负载均衡算法如下:
当我们需要其它负载均衡算法的时候,只要把这个组件注入进去就可以啦。