SpringCloud系列十:使用Feign实现声明式REST调用

1. 回顾

  前文的示例中是使用RestTemplate实现REST API调用的,代码大致如下:

@GetMapping("/user/{id}")
    public User findById(@PathVariable Long id) {
        return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
    }

  由代码克制,我们是使用拼接字符串的方式构造URL的,该URL只有一个参数。

  然而在现实中,URL往往有多个参数。如果这时还使用这种方式构造URL,那么就会变得很低效,并且难以维护。

2. Feign简介

  Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。

  在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者

  JAX-RS注解等。

  Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

3. 为服务消费者整合Feign

  > 复制项目 microservice-consumer-movie,将ArtifactId修改为 microservice-consumer-movie-feign

  > 添加Feign的依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

  > 创建一个Feign接口,并添加@FeignClient注解

package com.itmuch.cloud.microserviceconsumermoviefeign.feign;

import com.itmuch.cloud.microserviceconsumermoviefeign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {

    @GetMapping(value = "/{id}")
    User findById(@PathVariable("id") Long id);

}

  @FeignClient注解中的microservice-provider-user是一个任意的客户端名称,用于创建Ribbon负载均衡器。在本例中,由于使用了Eureka,

  所以Ribbon会把microservice-provider-user解析成Eureka Server服务注册表中的服务。

  如果不想使用Eureka,也可使用service.ribbon.listOfServers属性配置服务器列表

  也可使用url属性指定请求的URL(URL可以是完整的URL或主机名),例如

  @FeignClient(name = "microservice-provider-user", url = "http://localhost:8000/")

  > 修改Controller代码,让其调用Feign接口

package com.itmuch.cloud.microserviceconsumermoviefeign.controller;

import com.itmuch.cloud.microserviceconsumermoviefeign.feign.UserFeignClient;
import com.itmuch.cloud.microserviceconsumermoviefeign.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MovieController {

    @Autowired
    private UserFeignClient userFeignClient;

    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id) {
        return this.userFeignClient.findById(id);
    }

}

  > 修改启动类,添加@EnableFeignClients注解

package com.itmuch.cloud.microserviceconsumermoviefeign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MicroserviceConsumerMovieFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceConsumerMovieFeignApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

  > 启动 microservice-discovery-eureka

  > 启动两个以上的 microservice-provider-user 实例

  > 启动 microservice-consumer-movie-feign

  > 多次访问 http://localhost:8010/user/1,在各个实例的控制台下都可看见类似日志

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=?
2018-03-27 17:48:19.468 TRACE 14160 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2018-03-27 17:48:19.480 TRACE 14160 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2018-03-27 17:48:19.481 TRACE 14160 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2018-03-27 17:48:19.481 TRACE 14160 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2018-03-27 17:48:19.481 TRACE 14160 --- [nio-8001-exec-2] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]

4. 总结

  以上结果说明,本文实现了声明式的REST API调用,同时还实现了客户端侧的负载均衡。

  下文将讲解自定义Feign配置,敬请期待~~~

5. 参考

  周立 --- 《Spring Cloud与Docker微服务架构与实战》

原文地址:https://www.cnblogs.com/jinjiyese153/p/8659050.html

时间: 2024-08-29 23:15:57

SpringCloud系列十:使用Feign实现声明式REST调用的相关文章

springCloud(9):使用Feign实现声明式REST调用

一.简介 前面我们是使用RestTemplate实现rest api调用的,代码如下: @GetMapping("/user/{id}") public User findById(@PathVariable Long id) throws Exception {     return  this.restTemplate.getForObject("http://spring-ribbon-eureka-client2/" + id, User.class); }

springcloud之Feign实现声明式REST调用

Feign是Netflix开发的声明式.模板化的HTTP客户端,可帮助我们更加便捷.优雅的调用HTTP api.spring cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便:只需要创建一个接口,并在接口上添加一些注解,代码就完成了,Feign支持多种注解,子嗲的或者JAX-RS注解等. 添加maven依赖: <dependency> <groupId>org.springframewo

Feign:声明式REST调用

一. 简介 1. 声明式,模板化的HTTP客户端,可以帮助我们更加便捷,优雅的调用HTTP API: 2. 为服务消费者整合Feign 添加spring-cloud-starter-openfeigh依赖: 创建一个Feign接口,添加@FeignClient注解: 在Controller中调用Feign接口: 3. 自定义Feign配置 feign: client: config: default: connectTimeout: // 相当于Request.Options readTimeo

springCloud(10):使用Feign实现声明式REST调用-构造多参数请求

请求多参数的URL 假设请求的URL包含多个参数,如:http://localhost:8086/user1?id=1&username=nihao 1.1.Feign接口 @FeignClient(name = "spring-ribbon-eureka-client2") public interface UserFeignClient {     @RequestMapping(value = "/{id}", method = RequestMeth

Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移. 服务注册和发现对于微服务架构而言,是非常重要的.有了服务发现和注册,只需要使用服务的标识符就可以访问到服务,而不需要修改服务调用的配置文件.该功能类似于 Dubbo 的注册中心,比如 Zookeeper. Eureka

干货分享微服务spring-cloud(5.声明式服务调用feign)

Spring cloud feign基于Netflix feign实现,整合了spring cloud ribbon与spring cloud hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的web服务客户端定义方式 新建spring boot工程并命名为demo-springcloud-feign-consumer,新建启动类FeignApplication,通过@ EnableFeignClients注解来开启spring cloud feign的功能支持 定义YhqSe

【第三章】声明式服务调用(Feign)

当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格

Spring Cloud 声明式服务调用 Feign

一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声明式调用服务.而不会在客服端和服务端存储2份相同的model和api定义.Feign在RestTemplate的基础上对其封装,由它来帮助我们定义和实现依赖服务接口的定义.Spring Cloud Feign 基于Netflix Feign 实现的,整理Spring Cloud Ribbon 与 S

005声明式服务调用Feign

1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix.Spring Boot Starter Actuator依赖和Spring Cloud依赖管理 <dependencies> <!--Eureka Client依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>sprin