springCloud-Eureka-Ribbon

1.初识SpringCloud


这里的简介可看可不看

微服务是一种架构方式,最终肯定需要技术架构去实施。

微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

  • 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
  • 技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了
  • 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
  • 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建

1.1.简介

SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/

Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:

  • 配置管理,

  • 服务发现,

  • 智能路由,

  • 负载均衡,

  • 熔断器,

  • 控制总线,

  • 集群状态等等功能。

    其主要涉及的组件包括:

  • Eureka:注册中心

  • Zuul:服务网关

  • Ribbon:负载均衡

  • Feign:服务调用

  • Hystrix:熔断器

以上只是其中一部分,架构图:

在这里插入图片描述


下面来搭建Eureka集群+负载均衡

在这里插入图片描述
在这里插入图片描述

方法一

在这里插入图片描述

**在这里插入图片描述**

方法二

在这里插入图片描述
在这里插入图片描述
方法一和二自己选择一个,个人倾向于一,比较简便

这样集群就搭建好了

在这里插入图片描述

以上的集群自己以此类推,自己想搭几个就写几个


开启负载均衡

SpringCloud中已经帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。

什么是Ribbon:

在这里插入图片描述
在这里插入图片描述

接下来,我们就来使用Ribbon实现负载均衡。

2.1 步骤:

  • 导入jar包:eureka注册中心自带ribbon负载均衡器,无需重复导入

  • 配置yml文件:无需额外配置

  • 开启ribbon负载均衡器:在restTemplate创建方法上添加

    @Bean
      @LoadBalanced  // 开启负载均衡
      public RestTemplate restTemplate() {
          return new RestTemplate();
      }
    
  • 修改代码:
    在这里插入图片描述
    在这里插入图片描述
    —以上负载均衡就实现好了----

但是如何实现的负载均衡呢

接下来跟踪源码
在这里插入图片描述
在这里插入图片描述
继续跟入execute方法:发现获取了8082端口的服务
在这里插入图片描述
再跟下一次,发现获取的是8081:
在这里插入图片描述

负载均衡策略

Ribbon默认的负载均衡策略是简单的轮询,我们可以测试一下:
编写测试类,在刚才的源码中我们看到拦截中是使用RibbonLoadBalanceClient来进行负载均衡的,其中有一个choose方法,是这样介绍的:
在这里插入图片描述
现在这个就是负载均衡获取实例的方法。

我们对注入这个类的对象,然后对其测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserConsumerDemoApplication.class)
public class LoadBalanceTest {

    @Autowired
    RibbonLoadBalancerClient client;

    @Test
    public void test(){
        for (int i = 0; i < 100; i++) {
            ServiceInstance instance = this.client.choose("user-service");
            System.out.println(instance.getHost() + ":" + instance.getPort());
        }
    }
}

结果:
在这里插入图片描述
符合了我们的预期推测,确实是轮询方式。

我们是否可以修改负载均衡的策略呢?

继续跟踪源码,发现这么一段代码:
在这里插入图片描述
我们看看这个rule是谁:
在这里插入图片描述
这里的rule默认值是一个RoundRobinRule,看类的介绍:
在这里插入图片描述
这不就是轮询的意思嘛。

我们注意到,这个类其实是实现了接口IRule的,查看一下:
在这里插入图片描述
定义负载均衡的规则接口。

它有以下实现:
在这里插入图片描述
SpringBoot也帮我们提供了修改负载均衡规则的配置入口:
在这里插入图片描述

user-service:  
   ribbon:    
     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:{服务名称}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的实现类。
再次测试,发现结果变成了随机:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fhkkkbfgggjk/article/details/84839308