Feign 简介和使用

声明式服务消费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
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 面向自动问题生成的跨语言训练

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;ACL 2019链接&#xff1a;https://128.84.21.199/pdf/1906.02525.pdf动机现有问题生成方法需要大量的“文本-问题”有标注数据对作为训练数据集&#xff…

再见,Spark!Flink已成气候!

身为大数据工程师&#xff0c;你还在苦学Spark、Hadoop、Storm&#xff0c;却还没搞过Flink&#xff1f;醒醒吧&#xff01;刚过去的2020双11&#xff0c;阿里在Flink实时计算技术的驱动下全程保持了“如丝般顺滑”&#xff0c;基于Flink的阿里巴巴实时计算平台简直强无敌。最恐…

Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池&#xff1a;ThreadPoolExecutor类&#xff0c;帮助开发人员管理线程并方便地执行并行任务。了解并合理使…

Zuul 简介和使用

Zuul背景Zuul的作用Zuul API网关Zuul请求过滤Zuul路由规则Zuul异常处理背景 通过之前的学习&#xff0c;我们知道注册中心Eureka&#xff0c;可以讲服务注册到该注册中心&#xff0c;Ribbon和Feign可以实现服务负载均衡地调用&#xff0c;Hystrix可以实现服务熔断&#xff0c;…

技术动态 | 知识图谱上的实体链接

本文转载自公众号&#xff1a;知识工场 1、什么是实体链接实体链接&#xff08;entity linking&#xff09;就是将一段文本中的某些字符串映射到知识库中对应的实体上。比如对于文本“郑雯出任复旦大学新闻学院副院长”&#xff0c;就应当将字符串“郑雯”、“复旦大学…

卖萌屋学术站开放注册啦!寻募种子用户,超多特权放出!

文&#xff1a;夕小瑶消失一个多月的小夕又突然出现啦&#xff01;要问小夕最近业余时间在做什么&#xff0c;那就是跟小伙伴们开发学术站啦~&#xff08;等...等再肝一版&#xff0c;小夕就继续给大家写文章(&#xff61; ́︿ ̀&#xff61;)众所周知&#xff0c;卖萌屋学术…

LeetCode 11. 盛最多水的容器(双指针)

文章目录1. 题目信息2. 解题1. 题目信息 给定 n 个非负整数 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。 在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。 找出其中的两条线&#xff0c;…

WSDM Cup 2020检索排序评测任务第一名经验总结

1.背景 第13届“国际网络搜索与数据挖掘会议”(WSDM 2020)于2月3日在美国休斯敦召开&#xff0c;该会议由SIGIR、SIGKDD、SIGMOD和SIGWEB四个专委会共同协调筹办&#xff0c;在互联网搜索、数据挖掘领域享有很高学术声誉。本届会议论文录用率仅约15%&#xff0c;并且WSDM历来注…

ltp︱基于ltp的无监督信息抽取模块

ltp︱基于ltp的无监督信息抽取模块&#xff1a;https://zhuanlan.zhihu.com/p/44890664 &#xfeff;无监督信息抽取较多都是使用哈工大的ltp作为底层框架。那么基于ltp其实有了非常多的小伙伴进行了尝试&#xff0c;笔者私自将其归纳为&#xff1a;事件抽取&#xff08;三元组…

Eureka 简介和使用

Eureka 服务注册与发现服务注册与发现Eureka与Zookeeper的比较ZooKeeper保证CPEureka保证APEureka是什么&#xff1f;Eureka原理SpringBoot、Spring Cloud 和 Eureka 版本选择Eureka单机搭建搭建Eureka服务端搭建Eureka客户端的服务提供者搭建Eureka客户端的服务消费者Eureka集…

论文浅尝 | XQA:一个跨语言开放域问答数据集

论文笔记整理&#xff1a;刘晓臻&#xff0c;东南大学计算机科学与工程学院本科生。Citation: Liu, J., Lin, Y., Liu, Z., & Sun, M. (2019,July). XQA: A Cross-lingual Open-domain Question Answering Dataset. InProceedings of the 57th Conference of the Associati…

深度CTR预估模型中的特征自动组合机制演化简史

文 | 杨旭东源 | 知乎众所周知&#xff0c;深度学习在计算机视觉、语音识别、自然语言处理等领域最先取得突破并成为主流方法。但是&#xff0c;深度学习为什么是在这些领域而不是其他领域最先成功呢&#xff1f;我想一个原因就是图像、语音、文本数据在空间和时间上具有一定的…

LeetCode 94. 二叉树的中序遍历(中序遍历)

文章目录1. 题目信息2. 解题2.1 递归2.2 循环&#xff0c;必须掌握1. 题目信息 给定一个二叉树&#xff0c;返回它的中序 遍历。 示例:输入: [1,null,2,3]1\2/3输出: [1,3,2]进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 来源&#xff1a;力扣&am…

想进美团不知道选哪个技术岗位?这里有一份通关秘籍!

春暖花开&#xff0c;美团春招已经启动&#xff0c;针对校招和社招开放了几千个职位&#xff0c;其中很大部分都是技术岗位。 随着互联网的高速发展&#xff0c;技术岗位在不断地细分&#xff0c;比如软件开发不仅分为前端和后端&#xff0c;前端会分为Web、iOS和Android三个方…

哈工大LTP本地安装及python调用

原文链接&#xff1a;https://blog.csdn.net/yangfengling1023/article/details/84559848 LTP即哈工大语言技术平台云&#xff0c;是基于云计算技术的中文自然语言处理服务平台 在线使用的网址&#xff1a;https://www.ltp-cloud.com/ github网址&#xff1a;https://github.c…

Nginx 简介和使用

Nginx简介Nginx发展介绍Nginx作者正向代理和反向代理概念网站代理服务器查看Nginx环境搭建下载安装前准备安装启动检测Nginx是否启动关闭重启Nginx核心配置文件说明Nginx主要功能1、静态网站部署2、负载均衡负载均衡概述负载均衡实现方式Nginx负载均衡策略负载均衡其他配置3、静…

论文浅尝 | 将文本建模为关系图,用于联合实体和关系提取

论文笔记整理&#xff1a;余海阳&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱、自然语言处理。链接&#xff1a;https://www.aclweb.org/anthology/P19-1136动机本文提出了一种利用图卷积网络&#xff08;GCNs&#xff09;联合学习命名实体和关系抽取的端到端抽取模…

LeetCode 144. 二叉树的前序遍历(前序遍历)

文章目录1. 题目信息2. 解题2.1 递归2.2 循环&#xff0c;必须掌握1. 题目信息 给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例:输入: [1,null,2,3] 1\2/3 输出: [1,2,3]进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 来源&#xff1a;力扣…

设计模式在外卖营销业务中的实践

一、前言 随着美团外卖业务的不断迭代与发展&#xff0c;外卖用户数量也在高速地增长。在这个过程中&#xff0c;外卖营销发挥了“中流砥柱”的作用&#xff0c;因为用户的快速增长离不开高效的营销策略。而由于市场环境和业务环境的多变&#xff0c;营销策略往往是复杂多变的&…

RabbitMQ 简介和使用

RabbitMQ一、RabbitMQ概述1、什么是消息队列2、为什么要使用消息队列3、RabbitMQ特点二、RabbitMQ安装1、安装前准备1.1 依赖包安装1.2 安装Erlang2、安装3、常用命令3.1. 启动和关闭3.2. 插件管理3.3. 用户管理3.4. 权限管理3.5. vhost管理三、RabbitMQ消息发送和接收1、 Rabb…