springcloud-06-feign的使用

spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。

Feign简介

Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求

下面写一个feign的实例:

pom.xml的配置

        <!-- 添加feign 的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

启动类添加注解:

package com.wenbronk.consumer.feign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
//import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * Created by root on 2017/5/20.
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MovieFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(MovieFeignApplication.class, args);
    }
}

3, 编写一个feignClient接口, 以实现远程调用

package com.wenbronk.consumer.feign.feignclient;

import com.wenbronk.consumer.feign.entity.UserEntity;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * feign的接口
 * Created by root on 2017/5/20.
 */
@FeignClient("microservice-provider-user")
public interface UserFeignClient {

    /**
     * 不可以使用 getMapping, 或者postMapping注解
     *
     * @param id
     * @return
     * @PathVariable 中 必须有value的值
     */
    @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
    public UserEntity findById(@PathVariable("id") Long id);

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public UserEntity postUser(@RequestBody UserEntity userEntity);

    /**
     * 这儿不会管呗调用的用什么方法
     @PostMapping("/user")
     public User postUser(@RequestBody User user) {
        return user;
     }
     */
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public UserEntity getUser(UserEntity userEntity);

    /**
     * 如果被调用的方法是对象, 默认是post请求, 对方不可以是get请求
     // 该请求不会成功
     @GetMapping("/get-user")
     public User getUser(User user) {
         return user;
     }
     * @param userEntity
     * @return
     */
    @RequestMapping(value = "/get-user", method = RequestMethod.GET)
    public UserEntity getUserGet(UserEntity userEntity);

}

4, 在controller中进行实验

package com.wenbronk.consumer.feign.controller;

import com.wenbronk.consumer.feign.entity.UserEntity;
import com.wenbronk.consumer.feign.feignclient.UserFeignClient;
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.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by root on 2017/5/20.
 */
@RestController
public class MovieController {

    @Autowired
    private UserFeignClient userFeignClient;

    @GetMapping("/findUserById/{id}")
    public UserEntity findUserById(@PathVariable Long id) {
        return userFeignClient.findById(id);
    }

    @PostMapping("/getUser")
    public UserEntity getUser(UserEntity user) {
//        return userFeignClient.postUser(user);
        return userFeignClient.getUser(user);
//        return userFeignClient.getUserGet(user);
    }

}

调用的远程服务为: http://www.cnblogs.com/wenbronk/p/6881573.html

中的user服务

使用feign遇到的坑:

1, feign接口中, GetMapping, PostMapping不支持, 必须使用RequestMapping

2, 使用RestFul请求时, @PathVariables("id"), 和变量同名也必须加 "id"

3, 接口中的参数是对象, 默认使用post方法, 不管是否指定 @RequestMapping(method=..)

时间: 2024-10-06 06:49:31

springcloud-06-feign的使用的相关文章

SpringCloud(5)---Feign服务调用

SpringCloud(5)---Feign服务调用 上一篇写了通过Ribbon进行服务调用,这篇其它都一样,唯一不一样的就是通过Feign进行服务调用. 注册中心和商品微服务不变,和上篇博客一样,具体参考:SpringCloud(4)---Ribbon服务调用,源码分析 这边只重写订单微服务. 一.OrderService 订单微服务 1.pom.xml 这里相对于上一篇的订单微服务只要新添加一个jar包 <!--feign依赖--> <dependency> <group

SpringCloud+Eureka+Feign+Ribbon的简化搭建流程,加入熔断,网关和Redis缓存[2]

作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 前提:本篇是基于 SpringCloud+Eureka+Feign+Ribbon的简化搭建流程和CRUD练习[1] 的修改与拓展 1.修改consumer的CenterFeign.java,把返回值全部设置为String /** * 是consumer调用provider(需要指定provider的名字) * 请求的清单列表:规定调用地址.参数.返回值 * 在正常走通的时候不走CenterFeignFallBack,当provider down

springcloud之feign踩的大坑

今天写feign的demo的时候踩了一个大坑,感觉spring-cloud到处都是坑,这些坑共同的原因就是依赖包的版本问题!!! 真的气死了 之前eureka的配置也是搞了好久 ------------------------------------------------------------ 首先是添加了没有报错,但是运行的时候抛了nosuchemthod的异常 nosuch你妹啊 查了一下是版本的问题,结果一阵瞎捣鼓(并没有记录过程),导致的结果就是ServiceFeignApplica

SpringCloud系列——Feign 服务调用

前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调用. Feign是一个声明性web服务客户端.它使编写web服务客户机变得更容易,本质上就是一个http,内部进行了封装而已. GitHub地址:https://github.com/OpenFeign/feign 官方文档:https://cloud.spring.io/spring-cloud-

解决:SpringCloud中Feign支持GET请求POJO传参

在日常的开发中,当遇到一个请求需要传递多个参数时,我们习惯将参数封装到一个POJO对象中,已提高程序的可读性和简化编写.但是在使用SpringCloud时,Feign对SpringMVC注解支持并不完善,其中一点就是,当发送的GET请求携带多个参数时,不能使用POJO来封装参数,这个就比较蛋疼了.一种使之支持GET请求POJO传递参数的方法如下: 添加Maven依赖 <dependency> <groupId>org.springframework.cloud</groupI

springCloud的feign异常:RequestHeader参数为空时,对key加了大括号{}

好久没写博客了,今天趁着周末把工作中遇到的问题梳理一下(在这个问题排查过程中,发现自己排查问题的能力还是太弱了,需要加强). 最近在公司springCloud的项目里,通过feign远程调用其他服务,代码如下,可以看到,这里的RequestHeader里面我传了String类型的tenantId,测试的时候没有问题,但是项目上线后,发现部分用户在调用这个接口的时候返回的不是想要的结果,当然大部分用户使用的时候是正常的.然后我们就打印了日志,查看了调用链路,发现只要RequestHeader里面的

【微服务架构】SpringCloud之Feign(五)

Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign. 声明式REST

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

springcloud(七) feign + Hystrix 整合 、

之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和 RestTemplate + Hystrix  ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用. Feign + Hystrix 演示: eruka(略) order 服务工程: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apac

SpringCloud使用Feign拦截器实现URL过滤和RequestParam加密

一.FeignInterceptor.class拦截器 package com.xiaohang.socialcard.pre.intercepter; import com.xiaohang.socialcard.pre.utils.SM4Util; import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework