Spring Cloud基础教程[Eureka集群,Ribbon负载均衡]
Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架, 它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个 SpringCloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon 实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
在这一章中,我们将具体介绍如何使用Ribbon来实现客户端的负钱均衡,并且通过源码分析来了解Ribbon实现客户端负载均衡的基本原理.
客户端负载均衡
负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容因为负载均衡是对系统的高可用、M络压力的缓解和处理能力扩容的重要手段之一。我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,比如F5等:而软件负载均衡则是通过在服务器上安装一些具有均衡负载功能或模块的软件来完成请求分发工作,比如Nginx等。不论采用硬件负载均衡还是软件负载均衡,只要是服务端负载均衡都能以类似下图的架构力+忒构建起来:
硬件负载均衡的设备或是软件负载均衡的软件模块都会维护一个下挂可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点,当客户端发送请求到负载均衡设备的时候,该设备按某种算法(比如线性轮询、按权审负我、按流最负载等)从维护的可用服务端清单中取出一台服务端的地址,然后进行转发。而客户端负载均衡和眼务端负或均衡M大的不同点在于上面所提到的服务清单所存储的位置。在客尸端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这服务端的清单来自于服务注册中心,比如上一章我们介绍的Eureka服务端.同服务端负载均 衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这〜步骒需要与服务注册中心配合完成。在Spring Cloudd实现服务治理框架中,默认会创建针对各 个服务'冶理框架的Ribbon自动化整合配置,比如Eureka中 的org.springframework. cloud.netflix. ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAuto-Configuration。在实际使用的时候,我们可以通过查看这两个类的实现,以找到它们 的配置详情来帮助我们更好地使用它。通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负找均衡调用非常 简单,只需要如下两步:
• 服务提供者R潘要启动多个服务实例并注册到一个注册中心或是多a相关联的服务注册中心。
• 服务消费者直接通过调用注解修饰过的 RcstTemplate来实现面 向服务的接口调用。
这样,我们就可以将服务提供者的高可用以及服务消费者的负载均衡调用一起实现.
动手试一试
下面我们通过具体的例子来看看如何使用Spring Cloud Ribbon来实现服务的调用以及客户端均衡负载。
下面的例子,我们将利用之前构建的eureka-server
作为服务注册中心(3个节点)、springcloud-provider作为服务提供者作为基础。而基于Spring Cloud Ribbon实现的消费者,我们可以根据springcloud-consumer
实现的内容进行简单改在就能完成,具体步骤如下:
根据上一篇文章的基础上进行直接负载均衡:https://blog.csdn.net/weixin_40470497/article/details/83588369 ,上一篇文章只是创建了一个提供者端口为:8080,在创建相同的服务提供者springcloud-provider2,在application.yml配置文件中修改一下端口:8081
项目已上传github:[email protected]:13849141963/spring-cloud.git
直接搭建客户端进行负载均衡,客户端为:springcloud-consumer,pom.xml文件内容如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka服务注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!--ribbon基于客户端的负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-
添加配置类:在
RestTemplate
增加@LoadBalanced
注解:
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced//基于客户端的负载均衡器
public RestTemplate restTemplate() {
return new RestTemplate();
}
//将jackson转化成fastjson
@Bean
public HttpMessageConverters fastJsonConfigure(){
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//日期格式化
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
converter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(converter);
}
}
- 修改Controller。去掉原来通过
LoadBalancerClient
选取实例和拼接URL的步骤,直接通过RestTemplate发起请求。
@RestController
public class UserController {
//服务的应用名称
private final String url = "http://springcloud-provider";
//使用restTemplate对rest接口进行调用 封装的对象
//RestTemplate对象提供了多种便捷访问远程http服务的方法 是一种简单便捷的restful服务模板类,是spring提供的用于访问rest服务的客户端模板类
@Autowired
private RestTemplate restTemplate;
//调用服务端的查询所有的服务
@RequestMapping(value = "/queryAll")
public Object queryAll(){
System.out.println("==========进入访问方法============");
List forObject = restTemplate.getForObject(url+"/queryAll", List.class);
return forObject;
}
}
通过地址栏交替访问服务的消费者:10.0.45.103:8989,就可以在分别两个服务的提供者控制上看到打印的信息,说明Eureka Ribbon基于客户端的负载均衡完成.