springcloud(七)-Feign声明式REST调用
前言
前面我们使用的RestTemplate实现REST API调用,代码大致如下:
public User findById(@PathVariable Long id) {return restTemplate.getForObject("http://localhost:8084/" + id, User.class);}
由代码可知,我们是使用拼接字符串的方式构造URL的,该URL只有一个参数。但是,在现实中,URL中往往含有多个参数。这时候我们如果还用这种方式构造URL,那么就会非常痛苦。举个例子:
http://localhost:8010/search?name=zhangsan&username=account1&age=20
这里是有三个参数,要是有10个参数,那么代码会变得难以维护。
怎么解决?
Feign简介
Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket.Feign可帮助我们更加便捷,优雅的调用HTTP API。
在spring cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
spring cloud对Feign进行了增强,使Feign支持了springmvc注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
代码编写
1.我们复制前面的microservice-consumer-movie,将ArtifactId修改为microservice-consumer-movie-feign.
2.添加Feign的依赖。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
3.创建一个Feign接口,并添加@FeignClient注解。
@FeignClient("microservice-provider-user") public interface UserFeignClient {@RequestMapping(value="/{id}",method = RequestMethod.GET)public User findById(@PathVariable("id") Long id); }
这里解释一下:@FeignClient注解中的microservice-provider-user是一个任意的客户端名称,用于创建Ribbon负载均衡器。在本例中,使用了Eureka,所以Ribbon会把microservice-provider-user解析成Eureka Server服务注册表中的服务。
当然,你也可以使用url属性指定请求URL(URL可以是完整的URL或者主机名),例如:
@FeignClient(name="microservice-consumer-user",url="http://localhost:8000/")
4.修改Controller代码,让其调用Feign接口。
@RestController public class MovieController { // @Autowired // private RestTemplate restTemplate; @Autowiredprivate UserFeignClient userFeignClient;@GetMapping("/user/{id}")public User findById(@PathVariable Long id) { // return restTemplate.getForObject("http://localhost:8081/" + id, User.class);return userFeignClient.findById(id);} }
5.修改启动类,为其添加@EnableFeignClients注解,如下:
@SpringBootApplication @EnableFeignClients public class ConsumerMovieApplication {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerMovieApplication.class, args);} }
这样,我们的电影微服务就可以用Feign去调用用户微服务的API了。
测试
启动microservice-discovery-eureka.
启动2个或更多microservice-provider-user实例。
启动microservice-consumer-movie-feign.
多次访问http://localhost:8082/user/1,返回结果。
{"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}
两个用户微服务实例都会打印如下日志:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=? 2019-04-19 19:23:42.249 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [98.23] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [张三] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
以上结果说明,我们不但实现了声明式REST API调用,同时还实现了客户端侧的负载均衡。
代码下载地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/microservice-consumer-movie-feign.zip
转载于:https://www.cnblogs.com/fengyuduke/p/10738342.html
springcloud(七)-Feign声明式REST调用相关推荐
- SpringCloud Feign声明式服务调用
SpringCloud Feign声明式服务调用 1. 加入pom依赖 2. Application.java上声明@EnableFeignClients 3. @FeignClient声明接口调用服 ...
- SpringCloud实战5-Feign声明式服务调用
SpringCloud实战5-Feign声明式服务调用 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还 ...
- 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用
spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...
- 聊一聊声明式接口调用与Nacos的结合使用
背景 对于公司内部的 API 接口,在引入注册中心之后,免不了会用上服务发现这个东西. 现在比较流行的接口调用方式应该是基于声明式接口的调用,它使得开发变得更加简化和快捷. .NET 在声明式接口调用 ...
- SpringCloud之声明式服务调用 Feign(三)
一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样. 我们知道,阿里巴巴的doubbo ...
- 两个子集pom互相调用_声明式服务调用组件Feign
什么是Feign? Feign是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端.Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务. 什么是 ...
- Spring Cloud Feign 1(声明式服务调用Feign 简介)
Spring Cloud Feign基于Netflix Feign 同时整合了Spring Cloud Ribbon和Spring Cloud Hytrix,除了提供两者的强大功能外,它还提供了一种声 ...
- Spring Cloud微服务之Feign——声明式服务间调用
目录 写在前面 服务间调用常见的方案 方案一:HttpClient 方案二:RestTemplate 方案三:Feign 框架版本问题及可能遇到的坑 搭建服务注册中心 搭建服务1--service-a ...
- 04.声明式服务调用:Spring Cloud Feign(Greenwich.SR2)
1.Feign是什么 Feign是整合了Ribbon与Hystrix外,还提供了声明式的Web服务客户端定义方式.采用了声明式API接口的风格,将Java Http客户端绑定到它的内部.Feign的首 ...
最新文章
- 使用Maven管理Java项目
- 【转】Android APK反编译就这么简单 详解(附图)
- react学习笔记(序)
- .Net Core 在 Linux-Centos上的部署实战教程(二)
- python关闭文件os_如何关闭使用os.startfile(),Python 3.6打开的文件
- Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
- 你知道Java的四种引用类型吗
- Java的中排序方式
- 从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多,把经历分享给你们!
- android drawable 比例,Android中的Drawable基础与自定义Drawable
- 如何在Docker中列出容器
- C语言的32个关键字怎么背,谁知道c语言的32个关键字怎么读,还有语法。
- 十个值得一试的开源深度学习框架
- nginx配置多个域名使用同一个端口
- MCU方案分享----按摩贴方案
- windows快捷键一览表
- 引气管理计算机失效,TAT信号无效导致ND上TAS-显示消失B737系列机务在线 - 认真、负责、细致 我们秉承的理念...
- linux鼠标切换窗口的快捷键设置,Xshell中如何设置鼠标快捷键
- FFmpeg第一季:小白开窍+九阳神功
- 用计算机判断函数单调性吗,高中数学函数单调性的判断方法(全)
热门文章
- QPW 操作日志表(tl_operate_log)
- IntelliJ IDEA for Mac 在eclipse(MacOS)模式下的快捷键
- 数仓建模 项目_模型设计_数仓建模 PDF 下载
- 在Linux中su和sudo区别,Linux中su和sudo的用法和区别
- C++ 11 深度学习(九)C++文件IO
- 计算机主机箱外部介绍图,电脑的主机结构是怎样的 电脑主机结构图【图文】...
- ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
- ImportError: cannot import name ‘constants‘
- pdh光端机的优点介绍
- 选择交换机需要了解的一些性能参数