前言

前面我们使用的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; @Autowired
private 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 {
@Bean
public 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 [] as [BIGINT] - []
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]) - []
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

springcloud(七)-Feign声明式REST调用的更多相关文章

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

    在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...

  2. Spring Cloud Feign 声明式服务调用

    目录 一.Feign是什么? 二.Feign的快速搭建 三.Feign的几种姿态 参数绑定 继承特性 四.其他配置 Ribbon 配置 Hystrix 配置 一.Feign是什么? ​ 通过对前面Sp ...

  3. Spring Cloud Feign声明式服务调用(转载)+遇到的问题

    转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...

  4. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...

  5. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)

    在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...

  6. Spring Cloud第七篇 | 声明式服务调用Feign

    本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ...

  7. Feign声明式服务调用

    Feign是一种声明式.模板化的HTTP客户端(仅在Application Client中使用).声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求. Spring Clo ...

  8. Spring Cloud07: Feign 声明式接口调用

    一.什么是Feign Feign也是去实现负载均衡,但是它的使用要比Ribbon更加简化,它实际上是基于Ribbon进行了封装,让我们可以通过调用接口的方式实现负载均衡.Feign和Ribbon都是由 ...

  9. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(二)

    参数绑定 在上一章的示例中,我们使用Spring Cloud Feign实现的是一个不带参数的REST服务绑定.然而现实系统中的各种业务接口要比它复杂得多,我们有时会在HTTP的各个位置传入各种不同类 ...

随机推荐

  1. 关于流程图设计,你需要Get的几点必备知识

    流程图(Flow Chart)这个概念对很多人来说并不陌生,但如果让你定义或者举例说明什么是产品流程图,恐怕还是有难度的.或许诸如“用户体验”.“交互设计”.“逻辑关系”等词会像走马灯般闪现在你的脑海 ...

  2. RocketMQ:Cannot allocate memory

    使用Storm本地模式消费RocketMQ数据的时候, 消费一点数据之后,就会出现如下错误: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os:: ...

  3. Levenshtein计算相似度距离

    使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...

  4. C语言基础第一次作业

    一,1)大学和高中最大的不同是没有人天天看着你,请问大学理想的师生关系是?有何感想? 看了邹欣老师博客中写到的教学基础——师生关系后陷入沉思,邹欣老师在她的博客中直接否认了传统认知的师生关系——蜡烛, ...

  5. Hdu4280 Island Transport 2017-02-15 17:10 44人阅读 评论(0) 收藏

    Island Transport Problem Description In the vast waters far far away, there are many islands. People ...

  6. 23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder

    23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder 2016-07-21 (www.cnblogs.com/icmzn) 模式理解

  7. 查看JVM内存使用情况

    Runtime run = Runtime.getRuntime(); long max = run.maxMemory()/(1024*1024); long total = run.totalMe ...

  8. LINQ to Entity里面不能使用DateTime

    LINQ中不能直接使用DateTime,否则会报错:‘The specified type member 'Date' is not supported in LINQ to Entities. On ...

  9. 使用google chrome抓取数据:抓取全国的高中的数据

    http://tomycat.github.io/blog/other/2014/05/28/use-google-chrome-capture-data.html

  10. 浅谈 温故知新——HTML5!

    古人有云:温故而知新.活到老,学到老,作为一枚前端的程序猿,不停的学习能够让我们对我们的技术有一个更加丰富的认识.这几天,项目已经完成,但我发现自己的知识体系存在一些短板,特别是在H5方面,所以我又回 ...