Spring Cloud 之 Feign 简介及简单DEMO的搭建

news2025/1/15 6:47:45

Feign简介:

Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验。
Feign是在RestTemplate基础上封装的,使用注解的方式来声明一组与服务提供者Rest接口所对应的本地Java API接口方法。
Feign将远程Rest接口抽象成一个声明式的FeignClient(Java API)客户端,并且负责完成FeignClient客户端和服务提供方的Rest接口绑定。

整体目录:
在这里插入图片描述

feignconsumer消费方代码:

为了让Feign知道在调用方法时应该向哪个地址发请求以及请求需要带哪些参数,我们需要定义一个接口,Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。生成代理时Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,Feign的模板化就体现在这里.

UserClient:

package com.tt.consumer.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 有关消费者client,配置需要调用服务者的名字
 */
@FeignClient(name = "tt-sc-feign-provide") //对应的要调用提供者服务名spring.application.name
public interface UserClient {

    /**
     * 通过用户id获取用户
     * @param userId
     * @return
     */
    @GetMapping("/user/getUser/{userId}")//对应要调用提供者的controller
    String getUser(@PathVariable("userId") String userId);
}

FeignConsumerController

package com.tt.consumer.controller;

import com.tt.consumer.client.UserClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 平台controller业务逻辑,引入client出发消费者调用提供者
 */
@Api(tags = "用户模块")
@RestController
@RequestMapping("user")
public class FeignConsumerController {

    @Value("${server.port}")
    private String port;

    @Resource
    private UserClient userClient;

    /**
     * 通过用户ID获取用户
     * @param userId
     * @return
     */
    @ApiOperation(value = "根据用户ID查询用户")
    @GetMapping("/getUserInfo/{userId}")
    public String getUserInfo(@PathVariable("userId") String userId){

        String user = userClient.getUser(userId);
        return String.format("【%s-Demo消费者】:调用Feign接口返回值 %s", port, user);
    }

}

NacosFeignConsumerApplication

package com.tt.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
 * 代表自己是一个服务消费者
 */
@SpringBootApplication
//声明此服务可作为消费者使用,配置feign客户端目录
@EnableFeignClients(basePackages = "com.tt.consumer.client")
public class NacosFeignConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosFeignConsumerApplication.class, args);
    }
}

application-dev.yml未配置信息,bootstrap.yml如下:

server:
  port: 8083
spring:
  profiles:
    active: dev
  application:
    name: tt-sc-feign-consumer
  cloud:
    nacos:
      username: nacos
      password: nacos
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
      discovery:
        server-addr: 127.0.0.1:8848

pom.xml

<?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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>feignconsumer</artifactId>
<dependencies>
    <!-- 引入SpringCloud的Nacos server依赖 -->
    <!--服务发现pom-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>

    <!-- feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
   <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>1.5.20</version>
        <scope>compile</scope>
    </dependency>

</dependencies>

</project>

feignprovide提供方代码

NacosFeignProvideApplication

package com.tt.feignprovide;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * 服务提供方-供feignclient使用
 **/
@EnableDiscoveryClient
@SpringBootApplication
public class NacosFeignProvideApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosFeignProvideApplication.class, args);
    }

}

UserProvideController

package com.tt.feignprovide.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "用户模块")
@RestController
@RequestMapping("user")
public class UserProvideController {

    @Value("${server.port}")
    private String port;

    /**
     * 通过用户ID获取用户
     * @param userId
     * @return
     */
    @ApiOperation(value = "根据用户ID查询用户")
    @GetMapping("/getUser/{userId}")
    public String getUser(@PathVariable("userId") String userId){

        return String.format("【%s-服务提供者】:%s", port, userId);
    }


}

application-dev.yml未配置信息,bootstrap.yml如下:

server:
  port: 8082
spring:
  profiles:
    active: dev
  application:
    name: tt-sc-feign-provide
  cloud:
    nacos:
      username: nacos
      password: nacos
      config:
        server-addr: 192.168.10.107:8848
        file-extension: yml
      discovery:
        server-addr: 192.168.10.107:8848

pom.xml

<?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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
<!--    <packaging>pom</packaging>-->
    <artifactId>feignprovide</artifactId>
    <dependencies>
        <!-- nacos 客户端 作为 注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.3.RELEASE</version>
        </dependency>
        <!-- nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.3.RELEASE</version>
        </dependency>
        <!-- feign 调用服务接口 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.20</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

父类pom.xml

<?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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>common</module>
        <module>manage</module>
        <module>tt-sc-generator</module>
        <module>feignprovide</module>
        <module>feignconsumer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
<!--        <version>2.1.8.RELEASE</version>-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring.boot.version>2.3.3.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
        <spring.cloud.sleuth.version>2.2.3.RELEASE</spring.cloud.sleuth.version>
        <swagger2.version>2.9.2</swagger2.version>
        <swagger-models.version>1.6.0</swagger-models.version>
        <swagger-annotations.version>1.6.0</swagger-annotations.version>
        <druid.starter.vsersion>1.1.21</druid.starter.vsersion>
        <commons.lang.version>2.4</commons.lang.version>
        <commons.lang3.version>3.7</commons.lang3.version>
        <commons.collections.version>3.2.1</commons.collections.version>
        <commons.io.version>2.6</commons.io.version>
        <spring.cloud.alibaba.version>2.1.2.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

测试结果:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…

微信小程序3

一、flex布局 布局的传统解决方案&#xff0c;基于[盒状模型]&#xff0c;依赖display属性 position属性 float属性 1、什么是flex布局&#xff1f; Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以…

同为科技(TOWE)工业用插头插座与连接器产品大全

TOWE IPS系列工业标准插头插座、连接器系列产品 随着国内经济快速的发展&#xff0c;人们生活水平的不断提高&#xff0c;基础设施的建设是发展的基础&#xff0c;完善的基础设施对加速经济的发展起到至关重要的作用。其中&#xff0c;基础建设中机场、港口、电力、通讯等公共…

GLEIF携手TrustAsia,共促数字邮件证书的信任与透明度升级

TrustAsia首次发布嵌入LEI的S/MIME证书&#xff0c;用于验证法定实体相关的电子邮件账户的真实与完整性 2023年10月&#xff0c;全球法人识别编码基金会&#xff08;GLEIF&#xff09;与证书颁发机构&#xff08;CA&#xff09;TrustAsia通力合作&#xff0c;双方就促进LEI在数…

基础课5——语音合成技术

TTS是语音合成技术的简称&#xff0c;也称为文语转换或语音到文本。它是指将文本转换为语音信号&#xff0c;并通过语音合成器生成可听的语音。TTS技术可以用于多种应用&#xff0c;例如智能语音助手、语音邮件、语音新闻、有声读物等。 TTS技术通常包括以下步骤&#xff1a; …

医学大数据分析 - 心血管疾病分析 计算机竞赛

文章目录 1 前言1 课题背景2 数据处理3 数据可视化4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的心血管疾病分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9…

什么牌子的电容笔性价比高?电容笔牌子排行

在科技进步的同时&#xff0c;各种类型的电容笔也在国内的市场上涌现。一支好用的电容笔&#xff0c;不仅能让我们在学习上有很大的提高&#xff0c;而且还能让我们的工作效率大大提高。国产平替电容笔&#xff0c;在技术和品质上&#xff0c;都有很大的改进余地&#xff0c;起…

如何才能拥有大量的虾皮印尼买家号?

注册虾皮印尼买家号还是比较简单的&#xff0c;直接打开shopee印尼官网&#xff0c;点击注册&#xff0c;输入手机号&#xff0c;接收短信&#xff0c;然后再设置一个密码就可以了。 如果想要注册多个虾皮买家号&#xff0c;那么要借助软件操作才可以&#xff0c;比如shopee买家…

本地项目打jar包依赖并上传到maven仓库

一、 打jar包依赖 先去掉启动类pom中添加如下的maven打包插件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><c…

RN:报错info Opening flipper://null/React?device=React%20Native

背景 在 ios 上使用 debug 模式的时候&#xff0c;报错&#xff1a;info Opening flipper://null/React?deviceReact%20Native&#xff0c;我找到了这个 issue 其实也可以看到现在打开 debug&#xff0c;是 open debug&#xff0c;也不是之前的 debug for chrome 了&#xf…

【Arduino TFT】 记录使用DMA优化TFT屏帧率

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

软件外包开发设计文档

编写软件设计文档是项目开发过程中的关键步骤&#xff0c;它有助于明确系统的设计和架构&#xff0c;并为开发人员提供指导。以下是编写软件设计文档的一般步骤和建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;…

Python中Scrapy框架搭建ip代理池教程

在网络爬虫开发中&#xff0c;使用代理IP池可以提高爬取效率和匿名性&#xff0c;避免被目标网站封禁IP。本文将介绍如何使用Python中的Scrapy框架搭建IP代理池&#xff0c;并提供代码实例&#xff0c;帮助您快速搭建一个稳定可靠的代理池。 Python中Scrapy框架搭建ip代理池教程…

Excel·VBA制作工资条

看到一篇博客《excel表头_Excel工资表怎么做&#xff1f;3分钟学会利用函数生成工资表》&#xff0c;使用排序功能、函数制作工资条。但如果需要经常制作工资条&#xff0c;显然使用VBA更加方便 VBA制作工资条 Sub 制作工资条()Dim title_row&, blank_row&, ws_new$,…

变电站数字孪生3D可视化运维系统,实现电力行业智慧化数字化信息化转型升级

变电站数字孪生3D可视化运维系统&#xff0c;实现电力行业智慧化数字化信息化转型升级。近年来&#xff0c;随着科技不断发展与进步&#xff0c;我国在智慧电网国网电力建设方面取得了长足进展。目前已经在多个地区和国家建立起了智慧电网电力项目并投入运行&#xff0c;这些项…

Ask Milvus Anything!聊聊被社区反复@的那些事儿ⅠⅠ

在上月的 “Ask Milvus” 专题直播中&#xff0c;我们为大家带来了 Backup 的技术解读&#xff0c;收到了社区成员很多积极的反馈。本期直播&#xff0c;我们将继续为大家带来社区呼声很高的 “Birdwatcher” 和 “Range Search” 两项功能的技术解读。 BirdWatcher 作为 Milvu…

Go语言入门心法(八): mysql驱动安装报错onnection failed

一: go语言安装mysql驱动报错 安装最新版mysql驱动&#xff1a; PS D:\program_file\go_workspace> go install github.com/go-sql-driver/mysqllatest 报错信息&#xff1a; go: github.com/go-sql-driver/mysqllatest: module github.com/go-sql-driver/mysql: Get "…

如何转换Corona和Vray材质?cr材质转vr材质的方法

cr材质转vr材质的方法一&#xff1a;使用CG Magic插件&#xff0c;一键转换 CG Magic是一款基于3ds Max深度开发的智能化辅助插件&#xff0c;上千项实用功能&#xff0c;降低渲染时长&#xff0c;节省时间和精力&#xff0c;大幅简化工作流程&#xff0c;助力高效完成创作。 …

Nessus已激活,New Scan按钮不可点击

刷新后会给出下面的提示 Plugins are compiling. Nessus will be limited until compilation is complete. 因为插件编译中&#xff0c;所以扫描功能被禁用了。 查看编辑进度&#xff0c;鼠标放到两个循环箭头上即可查看。

中运宝APP:光伏能源——绿色投资的未来之星

光伏能源概念股&#xff0c;即在资本市场中与光伏能源产业相关的股票。随着全球对可再生能源的关注度不断提高&#xff0c;光伏能源概念股也逐渐受到投资者的热捧。中运宝APP将深入探讨光伏能源概念股的相关信息&#xff0c;以期帮助投资者更好地了解这一领域的投资潜力。 光伏…