spring cloud搭建(feign)

news2024/12/23 23:11:35

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

spring cloud搭建(Feign)

  • 一、Feign简介
  • 二、开发环境:
  • 三、Feign的应用
    • 1. 配置service1
      • 1.1 crud接口
      • 1.2 crud接口实现类
      • 1.3 请求控制
      • 1.4 postman调用测试
    • 2. 配置service2
      • 2.1 feign依赖
      • 2.2 接口创建
      • 2.3 请求控制类
      • 2.4 开启feign
      • 2.5 postman调用
    • 3. 拓展(feign传递对象参数的解决)


spring cloud 相关组件搭建(建议顺序):

  • eureka(注册中心服务)spring cloud搭建(eureka)
  • P-C service(服务提供者和服务调用者)spring cloud搭建(P-C service)
  • feign(接口调用)本篇
  • hystrix(熔断器)spring cloud搭建(hystrix)
  • zuul(网关服务)spring cloud搭建(zuul)

注:本篇基于前两篇编写


一、Feign简介

  • feign是一个轻量级RESTful的http服务客户端
  • feign是通过Java接口注解的方式调用请求,广泛应用在spring cloud中。

使用方法:
在调用者的服务中创建一个接口,并在接口上添加注解,即可调用其他服务中的接口。


二、开发环境:

JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.7.3 springboot搭建传送门spring cloud 版本为2021.0.5

以下均基于eureka和自己服务创建后的操作
具体请参考本文目录下的spring cloud搭建顺序的前两篇

三、Feign的应用

两个自己的服务,分别为service1和service2
将service1作为服务的被调用者(具体接口所在的服务)
将service2作为服务的调用者(feign的使用者,会去调用service1中的接口)

1. 配置service1

主要是接口的编写,这里只是测试feign功能的实现就没有用到数据库和具体代码,只写了CRUD的简单接口,返回都是字符串。
包结构如下,比之前新增了红框中的内容
在这里插入图片描述

1.1 crud接口

Service1Service.java

package com.service1.service;

/**
 * @ClassDescription: crud接口
 * @Author:李白
 * @Date:2023/5/31 17:04
 */
public interface Service1Service {
    String addInfo();
    String removeInfo();
    String changeInfo();
    String searchInfo();
}

1.2 crud接口实现类

Service1ServiceImpl.java
添加@Service注解

package com.service1.service.Impl;

import com.service1.service.Service1Service;
import org.springframework.stereotype.Service;

/**
 * @ClassDescription: crud接口实现类
 * @Author:李白
 * @Date:2023/5/31 17:05
 */
@Service
public class Service1ServiceImpl implements Service1Service {
    @Override
    public String addInfo() {
        return "add info success";
    }

    @Override
    public String removeInfo() {
        return "remove info success";
    }

    @Override
    public String changeInfo() {
        return "change info success";
    }

    @Override
    public String searchInfo() {
        return "search info success";
    }
}

1.3 请求控制

Service1Controller.java

package com.service1.controller;

import com.service1.service.Impl.Service1ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassDescription: crud请求控制类
 * @Author:李白
 * @Date:2023/5/31 17:07
 */
@RestController
@RequestMapping("/crud")
public class Service1Controller {

    @Autowired
    Service1ServiceImpl service1ServiceImpl;

    @PostMapping
    public String addInfo(){
        return service1ServiceImpl.addInfo();
    }

    @DeleteMapping
    public String remove(){
        return service1ServiceImpl.removeInfo();
    }

    @PutMapping
    public String change(){
        return service1ServiceImpl.changeInfo();
    }

    @GetMapping
    public String search(){
        return service1ServiceImpl.searchInfo();
    }

}

1.4 postman调用测试

启动service1,使用postman访问接口
(请求注解这里用到了RESTful API ,增POST删DELETE改UPDATE查GET)

http://localhost:8002/crud

如下图(使用不同的请求方式可以获取对应的结果)
在这里插入图片描述
这里测试了service1的接口没问题,能正常访问。

2. 配置service2

这里就是服务接口的调用者了,在service2中去调用service1中的接口
需要在service2的pom中配置feign所需的依赖
然后创建接口和请求控制类
包结构如下,多了一个接口和一个请求控制类
在这里插入图片描述
具体操作如下

2.1 feign依赖

在service2的pom中添加feign的依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.2 接口创建

Service2Service.java

package com.service2.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;


/**
 * @ClassDescription: 使用feign的接口 调用service1服务的接口
 * Feign的使用,在接口上加上@FeignClient注解,
 * 参数value为被调用接口所在的服务的实例名,这里即service1的配置文件中spring.application.name的值,
 * path的值为被调用接口的路由前缀,即接口类上的路由
 * 每个接口方法上的注解对应被调用接口的请求控制对用的注解
 * @Author:李白
 * @Date:2023/5/31 18:33
 */
@FeignClient(value = "Service1-app", path = "/crud")
public interface Service2Service {
    @PostMapping
    String addInfo();
    @DeleteMapping
    String removeInfo();
    @PutMapping
    String changeInfo();
    @GetMapping
    String searchInfo();
}

注:在接口上添加@FeignClient注解来使用这个组件进行接口调用
value的值为被调用服务的实例名,也就是它配置文件中的spring.application.name参数的值
path的值为被调用接口请求控制类上的路由前缀,这里指的就是crud
这里说的crud就是service1中的Service1Controller类上@RequestMapping括号里的值

2.3 请求控制类

Service2Controller.java

package com.service2.controller;

import com.service2.service.Service2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassDescription: 请求控制类(service2)
 * @Author:李白
 * @Date:2023/5/31 18:42
 */
@RestController
@RequestMapping("/caller")
public class Service2Controller {

    @Autowired
    Service2Service service2Service;

    @PostMapping
    public String addInfo(){
        return service2Service.addInfo();
    }

    @DeleteMapping
    public String remove(){
        return service2Service.removeInfo();
    }

    @PutMapping
    public String change(){
        return service2Service.changeInfo();
    }

    @GetMapping
    public String search(){
        return service2Service.searchInfo();
    }

}

2.4 开启feign

在service2的启动类上加@EnableFeignClients注解开启feign
启动类Service2Application.java

package com.service2;

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

/**
 * @ClassDescription: 服务2启动项
 * 注解@EnableFeignClients开启feign功能,也可以添加参数,basePackages的值可指定使用该功能的接口所在包,
 * 会对指定的包进行扫描包中带有feign注解的接口
 * @Author:李白
 * @Date:2023/5/31 14:51
 */
@EnableEurekaClient
@SpringBootApplication
//@EnableFeignClients(basePackages = "com.service2.service")
@EnableFeignClients
public class Service2Application {
    public static void main(String[] args) {
        SpringApplication.run(Service2Application.class, args);
    }
}

2.5 postman调用

依次启动eureka服务,service1服务,service2服务
使用postman进行接口调用

http://localhost:8003/caller

如下
在这里插入图片描述

3. 拓展(feign传递对象参数的解决)

对于远程调用的接口含有对象传参情况,有两种方式处理

  • 将对象拆分成多个简单类型参数,每个参数前加@RequestParam注解
  • 使用Map代替对象参数,Map前加@RequestParam注解

到此spring cloud整合feign功能就完成了,可以将其应用在需要的服务中。


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

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

相关文章

I.MX RT1170加密启动详解(2):HAB认证原理

文章目录 1 基础2 使能过程3 Boot flow 1 基础 HAB认证是基于RSA或ECDSA算法的公钥密码学&#xff0c;它用一系列的私钥对image进行加密&#xff0c;然后BootROM在上电后用对应的公钥验证加密的镜像是否被修改。这个密钥结构就是PKI(Public Key Infrastructure)树 (1)normal …

DTU助力气象行业数字化转型,让数据更智能

近年来&#xff0c;随着社会的不断发展&#xff0c;气象行业在现代社会中扮演着极为重要的角色。天气对于人们的日常生活、农业、交通运输等方方面面都有着深远的影响。然而&#xff0c;在数据采集与监测过程中&#xff0c;气象行业也面临着一些问题。不准确的数据、不稳定的传…

基于simulink仿真无人机比赛场景

一、前言 展示了如何使用虚拟碰撞传感器以交互方式控制仿真&#xff0c;以及如何使用 Simulink3D 动画更改虚拟世界对象的外观。该示例表示一个简单的无人机 &#xff08;UAV&#xff09; 挑战。无人机比赛场景基于2013年在法国图卢兹举行的IMAV飞行比赛。 穿越窗口 降落直升机…

java基于springboot+vue的在线教育课程作业网站n5138

本基于springboot的在线教育网站的设计与实现有管理员&#xff0c;教师和学生三个角色。管理员功能有个人中心&#xff0c;教师管理&#xff0c;科目管理&#xff0c;学生管理&#xff0c;课程信息管理&#xff0c;课程作业管理&#xff0c;学生作业管理&#xff0c;学生成绩管…

Ubuntu下让matplotlib显示中文字体

文章目录 安装中文字体显示matplotlib库的字体文件夹删除matplotlib 的缓存文件&#xff08;可选&#xff09; matplotlib中设置字体&#xff0c;显示&#xff01; 参考文章&#xff1a; https://zodiac911.github.io/blog/matplotlib-chinese.html Ubuntu下python的matplotli…

七篇深入理解机器学习和深度学习的读物推荐

在这篇文章中将介绍7篇机器学习和深度学习的论文或者图书出版物&#xff0c;这些内容都论文极大地影响了我对该领域的理解&#xff0c;如果你想深入了解机器学习的内容&#xff0c;哪么推荐阅读。 Attention Is All You Need 在自然语言处理和序列建模领域&#xff0c;Vaswani…

华为OD机试真题 Java 实现【水仙花数】【2022Q4 100分】

一、题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 1^3 5^3 3^3。 二、输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到…

chatgpt赋能python:Python教程:如何创建一个Rectangle类

Python教程&#xff1a;如何创建一个Rectangle类 Python是一种简单易学的编程语言&#xff0c;适用于各种应用场景。在本教程中&#xff0c;我们将探讨如何使用Python创建一个Rectangle类。Rectangle类是一个简单的图形类&#xff0c;用于描述长方形的特征&#xff0c;如宽度和…

双域多尺度融合深度神经网络的PPG生物特征识别研究

目录 前言概述研究背景PPG存在的问题本文的创新点数据处理数据预处理数据分割特征提取 模型结构LSTM网络多尺度特征提取模块双域注意模块识别与验证 实验部分数据集识别指标 前言 本文是根据一篇论文总结写的。 论文英文名为&#xff1a;Dual-domain and Multiscale Fusion D…

Redis底层学习(三)—存储类型-List篇

文章目录 特点具体服务器操作命令具体操作应用场景 特点 适⽤场景&#xff1a;消息队列。 它的特点就是内部元素有序、重复&#xff0c;并且插⼊和删除很快 O(1) &#xff0c;但是查找却很慢 O(n) 。功能⽀持队列和栈操作。 具体服务器操作命令 左侧插⼊元素&#xff1a; LP…

基于同步矩阵的多通道脑电功能连接分析_kaic

摘 要 本文研究了基于同步矩阵的多通道脑电功能连接分析方法&#xff0c;旨在揭示脑区之间的功能联系。首先&#xff0c;介绍了脑电信号的产生和特点&#xff0c;以及功能连接分析的概念和方法。其次&#xff0c;详细讨论了多通道脑电数据的采集和预处理流程&#xff0c;包括…

JAVA并发学习

1 基础准备 1.1 并发与并行 并发是不同的代码块交替执行&#xff0c;也就是交替可以做不同的事情。 并行是不同的代码块同时执行&#xff0c;也就是同时可以做不同的事情。 根据CPU 核数&#xff0c;线程运行是不同的 单核CPU&#xff08;微观串行&#xff0c;宏观并行&…

YOLOV5 + PYQT5双目测距(一)

YOLOV5 PYQT5双目测距 1. 测距源码2. 测距原理3. PYQT环境配置4. 实验结果4.1 界面1&#xff08;简洁版&#xff09;4.2 界面2&#xff08;改进版&#xff09; 1. 测距源码 详见文章 YOLOV5 双目测距&#xff08;python&#xff09; 2. 测距原理 如果想了解双目测距原理&a…

Stable Diffusion 指定模型人物,Lora 训练全流程

简介 在使用 Stable Diffusion 的时候&#xff0c;可以选择别人训练好的 Lora&#xff0c;那么如何训练自己的 Lora&#xff0c;本篇文章介绍了介绍了如何训练Lora&#xff0c;如何从训练的模型中选择好的模型&#xff0c;如何在 Stable Diffusion 中使用。 闲话不多说&#…

CUDA编程接口详解

CUDA编程接口详解 本文将详细介绍NVIDIA CUDA编程指南第3章&#xff08;编程接口&#xff09;中的核心概念&#xff0c;例如NVCC编译器、CUDA运行时、版本管理和兼容性、计算模式、模式切换以及Windows下的Tesla计算集群模式。以下是本文的大纲&#xff1a; 文章目录 CUDA编程…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 11 Dimensionality Reduction

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 11 Dimensionality Reduction Let M be a square matrix. Let λ be a constant and e a nonzero column vector with the same number of rows as M. Then λ is an eigenvalue of M and e is t…

快手三面全过了,却因为背调时leader手机号造假,导致offer作废了!

这是一个悲伤的故事&#xff1a; 快手本地三面全过了&#xff0c;但因为背调时leader手机号造假&#xff0c;导致offer作废了。 楼主感叹&#xff1a;大家背调填写信息时&#xff0c;一定要慎重再慎重&#xff0c;不要重复他的悲剧&#xff01; 网友愤慨&#xff0c;照这么说&a…

【Nginx 优化与防盗链】

目录 一、Nginx 服务优化1、配置Nginx 隐藏版本号2、修改用户与组3、缓存时间4、日志切割小知识 二、Nginx 深入优化1、连接超时2、更改进程数3、配置网页压缩4、配置防盗链 一、Nginx 服务优化 1、配置Nginx 隐藏版本号 可以使用 Fiddler 工具抓取数据包&#xff0c;查看 Ng…

UniApp全局弹窗

一、设计思路 1、创建一个弹窗页面组件 2、配置page.json&#xff0c;使页面跳转是在当前界面展示 3、定义uni全局全局属性 4、解决多个弹窗同时使用的冲突问题 注意&#xff1a;此方案不支持多个弹窗并存&#xff0c;有且仅有一个会展示&#xff0c;当前弹窗展示并关闭上一个弹…

连锁药店系统:如何提高效率和客户满意度?

连锁药店系统是一种用于提高效率和客户满意度的软件系统&#xff0c;它能够管理多个药店的日常营运。通过这种系统&#xff0c;药店可以更好地管理库存、员工、销售和客户信息等方面&#xff0c;从而提高整体的经营效率。 首先&#xff0c;连锁药店系统能够帮助药店管理库存。系…