SpringCloud微服务学习笔记(二)负载均衡、断路器

        国庆假期结束了,短暂歇息,又该学习了上篇文章,我记录了我springcloud学习的第一天起步阶段,本篇文章我来继续记录我的学习笔记,负载均衡和断路器。

1.负载均衡Ribbon

        这里记录一下什么是负载均衡吧。想到了就记下来,不然下次又忘了,对于我们开发人员来说,我们所说的负载均衡,一般都是软件的负载均衡。主要是通过一些负载均衡的软件达到降低我们系统的并发访问的压力的目的。常见的负载均衡服务器,我们最熟知的就是Nginx了。在SpringCloud中,它通过Ribbon来实现负载均衡的功能。

Ribbon客户端

        Ribbon内部有自己的负载均衡算法,如轮询,随机。在服务注册之后,Ribbon会将请求按照负载均衡策略均匀的分发给服务的提供者。下面就记录一下如何使用Ribbon。

1.1新建springcloud-02项目

        新建一个springcloud-02项目,在springcaloud-02项目中新增负载均衡配置,用于访问我们之前的写好的springcloud-01项目。springcloud-01项目是我在上篇博客创建的,这里放一个链接吧
        SpringCloud微服务学习笔记(一)服务注册与调用

1.2导入Ribbon依赖

        首先,我们想要使用Ribbon,肯定要导入Ribbon依赖,学习SpringCloud之后发现,真的很方便,SpringCloud全家桶,完全不需要配置任何东西,想要使用什么东西直接导入依赖,然后进行简单的配置即可,不需要我们进行复杂的安装和配置。
        下面这个是ribbon单独的依赖,但是在eureka-client这个依赖中也引入了这个单独的依赖,所以,我们不引入这个依赖,只引入eureka-client依赖的时候,ribbon也是可以使用的。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
1.3添加@LoadBalanced注解

        再添加完依赖之后,我们需要在SpringBoot启动类中的创建RestTemplate实例的方法上添加@LoadBanlanced注解。这个创建实例的不是必须在启动类中写,所以方法在哪里写,注解就在哪里写,我是直接将创建Bean实例的方法写在启动类中了。

	@LoadBalanced //负载均衡注解
	@Bean
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
1.4修改请求接口的方式

        之前我们请求服务接口的方式是使用RestTemplate的getForObject方法,这个方法中,我们传入url时,url路径上写的是端口,我们在使用负载均衡之后,就不能再使用端口来访问的,因为如果指定端口,那每次访问的就是同一个服务了。这里我们需要写上服务的id,就是在进行yml文件配置时,我们配置的项目名称。如下图:
SpringCloud微服务学习笔记(二)负载均衡、断路器_第1张图片

1.5启动测试
1.5.1打包springcloud-01项目发布在不同端口

        我们首先将项目打包部署至不同的端口,打包时打成jar包。项目打包两次,第一次打包设置yum文件的服务端口为8001,第二次打包设置端口为8002。因为我们要测试负载均衡,所以需要项目发布在不同的端口。
如下图:
SpringCloud微服务学习笔记(二)负载均衡、断路器_第2张图片
SpringCloud微服务学习笔记(二)负载均衡、断路器_第3张图片

1.5.2查看项目是否成功注册到注册中心

        打包之后我们将jar包放在任意目录即可。然后进入jar报所在目录打开命令行界面,通过命令:java -jar jar包名称.jar运行,项目即可发布成功。
我们访问erreka服务器,看看我们的服务是否注册成功。如下图,我的springcloud-01的服务分别在8001和8002端口运行,并且都已经注册到eureka服务器。
在这里插入图片描述

1.5.3通过springcloud-02访问springcloud-01测试负载均衡配置是否成功。

        我们启动springcloud-02项目访问springcloud-02的testRibbon方法,这个方法会去调用springcloud-01发布的服务。服务会返回调用的端口。如下图:
SpringCloud微服务学习笔记(二)负载均衡、断路器_第4张图片在这里插入图片描述
        如果出现每次访问的端口不一定一样的情况,说明我们的负载均衡配置时正确的。Ribbon默认采用的轮询的策略分发请求,所以每次的访问应该的都是不一样的端口。我们也可以通过配置修改负载均衡策略。

1.6Ribbon重试机制

        Ribbon除了负载均衡的功能外,他还有一个重试机制,就是在请求服务时,同一个服务可能在不同端口都存在服务实例,Ribbon在分发请求时,如果请求超时,就会再次请求该服务,如果经过若干次后,还是不成功,就会切换到另外一个服务实例,这个若干次和超时时间是需要我们自己来配置的。具体配置如下:
        在yml文件中添加如下配置即可。

ribbon:
  MaxAutoRetriesNextServer: 2 #更换实例的次数
  MaxAutoRetries: 1 #当前实例重试次数,尝试失败会更换下一个实例
  OkToRetryOnAllOperations: true #对连接超时、读取超时都进行重试

        然后我们还要修改RestTemplate创建实例的方法。如下:
        之前的实例创建代码已经被我注释,可以对比着看。

// 创建 RestTemplate 实例,并存入 spring 容器
	@Bean
	@LoadBalanced//负载均衡注解
	public RestTemplate getRestTemplate() {
		// RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
		// 未启用超时,也不会触发重试
		// return new RestTemplate();
		SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
		f.setConnectTimeout(1000);//设置连接超时时间
		f.setReadTimeout(1000);//设置读取超时时间
		return new RestTemplate(f);
	}
	

2.断路器Hystrix

        所谓断路器就是在服务器压力过大,或者请求失败比例过高是,断路器会切断请求的分发,对服务进行降级。就跟我们家里边电路连接的保险丝一样,当电压过高是,保险丝就会熔断,然后就停电了。
        在SpringCloud中,断路器的作用就是类似于这个保险丝。它主要包含两个功能:
        降级,超时、出错、不可到达时,对服务降级,返回错误信息或者是缓存数据
        熔断,当服务压力过大,错误比例过多时,熔断所有请求,所有请求直接降级。
        接下来就说一说这玩意如何使用了。

2.1在springcloud-02项目中添加Hystrix依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.1添加@EnableCircuitBreaker 注解

        没错,又是添加注解,一时间感觉springcloud真的是太强大了。在主启动类上添加@EnableCircuitBreaker注解,这个注解是添加在启动类上的。如下图:忽略其他注解
SpringCloud微服务学习笔记(二)负载均衡、断路器_第5张图片

2.1在Controller中添加降级方法

        最后一步就是在Controller中添加降级方法,这里我们还要使用一个注解@@HystrixCommand,它有一个fallbackMethod属性,是用来指定降级方法的方法名。Ribbon请求超时或者出错是就会执行这个降级方法。如下图:
SpringCloud微服务学习笔记(二)负载均衡、断路器_第6张图片
        这里指定了将其方法。如果请求失败会返回 “大哥已死,又是烧纸”。

2.2启动测试

        我们这里启动测试,模拟请求失败,那么我们就不启动springcloud-01项目,请求不到服务,自然就请求失败了。如下图,请求失败,执行了降级方法。
在这里插入图片描述
        今天就总结到这里吧。

你可能感兴趣的:(框架)