SpringCloud从零开始(四)之Ribbon负载均衡

前言

在上一篇博客我们谈到,服务的提供者把自己交给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中负载均衡算法如下:
在这里插入图片描述
当我们需要其它负载均衡算法的时候,只要把这个组件注入进去就可以啦。

发布了98 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/97609956
今日推荐