SpringCloud-OpenFeign案例实战

news2024/11/26 0:26:03

关于Spring Cloud Open Feign的介绍可以参考这两篇博客
OpenFeign服务接口调用
使用Feign作为服务消费者
本博客参考gitee开源项目代码,结合自己的理解,记录下微服务场景下的使用。Talk is cheap. Show me the code!

一、项目结构

这里使用eureka作为注册中心,,person和equipment两个web服务作为业务中台,本例中会使用postman调用person服务,person服务中调用equipment服务。

registry -- 注册中心(当前采用eureka)
person -- 人员服务
 person-api -- 人员相关api提供, 包括 req, resp, service 等
 person-biz -- 人员相关服务接口具体实现, 依赖person-api
 person-provider -- 人员相关微服务启动类, 依赖person-biz
equipment -- 设备服务
 equipment-api -- 设备相关api提供, 包括 req, resp, service 等
 equipment-biz -- 设备相关服务接口具体实现, 依赖equipment-api
 equipment-provider -- 设备相关微服务启动类, 依赖equipment-biz

在这里插入图片描述
源码下载地址,欢迎star!
springboot-openfeign

二、registry – 注册中心(当前采用eureka)

1、application.yml

server:
  port: 8001  # 该服务端口

eureka:
  instance:
    hostname: registry  # eureka的实例名称
  client:
    registerWithEureka: false  # false表示当前项目不以客户端注册到服务中心(因为该项目本身就是注册中心)
    fetchRegistry: false  # false表示当前项目不需要从注册中心拉取服务配置(因为该项目本身就是注册中心)
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/

spring:
  application:
    name: server-registy  # 当前项目的实例名称(很重要)

2、核心pom.xml

<!-- 引入eureka-server依赖  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

        <!-- gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.6.2</version>
        </dependency>

3、主启动类RegistryApplication

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

三、person – 人员服务

1、application.yml

server:
  port: 8002

spring:
  application:
    name: person-provider

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/

feign:
 httpclient:
  enabled: true

2、核心pom.xml

cloud-person-provider

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.2.1.RELEASE</version>
</dependency>

cloud-person-biz

        <!-- 使用web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <!-- person-api -->
        <dependency>
            <groupId>tca</groupId>
            <artifactId>cloud-person-api</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!-- equipment-api -->
        <dependency>
            <groupId>tca</groupId>
            <artifactId>cloud-equipment-api</artifactId>
            <version>1.0.0</version>
        </dependency>

cloud-person-api

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

3、PersonFeign和PersonController

@FeignClient(value = "person-provider")
public interface PersonFeign {
    /**
     * 根据id获取人员
     * @param personReq
     * @return
     */
    @PostMapping("/person/get")
    PersonResp get(PersonReq personReq);
}

@RestController
@RequestMapping(value = "/person")
@Slf4j
public class PersonController {

    @Autowired
    private EquipmentFeign equipmentFeign;

    /**
     * 获取人员
     * @param personReq
     * @return
     */
    @PostMapping("/get")
    public PersonResp get(@Validated @RequestBody PersonReq personReq) {
        PersonResp personResp = new PersonResp();
        personResp.setId(personReq.getId());
        personResp.setAge(30);
        personResp.setName("Messi");

        EquipmentReq equipmentReq = new EquipmentReq();
        equipmentReq.setId(personReq.getId());
        EquipmentResp equipmentResp = equipmentFeign.get(equipmentReq);
        log.info("equipmentResp = {}", equipmentResp);
        return personResp;
    }
}

4、项目结构

在这里插入图片描述

四、equipment – 设备服务

1、application.yml

server:
  port: 8003

spring:
  application:
    name: equipment-provider

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/

2、核心pom.xml

cloud-equipment-api

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

cloud-equipment-biz

<!-- 使用web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <!-- equipment-api -->
        <dependency>
            <groupId>tca</groupId>
            <artifactId>cloud-equipment-api</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!-- person-api -->
        <dependency>
            <groupId>tca</groupId>
            <artifactId>cloud-person-api</artifactId>
            <version>1.0.0</version>
        </dependency>

cloud-equipment-provider

       <dependency>
            <groupId>tca</groupId>
            <artifactId>cloud-equipment-biz</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

3、EquipmentFeign和EquipmentController

@FeignClient(value = "equipment-provider")
public interface EquipmentFeign {

    /**
     * 根据id获取人员
     * @param equipmentReq
     * @return
     */
    @PostMapping("/equipment/get")
    EquipmentResp get(EquipmentReq equipmentReq);
}
@RestController
@RequestMapping(value = "/equipment")
@Slf4j
public class EquipmentController {

    @Autowired
    private PersonFeign personFeign;

    /**
     * 获取人员
     * @param equipmentReq
     * @return
     */
    @PostMapping("/get")
    public EquipmentResp get(@Validated @RequestBody EquipmentReq equipmentReq) {
        EquipmentResp equipmentResp = new EquipmentResp();
        equipmentResp.setId(equipmentReq.getId());
        equipmentResp.setName("平板设备");
        return equipmentResp;
    }
}

4、项目结构

在这里插入图片描述

五、测试

分别启动这三个服务,
在这里插入图片描述
利用postman访问localhost:8002/person/get,其中body中id传不同参数进行测试
在这里插入图片描述
在这里插入图片描述
可以发现能够通过openfeign在微服务之间进行接口调用!

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

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

相关文章

FJUT第17届校赛题解

致歉 由于出题人经验不足&#xff0c;给大家带来不好的体验&#xff0c;实在抱歉。在赛中忘记开答疑&#xff0c;发不了公告&#xff0c;发现的问题已经在尽量修补。出现的问题如下&#xff08;均修复&#xff09;&#xff1a; 1.薛薛的简单数学题&#xff0c;没写spj&#xf…

【Python从入门到进阶】18、文件内容序列化和反序列化操作

接上篇《17、文件的读写操作》 上一篇我们学习了Python文件对象包含哪些方法&#xff0c;并学习了文件如何进行读、写、定位和删除。本篇我们来学习文件读取及写入数据序列化和反序列化的操作。 一、什么是序列化和反序列化 通过文件操作&#xff0c;我们可以将字符串写入到一…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_8.7p1(亲测无问题,建议收藏)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 文章声明前述安装一些必要的命令&…

MySQL数据库学习(进阶篇)

1.存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层家口主要完成大多数的核心服务功能&#xff0c;如SQL接口…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

Java8新特性—Stream API

前言 Java 8引入了Stream API&#xff0c;这是一种新的API&#xff0c;可让开发人员更轻松地处理集合数据。 Stream API提供了丰富的操作&#xff0c;如过滤、映射、排序和规约。下面将对Stream API的基本语法、使用场景和示例进行介绍。 基本语法 Stream API是Java 8中处理…

玄子Share- Maven 3 安装配置教程(含安装包)

玄子Share- Maven 3 安装配置教程&#xff08;含安装包&#xff09; 下载 下载链接 官网 https://maven.apache.org/index.html 下载教程 进入 Maven 官网&#xff0c;点击左侧导航栏&#xff0c;Download下载。 下方选择安装类型&#xff0c;选择.zip后缀文件&#xff0c…

Linux系统通过Docker安装Elasticsearch、部署kibana

Docker安装和基本操作 一、安装Elasticsearch 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.拉取 docker pull elasticsearch:7.12.11.3.运行 运行docker命令…

8-3分治

引入 分治算法&#xff08;divide and conquer&#xff09;是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一。其实&#xff0c;很多人在平时学习中已经不知不觉就用到了分治算法&#xff0c;只是不知道那就是分治算法&#xff0c;今天&#xff0c;…

Word Embedding

One-hot-encoding 缺点 1.向量维度和向量个数很大&#xff0c;假设有1w个token的话&#xff0c;向量个数和维度就都是1w 2. 语义相近的词的向量并不相似 Word Embedding 核心思想&#xff1a;可以通过上下文理解单词的语义 predection-based方法 使用前一个单词预测下一个…

【前端】1、flex 布局详解

flex 布局目录 一、flex container 和 flex items二、用在 flex container 上的 CSS 属性(1) flex-direction(2) justify-content(3) align-items(4) flex-wrap(5) flex-flow(6) align-content 三、用在 flex items 上的 CSS 属性(1) order&#xff08;顺序&#xff09;(2) ali…

【Linux】Linux下的基本指令

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 人生就是这样&#xff0c;要耐的住寂寞&#xff0c;才守得住繁华。 —— 七堇年 目录 Linux的基本命令(常用)&#xff1a; ls 指令&#xff1a; pwd指…

告别混乱代码,这份 SpringBoot 后端接口规范太及时了

告别混乱代码&#xff0c;这份 SpringBoot 后端接口规范太及时了&#xff01; 文章目录 一、前言 二、环境说明 三、参数校验 1、介绍2、Validator 自动抛出异常&#xff08;使用&#xff09;3、分组校验和递归校验4、自定义校验 四、全局异常处理 1、基本使用2、自定义…

【Android入门到项目实战-- 9.4】—— 方向传感器的详细使用教程

目录 一、基础知识 二、实战使用 一、基础知识 Android的方向传感器&#xff0c;返回三轴的角度数据&#xff0c;方向数据的单位是角度。 提供三个数据&#xff1a;azimuth、pitch和roll。 azimuth&#xff1a;方位&#xff0c;返回水平时磁北极和Y轴的夹角&#xff0c;范围是…

Qt绘图(好玩)

release下的exe文件流畅度要远好于debug下的exe文件。 源码来源&#xff1a;基于Qt5模拟企业微信聊天界面(QWidget)_阿木大叔mu的博客-CSDN博客 初看时&#xff0c;觉得很神奇&#xff0c;猫眼会随着鼠标移动。 看完源码后&#xff0c;感觉很精美。 全是用painter画上去的&…

09_Uboot启动流程_1

目录 链接脚本u-boot.lds详解 U-Boot启动流程详解 reset函数源码详解 lowlevel_init函数详解 s_init函数详解 链接脚本u-boot.lds详解 要分析uboot的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入…

【射影几何08】仿射映射

一、说明 简单来说&#xff0c;“仿射变换”就是&#xff1a;“线性变换”“平移”&#xff0c;但这是在笛卡尔坐标下的表现&#xff0c;然而在射影几何中&#xff0c;其中有更合乎逻辑的解释。本文讲仿射映射的定义&#xff0c;以及仿射不变性的特点。 二、仿射映射 2.1 直线…

2022 年全国硕士研究生入学统一考试英语(二)试题

2022年全国硕士研究生入学统一考试英语&#xff08;二&#xff09;试题 SectionⅠUse of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Harlan Coben believes tha…

ChatGPT诞生的新岗位:提示工程师(Prompt Engineer)

ChatGPT诞生的新岗位&#xff1a;提示工程师&#xff08;Prompt Engineer&#xff09; Prompt 工程师是什么? 是识别人工智能的错误和隐藏功能&#xff0c;以便开发者可以对这些发现进行处理。 如果你正在寻找科技领域最热门的工作&#xff0c;你可以尝试了解如何与AI聊天机…

分布式文件存储系统Minio使用总结

分布式文件存储系统Minio使用总结 1.分布式文件系统应用: 1.1、Minlo 介绍&#xff1a; Minlo 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、…