声明式服务消费Feign

  • 一、简介
  • 二、使用Feign实现服务消费者
  • 三、实现普通的服务提供者
  • 四、Feign服务调用测试
  • 五、Feign消费者测试
    • 负载均衡
    • 服务熔断

一、简介

Feign是Netflix公司开发的一个声明式的REST调用客户端
Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud开发中非常基础的组件,在使用过程中他们一般是同时出现的,配置也非常相似,每次开发都有许多相同的代码。因此,Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让我们的开发变的更加简单。
Spring Cloud Feign :对Ribbon负载均衡、Hystrix服务熔断进行了简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的Web服务客户端定义方式。

二、使用Feign实现服务消费者

  1. 创建SpringBoot工程
  2. 添加依赖
    spring-cloud-starter-netflix-eureka-client
    spring-cloud-starter-openfeign
    spring-cloud-starter-netflix-hystrix
  3. 在入口函数上激活功能
    @EnableEurekaClient
    @EnableFeignClients
  4. 配置文件
# 服务端口号
server.port=80
#指定该服务的名字,该名称将在服务被调用时使用
spring.application.name=feign-eureka-client-consumer
#Eureka配置:服务注册到哪里
eureka.client.service-url.defaultZone=http://eureka7001:7001/eureka
  1. service接口
/*** 用于标记当前借口是一个Feign声明式服务接口。Spring会为这个接口生成动态代理对象* 属性name:指定注册中心某个服务的名字*/
@FeignClient(name="feign-eureka-client-provider")
public interface TestService {/*** 定义抽象方法* RequestMapping标记这个方法用于访问服务提供者,参数对应服务提供者提供的方法* @return 服务提供者返回的具体内容*/@RequestMapping("/test")String test();/*** @RequestParam 指定基本数据类型参数*/@RequestMapping("/testParam01")String testParam01(@RequestParam String name, @RequestParam Integer age);/*** @RequestBody 指定对象类型参数*/@RequestMapping("/testParam02")String testParam02(@RequestBody User user);/*** 如果服务提供者返回的Json数据符合Json对象格式* 那么我们可以使用一个实体类或Map集合来接收响应数据*/@RequestMapping("/testReturnUser")User testReturnUser();/*** 如果服务提供者返回的Json数据符合Json对象数组格式* 那么我们可以使用一个List集合来接收响应数据*/@RequestMapping("/testReturnList")List<User> testReturnList();
}
  1. controller调用远程服务
/*** 作为服务消费者,可以不使用 RestController 返回json数据,这里为了方便而使用。*/
@RestController
public class TestController {@Resourceprivate TestService testService;@RequestMapping("/test")public String test(){String result = testService.test();return "使用了Feign的服务消费者..."+result;}@RequestMapping("/testParam01")public String testParam01(){String result = testService.testParam01("lily",24);return "使用了Feign的服务消费者..."+result;}@RequestMapping("/testParam02")public String testParam02(){User user = new User("xiaoming",23);String result = testService.testParam02(user);return "使用了Feign的服务消费者..."+result;}@RequestMapping("/testReturnUser")public String testReturnUser(){User user = testService.testReturnUser();return "使用了Feign的服务消费者..."+user.toString();}@RequestMapping("/testReturnList")public String testReturnList(){List<User> list = testService.testReturnList();return "使用了Feign的服务消费者..."+list.toString();}
}

三、实现普通的服务提供者

  1. 创建SpringBoot工程
  2. 添加依赖
    spring-cloud-starter-netflix-eureka-client
  3. 在入口函数上激活功能
    @EnableEurekaClient
  4. 配置文件
server.port=8001#指定该服务的名字,该名称将在服务被调用时使用
spring.application.name=feign-eureka-client-provider#Eureka配置:服务注册到哪里
eureka.client.service-url.defaultZone=http://eureka7001:7001/eureka
  1. controller提供服务
/*** 作为服务提供者,要是用 RestController 返回json数据*/
@RestController
public class TestController {@GetMapping("/test")public String test(){return "【服务提供者返回内容】";}@GetMapping("/testParam01")public String testParam01(String name,Integer age){return "【服务提供者返回内容 name:"+name+"  age:"+age+"】";}@RequestMapping("/testParam02")public String testParam02(@RequestBody User user){return "【服务提供者返回内容 name:"+user.getName()+"  age:"+user.getAge()+"】";}@RequestMapping("/testReturnUser")public Object testReturnUser(){User user = new User("小黄",23);return user;}@RequestMapping("/testReturnList")public Object testReturnList(){List<User> list = new ArrayList<>();User user1 = new User("小黄",23);User user2 = new User("小李",24);User user3 = new User("小明",25);list.add(user1);list.add(user2);list.add(user3);return list;}
}

四、Feign服务调用测试

  1. 访问:http://localhost/test
  2. http://localhost/testParam01
  3. 访问:http://localhost/testParam02
  4. 访问:http://localhost/testReturnUser
  5. 访问:http://localhost/testReturnList

五、Feign消费者测试

负载均衡

Spring Cloud提供了Ribbon来实现负载均衡,使用Ribbon直接注入一个RestTemplate对象即可,RestTemplate已经做好了负载均衡的配置;在Spring Cloud下,使用Feign也是直接实现负载均衡的,定义一个有@FeignClient注解的接口,然后使用@RequestMapping注解到方法上映射远程的REST服务,此方法也是做好负载均衡配置的。

服务熔断

  1. 在application.properties文件开启feign对hystrix功能支持(支持熔断)
feign.hystrix.enabled=true
  1. 指定熔断回调逻辑
/*** @FeignClient:标记当前接口是一个Feign声明式服务接口,Spring会为这个接口生成动态代理对象* 属性name:指定注册中心某个服务的名字* 属性fallback:指定一个自定义异常熔断器类* 属性fallbackFactory:指定一个自定义异常熔断器类,可以获得异常信息*/
//方式一
@FeignClient(name="feign-eureka-client-provider",fallback = MyFallback.class)
//方式二
@FeignClient(name="feign-eureka-client-provider",fallbackFactory = MyFallbackFactory.class)
public interface TestService {...}
  1. 自定义异常熔断器
//方式一/*** 自定义异常熔断器类,并实现自定义声明式Feign的接口* 为这个接口中的所有抽象方法提供熔断处理*/
@Component
public class MyFallback implements TestService {@Overridepublic String test() {return "test请求熔断";}@Overridepublic String testParam01(String name, Integer age) {return "testParam01请求熔断";}@Overridepublic String testParam02(User user) {return "testParam02请求熔断";}@Overridepublic User testReturnUser() {return null;}@Overridepublic List<User> testReturnList() {return null;}
}
//方式二/*** 自定义异常熔断器类,并实现Hystrix的降级回调的父接口* 注意:泛型决定当前类要为哪个声明式接口提供异常熔断处理*/
@Component
public class MyFallbackFactory implements FallbackFactory<TestService> {/*** @param throwable* @return 返回一个接口中泛型的对象:当这个泛型对象出现异常后将用create返回的这个对象进行降级*/@Overridepublic TestService create(Throwable throwable) {//使用匿名内部类来创建TestService声明式服务接口的熔断对象return new TestService() {@Overridepublic String test() {System.out.println(throwable.getClass());System.out.println(throwable.getMessage());return "test请求熔断";}@Overridepublic String testParam01(String name, Integer age) {return "testParam01请求熔断";}@Overridepublic String testParam02(User user) {return "testParam02请求熔断";}@Overridepublic User testReturnUser() {return null;}@Overridepublic List<User> testReturnList() {return null;}};}
}
  1. 服务异常
    @GetMapping("/test")public String test(){System.out.println(1/0);return "【服务提供者返回内容】";}
  1. 调用服务进行熔断测试 http://localhost/test

Feign 简介和使用相关推荐

  1. 微服务SpringCloud之Feign简介及使用

    Feign的目标 feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service.Spring Cloud集成了Ribbon和Eurek ...

  2. Spring Cloud Feign 1(声明式服务调用Feign 简介)

    Spring Cloud Feign基于Netflix Feign 同时整合了Spring Cloud Ribbon和Spring Cloud Hytrix,除了提供两者的强大功能外,它还提供了一种声 ...

  3. Feign简介与简单应用

    一 点睛 Feign是Netflix开发的声明式.模板化的HTTP客户端, Feign可以帮助我们更快捷.优雅地调用HTTP API. 在Spring Cloud中,使用Feign非常简单--创建一个 ...

  4. Feign的简介及使用

    一.Feign简介 Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送,解决代码可读 ...

  5. 企业分布式微服务云SpringCloud SpringBoot mybatis - 服务消费者(Feign)

    一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注 ...

  6. Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign

    上一篇文章,讲述了如何通过RestTemplate + Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Htt ...

  7. Spring Cloud第三篇:服务消费者Feign

    上一篇文章,讲述了如何通过RestTemplate+Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. 一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Htt ...

  8. java B2B2C Springboot仿淘宝电子商城系统-负载均衡之ribbon+feign

    一. feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign注解和JAX-RS注 ...

  9. 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

最新文章

  1. 【蓝桥java】递归基础之智力训练
  2. springMVC自定义全局异常
  3. 使用NHibernate绑定页面数据时,出现未能加载视图状态,正在向其中加载视图状态。。。。的Bug...
  4. 第三章:lambda表达式
  5. 【新版上线】网易云点播内容加密服务正式发布啦!
  6. Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”
  7. python3语法都相同吗_python3.4学习笔记(一) 基本语法 python3不向下兼容,有些语法跟python2.x不一样...
  8. jmeter 用户数 线程数_如何使用jmeter编写TCP测试脚本
  9. php7 编译 pdo mysql_php7 编译 pdo_mysql 问题, [mysql_driver.lo] Error 1
  10. 下行文格式图片_收藏!公文写作格式大全(附示例图)
  11. oracle rac 距离限制,Oracle Extended Distance Clusters (Oracle 扩展距离集群 - 异地RAC)
  12. 【chrome插件】web版微信接入图灵机器人API实现自动回复
  13. SQL Server 中的嵌套事务与@@TranCount(转)
  14. ShellExecute打开外部程序并输入相应参数
  15. 如何让自己电脑的鼠标指针变的更炫酷来看看这个吧
  16. mdt 计算机名_MDT配置数据库
  17. nest 设置密码_如何设置Nest Cam
  18. 破解电信光猫 HG6201T 超管账号密码 (C语言源代码)
  19. mysql 导出表数据
  20. 数字版权管理 (DRM) 续

热门文章

  1. Socket api接口--Send(),Recv()的长度问题
  2. 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
  3. LOCAL_MODULE_TAGS 选项说明(android编译选项选择)
  4. 每日一题(30)—— 局部变量能否和全局变量重名?
  5. Nodejs 操作 MongoDb 数据库
  6. Chapter7-6_Text Style Transfer
  7. LeetCode 2059. 转化数字的最小运算数(BFS)
  8. LeetCode 939. 最小面积矩形(哈希)
  9. LeetCode 1441. 用栈操作构建数组
  10. python中数据类型转换原理_python的可变与不可变数据类型的原理是什么呢?