01使用客户端负载均衡——Ribbon

在微服务架构出现之前,负载均衡的方案主要是集中式负载均衡,在服务消费者和服务提供者之间有一个独立的负载均衡系统,如F5、HAproxy、Nginx反向代理。

负载均衡器上有所有服务的地址映射表,当服务消费者调用某个目标服务时,先向负载均衡系统发起请求,由负载均衡系统以某种策略(如Round-Robin)做负载均衡后再将请求转发给目标服务。

集中式负载均衡的缺点:

单点失败:一旦负载均衡宕机,整个应用将无法访问。(如果可以做集群提高其高可用性)难扩展:人工介入复杂:传统集中式负载均衡就是一个代理分发角色,将用户的请求映射到具体的物理服务器上,甚至有些需要做一些处理或者过滤。

1、什么是客户端负载均衡

集中式负载均衡方案与传统的单体架构负载均衡实现原理相同。

进程内负载均衡方案该方案将负载均衡处理功能以库的方式整合到服务消费者应用中,也称为客户端负载均衡方案。

需要配合服务发现功能,在服务消费者启动时需要从服务发现服务器中获取所有服务注册信息,并定时同步这些信息。当服务消费者需要访问某个服务时,内置的负载均衡器就会以某种负载均衡策略选择一个目标服务实例,然后在本地所缓存的服务注册表信息中查询该目标服务的具体地址,然后向目标服务发起请求。

主机独立负载均衡方案与进程内负载均衡方案类似,不同之处在于将负载均衡和服务发现功能从服务消费者的进程内移出来,变成同一个主机上的独立进程,为该主机上的一个或多个服务消费者提供负载均衡处理。

2、启用Ribbon

我们对上一章的项目进行改造。

对于现在的spring-cloud-starter-netflix-eureka-client依赖包,里面已经依赖了spring-cloud-starter-netflix-ribbon,所以不需要再增加ribbon依赖。

并且项目中在创建RestTempate Bean时,必须加入@LoadBalanced注解。

Ribbon为Rest客户端的实现增加了客户端负载均衡公共能,其实现原理如下:

Ribbon首先根据其所在Zone优先选择一个负载较少的Eureka服务器。定期从Eureka服务器更新,并过滤服务实例列表根据指定的负载均衡策略,从可用的服务实例列表中选择一个。然后使用该地址,通过RestTemplate进行服务调用。默认情况下,客户端负载均衡采用了轮询策略(RoundRobinRule)。

3、负载均衡测试

依次启动Eureka服务、两个用户微服务实例和商品微服务。两个微服务实例端口分别为8000和8001。

接下来,我们进入测试

02使用Feign简化微服务调用

Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口并插入注解,就可以完成HTTP请求的参数、格式、地址等信息的声明。Feign整合了Ribbon和Hystrix。

Fegin特性:

可插拔的注解支持,包括Fegin注解和JAX-RS注解。支持插拔的HTTP编码器和解码器。支持Hystrix和它的回退功能支持Ribbon的负载均衡支持HTTP请求和相应的压缩处理。我们继续对之前的项目进行改造。

同理我们在product项目pom文件中加入对feign的依赖包

对引导类增加@EnableFeignClients注解,用来开启Feigin相关功能。

增加UserService文件,应用启动时Feign就会使用动态代码机制根据我们所定义的用户服务接口生成相应的类实例,并注入到Spring的应用上下文中。在使用方式上,和普通Bean一样。

最后controller代码修改,将RestTemplate访问直接改成userService就可以。