Feign简介与简单应用_chengqiuming的博客-程序员宅基地

技术标签: 微服务  Feign  

一 点睛

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

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

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

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

 

二 创建项目microservice-consumer-movie-feign

三 添加Feign依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.itmuch.cloud</groupId>
  <artifactId>microservice-consumer-movie-feign</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <!-- 引入spring boot的依赖 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.3.RELEASE</version>
  </parent>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <!--添加feign依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
  </dependencies>
  <!-- 引入spring cloud的依赖 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Camden.SR4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <!-- 添加spring-boot的maven插件 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

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

package com.itmuch.cloud.study.user.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.itmuch.cloud.study.user.entity.User;

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);
}

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

package com.itmuch.cloud.study.user.controller;

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;

import com.itmuch.cloud.study.user.entity.User;
import com.itmuch.cloud.study.user.feign.UserFeignClient;

@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.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class ConsumerMovieApplication {
  public static void main(String[] args) {
    SpringApplication.run(ConsumerMovieApplication.class, args);
  }
}

七 测试

1 启动eureka

2 启动2个user实例

3 启动feign

4 多次访问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=?

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chengqiuming/article/details/80713471

智能推荐

qemu-nbd使用教程_dcldz5007的博客-程序员宅基地

服务端服务器环境已经安装过qemu-img的32位[email protected]:~/laboratory$ uname -aLinux ubuntu-virtual-machine 3.13.0-46-generic #76-Ubuntu SMP Thu Feb 26 18:52:49 UTC 2015 i686 i686 i686 GN...

java之学习记录 1 - 1(java语言基础)_dear_Zzzx的博客-程序员宅基地

模块一记录一:初识计算机和java语言notepad++ 编写java默认编码格式是utf8 win终端默认是ANSI如果想用终端运行java代码 需将notepad++ 的编码格式改为ANSI。 须将默认语言改为javanotepad++ 编写java默认编码格式是utf8 win终端默认是ANSI如果想用终端运行java代码 需将notepad++ 的编码格式改为ANSI。 须将默认语言改为java创建以java为后缀的文件(起名HelloWorld.java)进行第一次编写 文件格式为

composer 报错 Could not find a matching version of package bower-asset/jquery_用户昵称不能为空的博客-程序员宅基地_could not find a matching version of package

报错内容composer require bower-asset/jquery 报错如下 Could not find a matching version of package bower-asset/jquery解决办法修改 composer.json,加入如下配置,指定地址"repositories": [ { "type": "composer", "url": "https://asset-packagist.org"

Java 理论和实践:线程池和工作队列_Defonds的博客-程序员宅基地

使用线程池以获取最佳资源利用率Java 多线程编程论坛中最常见的一个问题就是各种版本的 "我怎么样才可以创建一个线程池?" 几乎在每个服务器应用里,都会出现关于线程池和工作队列的问题。本文中,Brian Goetz 就线程池原理、基本实现和调优技术、需要避开的一些常见误区等方面进行共享。为何要用线程池?有很多服务器应用,比如 Web 服务器,数据库服务器,文件服务器,或者邮件服务器,都会面对处理大

使用idea 搭建一个 SpringBoot + Mybatis + logback 的maven 项目_dei5960的博客-程序员宅基地

(注意项目名不能有大写。。。。。。),把项目类型 改成 War 类型。(web项目)使用 mybatis-generator 插件 生成 实体类 和 接口在 resources 目录 中 新建一个 generatorConfig.xml 的文件generatorConfig.xml 文件信息 1 &lt;?xml version="1.0" enc...

随便推点

JavaScript闭包_dczjn9698的博客-程序员宅基地

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。Js代码  var n=999;  function f1(){     alert(n);   }  f1(); // 999另一方面,在函数外部自然无法读取...

RBO CBO 优化器 Oracle性能调优_zhuyufufu的博客-程序员宅基地

部分内容引自 Oracle优化器的优化方式和优化模式-性能调优http://www.cnblogs.com/sopost/archive/2010/12/21/2190066.html书 作者梁敬彬。 以前做过生产运行环境慢的问题定位与调优,记忆中影响最大的部分在Oracle数据库。 Oracle的种种问题会导致应用产生性能问题: 数据库服务器操作系...

七 Gazebo学习总结之传感器的添加_Return0623360的博客-程序员宅基地_gazebo传感器

本文展示的是使用者怎么直接通过Gazebo其他模型来创建复杂的模型,以及使用和标签来连接一个复杂模型的不同部分。1.增加一个激光器a.进入先前教程的模型目录中。cd ~/.gazebo/models/my_robotb.打开model.sdf文件。c.添加以下程序到文件末尾标签之前。 model://hokuyo 0.2 0 0.2 0 0 0 ho

angularjs将时间戳转换为时间_jiufreeman的博客-程序员宅基地

&amp;lt;input type=&quot;text&quot; ng-model=&quot;bdatetime&quot; value=&quot;{{bdatetime * 1000 | date:'dd-MM-yy'}}&quot; name=&quot;bdatetime&quot; id=&quot;datetimepicker&quot; required/&amp;gt;  参考: http://www.4byte.cn/question/120670/angularj

Android连接mysql_人语西风的博客-程序员宅基地_android 连接mysql

准备:mysql-connector-java驱动jar包,放在libs下即可(点击android或项目右侧的小三角可切换显示结构),如:数据库封装类(注意url用ip):package com.hsin.widgetslearn.storage.utils;import java.sql.*;import java.util.ArrayList;import java.util....

PLSQL中, 手动操作plsql工具,修改SELECT查询出的结果__明月的博客-程序员宅基地_plsql修改查询结果

student 表建表语句:-- 创建 student 表,用于学习测试. 2019/12/13 16:34CREATE TABLE student( stu_ID NUMBER(10) not null, stu_name VARCHAR2(32), stu_age NUMBER(4), stu_sex VAR...

推荐文章

热门文章

相关标签