Spring Cloud系列文,Feign整合Ribbon和Hysrix
在本博客之前的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的更多相关文章
- Spring Cloud系列之Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- spring cloud 系列第3篇 —— ribbon 客户端负载均衡 (F版本)
源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.ribbon 简介 ribbon是Netfix公司开源的负载均衡组件,采用服 ...
- Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...
- Spring Cloud系列(二) 介绍
Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...
- Spring Cloud 系列之 Gateway 服务网关(四)
本篇文章为系列文章,未读第一集的同学请猛戳这里: Spring Cloud 系列之 Gateway 服务网关(一) Spring Cloud 系列之 Gateway 服务网关(二) Spring Cl ...
- Spring Cloud 系列之 Dubbo RPC 通信
Dubbo 介绍 官网:http://dubbo.apache.org/zh-cn/ Github:https://github.com/apache/dubbo 2018 年 2 月 15 日,阿里 ...
- Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端
Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...
- Spring Cloud 入门 之 Feign 篇(三)
原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...
- Feign整合Ribbon和Hystrix源码解析
在上篇文章Feign自动装配中,我们提到了Feign的自动装配的原理,以及Feign整合Ribbon和Hystrix的核心在类FeignClientFactoryBean中,那么本篇文章就来揭开这个类 ...
随机推荐
- Goroutines和Channels
原文链接 https://golangbot.com/goroutines/ Goroutines Goroutines 可以被认为是多个函数或方法同时允许.可以认为是一个轻量级的线程.与线程的花费相 ...
- SPOJ COT2 Count on a tree II 树上莫队算法
题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...
- CodeForces 543D 树形DP Road Improvement
题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数. 对于n个所有可能的x,输出n个答案. 分析: 题解 ...
- 程序员是天生的软件UI设计师
一个软件项目,谁才是软件开发的主体,是软件UI设计师?还是程序员? 这还用问吗?当然是程序员拉.引用以下alienbat知友的一段评论:对于软件开发而言,码农的工作是必需的.设计师的工作是可选的. 举 ...
- TensorFlow——小练习:feed
feed就是喂入数据 使用feed前必须要有占位符作为操作的对象,在运行操作的时候喂入数据. # _*_coding:utf-8_*_ import tensorflow as tf import n ...
- Python面向对象(组合、菱形继承、多态)
今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事 1.创造空对象 2.触发对象下的__init__方法,然后将p连同参数一同传给init ...
- 九度oj 题目1085:求root(N, k) 清华2010年机试题目
题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 (这里^ ...
- IE7下li超出ul的固定宽度后溢出bug
问题描述: ul固定宽度,li浮动超出ul的宽度自动换行,li有左margin,但是靠近ul左边缘的那一列l 的margin设为0,其他浏览器正常,但是在ie7中超出ul宽度后会有一个l溢出并导致出现 ...
- (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)
原文地址:解决fasterxml中string字符串转对象json格式错误问题 com.fasterxml.jackson.databind.ObjectMapper mapper = new com ...
- 归并排序,时间复杂度nlogn
思路: /* 考点: 1. 快慢指针:2. 归并排序. 此题经典,需要消化吸收. 复杂度分析: T(n) 拆分 n/2, 归并 n/2 ...