在本博客之前的Spring Cloud系列里,我们讲述了Feign的基本用法,这里我们将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的方式。

1 准备Eureka服务器以及多个服务提供者

这里,我们将重用之前博文里讲过的案例,提供的两个(即主从)Eureka服务项目以及三个服务提供者的项目。随后在此基础上,在服务调用者的项目中,通过Feign以负载均衡的方式调用三个服务提供者所提供的sayHello方法。

2 在客户端引入Ribbon

在FeignDemo-ServiceCaller项目里开发Fegin整合Ribbon,具体的步骤如下。

在pom.xml中,引入Ribbon依赖包,关键代码如下。

1       <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-ribbon</artifactId>
4 </dependency>

在ControllerForFeignRibbon.java中,编写Feign以Ribbon负载均衡的方式调用服务的代码。

 //省略必要的package和import的代码
//这和Ribbon Provider中的applicationname一致
@FeignClient(value = "sayHelloAvoidCopy")
interface FeignClientRibbonTool{
@RequestMapping(method = RequestMethod.GET, value = "/sayHello/{username}/avoidCopy")
String sayHelloAsRibbon(@PathVariable("username") String username);
} @RestController
public class ControllerForFeignRibbon {
private FeignClientRibbonTool tool;
@RequestMapping(value = "/callHelloAsRibbon/{username}", method = RequestMethod.GET)
public String callHelloAsRibbon(@PathVariable("username") String username) {
return tool.sayHelloAsRibbon(username);
}
}

在上述代码里,,我们定义了一个名为FeignClientRibbonTool的接口;在第3行中,我们通过@FeignClient注解指定了该Feign接口将会调用名为sayHello的服务。请注意,这里的sayHello命名需要和EurekaRibbonDemo-ServiceProviderOne等项目中application.yml中的相应配置一致。

在第10行中,我们通过@RestController注解定义了一个名为ControllerForFeignRibbon的控制器类,在其中的第14行的callHelloAsRibbon中,我们是通过Feign接口中的sayHelloAsRibbon方法调用服务的。

在application.yml中,编写Ribbon的相关配置信息,关键代码如下。

1   sayHello:
2 ribbon:
3 listOfServer: http://localhost:1111/,http://localhost:2222/,http://localhost:3333
4 ConnectionsTimeout: 1000
5 ribbon:
6 ConnectionsTimeout: 2000

在第1~4行,我们通过配置指定了基于ribbon的多台服务器,它们将以负载均衡的方式承担请求url,而且还指定了连接超时的时间。从第1行我们能看到,这个配置是针对sayHello这个服务实例的。而在第5行和第6行,我们配置了全局性的ribbon属性,这里也配置了连接超时时间。

完成开发后,启动定义在表6.2中的两台Eureka服务器、三台服务提供者和一台服务调用者程序后,在浏览器中多次输入http://localhost:8080/callHelloAsRibbon/Peter以调用服务,这时我们能看到有如下输出。从输出结果来看,我们以Feign的形式调用的请求确实被均衡地转发到3台服务提供者的机器上。

1   Hello Ribbon, there are Server1, my name is:Peter

2   Hello Ribbon, there are Server2, my name is:Peter

3   Hello Ribbon, there are Server3, my name is:Peter

这里我们来总结一下Feign整合Ribbon的要点。

第一,多个服务器提供者的实例名应当一致,比如这里都是sayHello。

第二,在Feign的接口中,是通过@FeignClient的注解调用服务提供者的方法的。

第三,这里我们是在application.yml配置文件中指定Ribbon的各种参数,也可以通过@Configuration注解在Java文件中配置Ribbon的参数。

3 在客户端引入Hystrix(Feigh整合Hystrix)

在通过Feign调用服务时,同样不能保证服务一定可用,为了提升客户体验,这里可以通过引入Hystrix对访问请求进行“容错保护”。

在FeignDemo-ServiceCaller的pom.xml中,增加Hystrix的依赖包,关键代码如下。

1       <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-hystrix</artifactId>
4 </dependency>

还是在FeignDemo-ServiceCaller项目的application.yml配置文件中,通过如下配置项启动Hystrix模式,关键代码如下。

1   feign:
2 hystrix:
3 enabled: true

此外,还可以通过如下代码配置针对sayHelloServiceProvider服务的hystrix参数。其中,第3行指定了hystrix所作用的服务名,第7行指定了请求时间一旦超过1000毫秒(也就是1秒),就会启动熔断模式,调用定义在回退方法中的业务动作。

1   hystrix:
2 command:
3 sayHelloServiceProvider:
4 execution:
5 isolations:
6 threads:
7 timeoutInMilliseconds: 1000

在启动类ServiceCallerApp.java中,增加启动hystrix断路器的注解,如第5行所示,这个类的关键代码如下。

1   //省略必要的package和import方法
2 EnableFeignClients
3 @EnableDiscoveryClient
4 @SpringBootApplication
5 @EnableCircuitBreakers
6 public class ServiceCallerApp
7 {
8 //省略其他代码
9 }

新建一个名为ControllerForFeignHystrix.java的控制器类,代码如下。

1   //省略必要的package和import代码
2 @FeignClient(value = "sayHelloServiceProvider",fallback=FeignClientHystrixToolFallback.class)
3 interface FeignClientHystrixTool{
4 @RequestMapping(method = RequestMethod.GET, value = "/hello/{name}")
5 String sayHelloInClient(@RequestParam("name") String name);
6 }

在第3行中,我们定义了一个名为FeignClientHystrixTool的接口;在第2行的注解中,我们定义了它将以Feign的形式调用sayHelloServiceProvider中的服务,并且通过fallback配置指定一旦出现调用异常,将调用FeignClientHystrixToolFallback类中的回退方法。

7   @Component
8 class FeignClientHystrixToolFallback implements FeignClientHystrixTool{
9 public String sayHelloInClient(String name)
10 { return "In Fallback Function."; }
11 }

在第8行的FeignClientHystrixToolFallback类中,我们将定义针对FeignClientHystrixTool接口的回退方法。

注意该类必须和第2行中fallback指定的类同名,而且,该类需要实现(implements)FeignClientHystrixTool接口,在其中的sayHelloInClient方法中定义了回退动作,这里的动作是打印一段话。

12  @RestController
13 public class ControllerForFeignHystrix {
14 @Autowired
15 private FeignClientHystrixTool tool;
16 @RequestMapping(value = "/callHelloAsHystrix/{username}", method = RequestMethod.GET)
17 public String callHelloAsHystrix(@PathVariable("username") String username)
18 { return tool.sayHelloInClient(username);}
19 }

在第13行中,我们定义了一个包含@RestController注解的控制器类ControllerForFeignHystrix,在其中第17行的callHelloAsHystrix方法中,我们是以Feign的形式调用sayHelloInClient方法的。

至此,完成代码的编写工作。我们依次启动FeignDemo-Server、FeignDemo-ServiceProvider和FeignDemo-ServiceCaller项目,随后在浏览器中输入http://localhost:8080/callHelloAsHystrix/Peter,此时能看到“hello Peter”的输出,这个是正常的调用流程。

如果我们关闭FeignDemo-ServiceProvider项目,也就是说sayHelloServiceProvider服务不可用了,如果再次在浏览器中输入http://localhost:8080/callHelloAsHystrix/Peter,此时就会走熔断保护的流程,触发FeignClientHystrixToolFallback 类中的sayHelloInClient方法,在浏览器中输出“In Fallback Function“的字样。

本文谢绝转载,如果要代码,请和作者联系。Spring Cloud相关博文如下:

Spring Cloud系列文,Feign整合Ribbon和Hysrix的更多相关文章

  1. Spring Cloud系列之Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  2. spring cloud 系列第3篇 —— ribbon 客户端负载均衡 (F版本)

    源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.ribbon 简介 ribbon是Netfix公司开源的负载均衡组件,采用服 ...

  3. Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  4. Spring Cloud系列(二) 介绍

    Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...

  5. Spring Cloud 系列之 Gateway 服务网关(四)

    本篇文章为系列文章,未读第一集的同学请猛戳这里: Spring Cloud 系列之 Gateway 服务网关(一) Spring Cloud 系列之 Gateway 服务网关(二) Spring Cl ...

  6. Spring Cloud 系列之 Dubbo RPC 通信

    Dubbo 介绍 官网:http://dubbo.apache.org/zh-cn/ Github:https://github.com/apache/dubbo 2018 年 2 月 15 日,阿里 ...

  7. Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端

    Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...

  8. Spring Cloud 入门 之 Feign 篇(三)

    原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...

  9. Feign整合Ribbon和Hystrix源码解析

    在上篇文章Feign自动装配中,我们提到了Feign的自动装配的原理,以及Feign整合Ribbon和Hystrix的核心在类FeignClientFactoryBean中,那么本篇文章就来揭开这个类 ...

随机推荐

  1. 使用slot-scope复制vue中slot内容

    有时候我们的vue组件需要复制使用者传递的内容. 比如我们工程里面的轮播组件需要使用复制的slot来达到循环滚动的效果 使用者关注轮播内容的静态效果,组件负责让其滚动起来 组件: <div cl ...

  2. 小程序电脑调试没有问题,真机预览报错fail hand shake error

    今天在做小程序的过程中使用HTTPS请求数据时,遇到安卓机型无法获取到数据,通过一系列的排查,发现是因为ssl证书的问题,后来通过https://www.myssl.cn/tools/check-se ...

  3. Python基础学习总结__Day3

    一.集合 1.特性:无序且天生去重,格式为{} 2.作用: (1)去重 (2)关系测试 3.可调用函数(常见对列表操作) (1)取交集:A.intersection(B) (2)取并集:A.union ...

  4. Tomcat上传文件报错:returned a response status of 403 Forbidden

    出现这样的错误是没有权限对服务器进行写操作.需要在这个项目所在的tomcat中配置可写操作即可: 在tomcat的web.xml添加下面代码: <init-param><param- ...

  5. 实验4 —— [bx]和loop的使用

    实验 综合使用 loop.[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H. 以下为示例程序: assume cs:code # 1 c ...

  6. 用python编写简易登录接口

    需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 可以支持多个用户登录 用户3次认证失败后,退出程序,再次启动程序尝试登陆时,还是锁定状态 下面是我写的代码,如果有BUG或者不 ...

  7. LeetCode(260) Single Number III

    题目 Given an array of numbers nums, in which exactly two elements appear only once and all the other ...

  8. ASP.NET Web网站中App_Code文件夹的作用及使用场景

    原文地址:Web Site项目和ASP.NET Web Application中App_Code文件夹的作用作者:宾的宾 我现在要建一个ASP.NET的网站了,不难吧,开始动手.如下图: 这种方法建立 ...

  9. ubuntu 设置Path 开机启动脚本

    vim /etc/rc.local export PATH=$PATH:/work/apps/node-v0.12.7-linux-x64/bin:/work/apps/ledisdb/binexpo ...

  10. python学习-- class 类中需要注意的地方

    from django.db import models class Person(models.Model):     name = models.CharField(max_length=30) ...