Spring Cloud(二)Ribbon负载均衡器与声明性REST客户端Feign

​Spring Cloud(二)Ribbon负载均衡器与声明性REST客户端Feign

2018年摄于奈良唐招提寺

微信公众号

文中源码已上传至:

 

https://github.com/TenaciousDWang/Eureka/tree/master/ribbon-eureka

 

https://github.com/TenaciousDWang/Eureka/tree/master/feign-eureka

 

负载均衡

 

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。

 

负载均衡构建在架构中,负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一、可以加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

 

常用的免费软件nginx,土豪公司用的硬件F5等,最简单的轮询策略就可以实分流的作用,提高数据吞吐量。

 

微服务架构中我们通常使用基于HTTP协议的Restful风格的接口形式来进行通信,Spring全家桶中为我们提供了RestTemplate工具类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果,是我们可以更优雅的发送HTTP请求。

 

今天我们来看一下在SpringCloud组件中的Eureka与客户侧负载均衡器Ribbon和RestTemplate进行服务调用时如何实现负载均衡,紧接着使用声明性Rest客户端Feign来发送HTTP请求,同样可以在服务调用时实现负载均衡且更简单方便。

 

Ribbon Overview

 

Ribbon是一个客户端负载平衡器,它可以很好地控制HTTP和TCP客户端的行为。

 

https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers

 

Ribbon主要包括如下功能:
1.支持通过DNS和IP和服务端通信。
2.可以根据算法从多个服务中选取一个服务进行访问。
3.通过将客户端和服务器分成多个区域来建立客户端和服务器之间的关系,支持同一区域中的服务器以减少延迟。
4.保留服务器的统计信息,ribbon可以实现用于避免高延迟或频繁访问故障的服务器。

5.保留区域的统计数据,ribbon可以实现避免可能访问失效的区域。

 

Spring Cloud Netflix默认提供以下功能区(BeanType beanName:ClassName)的bean:

 

IClientConfig ribbonClientConfig:DefaultClientConfigImpl定义各种配置信息,用来初始化ribbon客户端和负载均衡器

 

IRule ribbonRule:ZoneAvoidanceRule用于确定从列表返回哪个服务器的逻辑组件,默认RoundRobinRule轮询策略。AvailabilityFilteringRule这个负载均衡器规则,会先过滤掉以下服务:

1、由于多次访问故障而处于断路器跳闸状态。2、并发的连接数量超过阈值。然后对剩余的服务列表按照RoundRobinRule策略进行访问。WeightedResponseTimeRule对于此规则,每个服务器根据其平均响应时间给予权重。响应时间越长,重量就越小。该规则随机选择服务器,其中可能性由服务器的权重决定。

 

IPing ribbonPing:NoOpPing默认永远返回true,即认为服务永远可用。与Eureka一起用替换为NIWSDiscoveryPing 不执行真正的ping。如果Eureka Discovery Client认为是在线,则程序认为本次心跳成功,服务可用。

 

ServerList<Server> ribbonServerList:ConfigurationBasedServerList存储服务列表从配置文件中获取所有服务列表,DiscoveryEnabledNIWSServerList与Erueka一起用时,从eureka-server动态获取服务列表。

 

ServerListFilter该接口允许过滤配置或动态获取的具有所需特性的服务器列表。

 

ILoadBalancer定义软件负载平衡器操作的接口。动态更新一组服务列表及根据指定算法从现有服务器列表中选择一个服务。

ServerListUpdater ribbonServerListUpdater:PollingServerListUpdater默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略用于动态的更新服务列表,与Eureka一起用时EurekaNotificationServerListUpdater 当收到缓存刷新的通知,会更新服务列表。
 


 

其他功能具体使用方式可参照https://github.com/Netflix/ribbon,这里我们只用来与Eureka整合在服务调用时实现负载均衡,接下来我们开始实际操作。

 

首先我们先启动Eureka Server,再启动两个服务提供者组成集群。

 

 

创建一个服务消费者,引入eureka-client与ribbon依赖。

 

 

 

修改application.properties,添加如下配置:

 

# 端口号
server.port=54321
# 服务名
spring.application.name=ribbon-eureka-consumer
#client隔多久去拉取服务注册信息,默认为30秒
eureka.client.registry-fetch-interval-seconds=10
# 指定服务注册中心的位置eureka服务器的地址(注意:地址最后面的 /eureka/ 这个是固定值)
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

 

接下来改造RibbonEurekaApplication启动类,同样还是添加@RestController@EnableEurekaClient,表示这是一个eureka客户端,定义haha接口,注意调用的URL,"http://eureka-client-provider/hello?name="+name

 

给Bean restTemplate添加@LoadBalanced以开启负载均衡。

 

eureka-client-provider对应我们前面启动的两个服务提供类的spring.application.name服务名,这两个服务提供者组成集群,统一用eureka里面Application名称调用。

 

 

启动服务消费者,这时可以在Eureka主页看到该服务被发现。

 

 

 

访问http://127.0.0.1:54321/haha?name=JavaBoy

 

第一次访问:

 

第二次访问:

 

反复访问我们可以看到是在轮询EUREKA-CLIENT-PROVIDER集群下的两个服务地址。

 

Ribbon的部分常用配置项,可以直接添加到application.properties中:

 

# 设置连接超时时间
ribbon.ConnectTimeout=600
# 设置读取超时时间
ribbon.ReadTimeout=6000
# 对所有操作请求都进行重试
ribbon.OkToRetryOnAllOperations=true
# 切换实例的重试次数
ribbon.MaxAutoRetriesNextServer=2
# 对当前实例的重试次数
ribbon.MaxAutoRetries=1

 

接下来我们来看第二种基于HTTP调用服务的方式,使用Feign。

 

https://github.com/OpenFeign/feign

 

Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插拔注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,并在Spring Web中使用默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

 

Feign使用起来更加贴近我们平时的习惯,例如我们在编写持久层代码时,使用Dao接口只需要添加注解,然后在service层@Autowired自动注入调用即可,接下来我们来看一下Feign的实际操作。

 

首先启动之前我们创建的两个服务提供者,并注册到eureka-server。

 

创建一个服务消费者,引入eureka-client与Feign依赖。

 

 

 

修改application.properties添加以下内容:

 

# 端口号
server.port=111222
# 服务名
spring.application.name=feign-eureka-consumer
#client隔多久去拉取服务注册信息,默认为30秒
eureka.client.registry-fetch-interval-seconds=10
# 指定服务注册中心的位置eureka服务器的地址(注意:地址最后面的 /eureka/ 这个是固定值)
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

 

配置Feign

 

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html

 

三种方式,第一种直接在application.yml里直接添加配置,指定feignName,优先级最高。

 

feign:  

  client:  

    config:  

      feignName:  

        connectTimeout: 5000  

        readTimeout: 5000  

        loggerLevel: full  

        errorDecoder: com.example.SimpleErrorDecoder  

        retryer: com.example.SimpleRetryer  

        requestInterceptors:  

          - com.example.FooRequestInterceptor  

          - com.example.BarRequestInterceptor  

        decode404: false  

        encoder: com.example.SimpleEncoder  

        decoder: com.example.SimpleDecoder  

        contract: com.example.SimpleContract 

 

第二种,全局修改默认参数,优先级次之

 

feign:
  client:
    config:
      default:
        connectTimeout: 5000 #连接超时
        readTimeout: 5000 #读取超时
        loggerLevel: basic #日志等级

 

第三种,创建DefaultFeignConfiguration类,并在启动类声明开启Feign服务时添加指定参数@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)。

 

 

 

创建一个服务提供者的接口,就像Dao一样,这里用@FeignClient声明。

 

 

然后我们启动类中自动注入这个接口,并像以前一样创建一个haha接口,只不过这次直接调用eurekaClientProvider接口的hello方法。

 

 

最后我们启动feign-eureka-consumer,此时我们可以在eureka-server中看到该服务。

 

 

此时我们直接访问http://127.0.0.1:11122/haha?name=JavaBoy

 

第一次返回:

 

第二次返回:

 

 

此时我们也可以发现,调用EUREKA-CLIENT-PROVIDER服务时,使用了轮询策略。Feign客户端到此搭建完毕。

 

Spring Cloud Feign支持对请求和响应进行GZIP压缩,以提高通信效率。

 

feign:

  compression:
    request: #请求
      enabled: true #开启
      mime-types: text/xml,application/xml,application/json #开启支持压缩的MIME TYPE
      min-request-size: 2048 #配置压缩数据大小的下限
    response: #响应
      enabled: true #开启响应GZIP压缩

 

由于开启GZIP压缩之后,Feign之间的调用数据通过二进制协议进行传输,返回值需要修改为ResponseEntity<byte[]>才可以正常显示,否则会导致服务之间的调用乱码。
 

例子:
 

 

 

-End-

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个用于构建分布式系统的开发工具集合,它提供了许多有用的组件,包括Zuul、Ribbon、Hystrix和@FeignClient。 Zuul是Spring Cloud中的网关服务,它可以将各个微服务的请求路由到相应的微服务上。Zuul具有负载均衡和过滤等功能,可以对请求进行拦截和处理。 Ribbon是一个负载均衡,它可以根据负载情况将请求分发给不同的微服务实例。Ribbon可以与Eureka等注册中心配合使用,动态地获取可用的服务实例列表,并根据一定的负载均衡策略选择合适的实例。 Hystrix是一个容错和延迟容忍的库,可以帮助我们构建稳定的分布式系统。它可以防止由于某一微服务的故障或延迟而导致整个系统的崩溃。通过为每个外部服务的调用添加断路,Hystrix可以在外部服务不可用时提供备选方案,并且可以对外部服务的调用进行监控和度量。 @FeignClient是一个用于声明REST客户端的注解。通过在接口中添加@FeignClient注解,并指定要访问的微服务名称,我们可以方便地进行REST调用。Feign会根据接口定义自动生成实现类,并将请求发送到相应的微服务。 综上所述,Spring Cloud中的Zuul、Ribbon、Hystrix和@FeignClient是用于构建分布式系统的重要组件。它们可以帮助我们解决微服务架构中的路由、负载均衡、容错和服务间调用等问题。利用这些组件,我们可以更方便地构建可靠、高效的分布式系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值