前言

前面我们使用的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调用相关推荐

  1. SpringCloud Feign声明式服务调用

    SpringCloud Feign声明式服务调用 1. 加入pom依赖 2. Application.java上声明@EnableFeignClients 3. @FeignClient声明接口调用服 ...

  2. SpringCloud实战5-Feign声明式服务调用

    SpringCloud实战5-Feign声明式服务调用 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还 ...

  3. 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用

    spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...

  4. 聊一聊声明式接口调用与Nacos的结合使用

    背景 对于公司内部的 API 接口,在引入注册中心之后,免不了会用上服务发现这个东西. 现在比较流行的接口调用方式应该是基于声明式接口的调用,它使得开发变得更加简化和快捷. .NET 在声明式接口调用 ...

  5. SpringCloud之声明式服务调用 Feign(三)

    一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样. 我们知道,阿里巴巴的doubbo ...

  6. 两个子集pom互相调用_声明式服务调用组件Feign

    什么是Feign?    Feign是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端.Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务. 什么是 ...

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

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

  8. Spring Cloud微服务之Feign——声明式服务间调用

    目录 写在前面 服务间调用常见的方案 方案一:HttpClient 方案二:RestTemplate 方案三:Feign 框架版本问题及可能遇到的坑 搭建服务注册中心 搭建服务1--service-a ...

  9. 04.声明式服务调用:Spring Cloud Feign(Greenwich.SR2)

    1.Feign是什么 Feign是整合了Ribbon与Hystrix外,还提供了声明式的Web服务客户端定义方式.采用了声明式API接口的风格,将Java Http客户端绑定到它的内部.Feign的首 ...

最新文章

  1. 使用Maven管理Java项目
  2. 【转】Android APK反编译就这么简单 详解(附图)
  3. react学习笔记(序)
  4. .Net Core 在 Linux-Centos上的部署实战教程(二)
  5. python关闭文件os_如何关闭使用os.startfile(),Python 3.6打开的文件
  6. Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
  7. 你知道Java的四种引用类型吗
  8. Java的中排序方式
  9. 从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多,把经历分享给你们!
  10. android drawable 比例,Android中的Drawable基础与自定义Drawable
  11. 如何在Docker中列出容器
  12. C语言的32个关键字怎么背,谁知道c语言的32个关键字怎么读,还有语法。
  13. 十个值得一试的开源深度学习框架
  14. nginx配置多个域名使用同一个端口
  15. MCU方案分享----按摩贴方案
  16. windows快捷键一览表
  17. 引气管理计算机失效,TAT信号无效导致ND上TAS-显示消失B737系列机务在线 - 认真、负责、细致 我们秉承的理念...
  18. linux鼠标切换窗口的快捷键设置,Xshell中如何设置鼠标快捷键
  19. FFmpeg第一季:小白开窍+九阳神功
  20. 用计算机判断函数单调性吗,高中数学函数单调性的判断方法(全)

热门文章

  1. QPW 操作日志表(tl_operate_log)
  2. IntelliJ IDEA for Mac 在eclipse(MacOS)模式下的快捷键
  3. 数仓建模 项目_模型设计_数仓建模 PDF 下载
  4. 在Linux中su和sudo区别,Linux中su和sudo的用法和区别
  5. C++ 11 深度学习(九)C++文件IO
  6. 计算机主机箱外部介绍图,电脑的主机结构是怎样的 电脑主机结构图【图文】...
  7. ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
  8. ImportError: cannot import name ‘constants‘
  9. pdh光端机的优点介绍
  10. 选择交换机需要了解的一些性能参数