zoukankan      html  css  js  c++  java
  • 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=..)

  • 相关阅读:
    二级目录下的SESSION共享问题
    [Leetcode 65] 120 Triangle
    JMeter学习(一)工具简单介绍
    pycham破解方法——Mac上亲测成功
    jmeter目前发现一丢丢强大的功能(未完待续,需优化)
    jmeter实现请求返回参数利用到下一个请求中
    通用化case,拿走不谢——测试之路
    mac 下pip安装python三方库的时候提示 Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate:......
    sudo pip install MySQLdb找不到该资源的原因
    软件质量管理实践总结
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6882353.html
Copyright © 2011-2022 走看看