SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)

news2024/9/22 13:42:45

文章目录

  • 前言
  • 正文
    • 一、项目结构
    • 二、服务调用链路说明
    • 三、Rpc调用链路说明
    • 四、项目代码
      • 4.1 client 模块中的feign接口
      • 4.2 client 中的rest接口
      • 4.3 client 中的启动类
      • 4.4 server中的rest接口
      • 4.5 server中的配置文件
    • 五、调试
  • 附录
    • 附1:本系列文章链接

前言

本篇是SpringCloud原理系列的 OpenFeign 模块的第一篇。主要内容是搭建一个极简的Spring Cloud OpenFeign 调用链路。

项目代码仓库地址:https://gitee.com/fengsoshuai/springcloud-openfeign-demo

正文

本次项目使用java 17,spring cloud 4.0.4,springboot 3.1.4。
maven 环境编译,idea开发。

一、项目结构

本次项目分为3个模块。
在这里插入图片描述
在这里插入图片描述

二、服务调用链路说明

在这里插入图片描述

  1. 使用IDEA/Postman/Apifox等工具进行触发client服务的接口
  2. client内部通过feign调用server接口
  3. server执行业务逻辑
  4. server返回执行结果到client
  5. client返回调用结果到触发方

三、Rpc调用链路说明

两个服务之间,使用远程调用。
基本都是需要URL,请求头,请求报文,请求方式(Get\Post 等)等基本信息的。
下图简单说明rpc调用时的链路。
在这里插入图片描述
其中,调用方,相当于发起远程调用的一方,对比本项目的话,相当于使用postman等工具触发后,client模块的操作。

只是特殊的一点在于,调用方中的红色虚线框内的部分,被openFeign 封装了,不再是我们手动去处理他们。而这也正是本系列研究的重点。

中间部分,就是形如 RestTemplate,WebClient的功能,只是发出请求,接受响应。

服务方,就是一个提供rest接口的普通应用。

四、项目代码

本文全部代码托管在gitte仓库中,地址已经在文章开头给出。
这里只粘贴出比较重要的几个文件。

4.1 client 模块中的feign接口

package org.feng.feigns;

import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * hello-feign客户端接口
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2023年11月20日 21时25分
 */
@FeignClient(name = "helloFeignClient", url = "http://localhost:10080")
public interface HelloFeignClient {

    @PostMapping("/hello/post")
    HelloResponse postHello(@RequestBody HelloRequest helloRequest);
}

4.2 client 中的rest接口

package org.feng.controller;

import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.feng.feigns.HelloFeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * HelloFeignClientController
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2023年11月20日 21时45分
 */
@Slf4j
@RestController
@RequestMapping("/helloclient")
public class HelloFeignClientController {

    @Resource
    private HelloFeignClient helloFeignClient;

    @PostMapping("/postHello")
    public HelloResponse postHello(@RequestBody HelloRequest helloRequest) {
        if(Objects.isNull(helloRequest.getLocalDateTime())){
            helloRequest.setLocalDateTime(LocalDateTime.now());
        }

        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String localAddr = request.getLocalAddr();
        int serverPort = request.getServerPort();
        helloRequest.setHost(localAddr);
        helloRequest.setPort(serverPort);

        log.info("helloRequest  {}", helloRequest);
        return helloFeignClient.postHello(helloRequest);
    }
}

4.3 client 中的启动类

指定扫描包为 org.feng.feigns

package org.feng;

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

@EnableFeignClients(basePackages = "org.feng.feigns")
@SpringBootApplication
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

}

4.4 server中的rest接口

package org.feng.controller;

import lombok.extern.slf4j.Slf4j;
import org.feng.common.dto.HelloRequest;
import org.feng.common.dto.HelloResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * openfeign 控制器
 *
 * @author feng
 */
@Slf4j
@RequestMapping("/hello")
@RestController
public class HelloOpenFeignController {

    @PostMapping("/post")
    public HelloResponse postHello(@RequestBody HelloRequest helloRequest) {
        log.info("request:{}", helloRequest);

        HelloResponse response = new HelloResponse();
        response.setTitle(helloRequest.getTitle());
        response.setLocalDateTime(helloRequest.getLocalDateTime());
        response.setFromHost(helloRequest.getHost());
        response.setFromPort(helloRequest.getPort());

        log.info("response: {}", response);
        return response;
    }
}


4.5 server中的配置文件

spring.application.name=openserver
server.port=10080

五、调试

启动server 和 client 服务。
在idea中触发client 的服务:

POST http://localhost:8080/helloclient/postHello
Content-Type: application/json

{
  "title": "托尔斯泰"
}

响应报文如下:

{
  "fromHost": "127.0.0.1",
  "fromPort": 8080,
  "title": "托尔斯泰",
  "localDateTime": "2023-11-21T14:07:18.537384"
}

server中的服务,打印出来的日志如下:
在这里插入图片描述
以上就是通过onepfeign 进行rpc 调用的完整示例了。

可以看到,我们只在client中定义了接口,并没有实现。但是在调用时,没有报错,同时也调用到了server服务。而这,就是spring cloud 中的 openfeign 封装了远程调用,帮我们处理的部分,也是我们后续研究其原理的核心部分。

附录

附1:本系列文章链接

SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)
SpringCloud原理-OpenFeign篇(二、OpenFeign包扫描和FeignClient的注册原理)
SpringCloud原理-OpenFeign篇(三、FeignClient的动态代理原理)

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

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

相关文章

springBoot整合quartz定时任务

声明 Quartz是一种基于java实现的任务调度框架,可以定时自动的执行你想要执行的任何任务。 官网:quartz官网 利用Quartz的定时任务技术可以应用于许多不同的场景,帮助我们实现定时执行任务、数据清理、缓存刷新、邮件发送、数据备份、系统监…

pytest-base-url插件之配置可选的项目系统URL

前言 ①当我们的自动化代码完成之后,通常期望可以在不同的环境进行测试,此时可以将项目系统的URL单独拿出来,并且可以通过pytest.ini配置文件和支持pytest命令行方式执行。 ② pytest-base-url 是一个简单的pytest插件,它通过命…

uniapp - 开关按钮

目录 1.运行代码如下&#xff1a; 2.运行效果 3.switch属性 1.运行代码如下&#xff1a; <template><view class"switchBox"><switch change"switchChange" color"#F21177" :checked"form.checked" /></view&…

【人生苦短,我学 Python】(1)初识 Python

目录 1. 简述2. 什么是 Python&#xff1f;3. 面向对象简述3.1 面向过程3.2 面向对象3.3 面向对象的主要优点3.4 面向对象的基本概念3.5 面向对象程序设计 4. Python语言的版本和解释器5. Python 编程工具6. Python 的三种编程方式7. 简单的 Python 程序8. 高级一点的 Python 程…

HashMap知识点总结

文章目录 HashMapConcurrentHashMap线程安全问题 HashMap 1、null作为key只能有一个&#xff0c;作为value可以有多个 2、容量&#xff1a; 1.7&#xff1a;默认161.8&#xff1a;初始化并未指定容量大小&#xff0c;第一次put才初始化容量 3、负载因子 默认0.75&#xff0…

LeetCode算法心得——爬楼梯(记忆化搜索+dp)

大家好&#xff0c;我是晴天学长&#xff0c;第二个记忆化搜索练习&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1&#xff09;爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或…

目标检测原理

一、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定他们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状、姿态&#xff0c;再加上光照、遮挡等因素的干扰&#xff0c;目…

枚举 蓝桥oj 小蓝和小桥的挑战

题目 分析 用一个postiveSum记录所有正数的和&#xff0c;一个negativeSum记录所有负数的和&#xff0c;一个zeroNums记录0的数量&#xff0c;count表示加1的数量 所有的0必须算在加1的数量里面&#xff0c;否则积必然为0 将所有0加1后加入positiveSum中&#xff0c;再比较正数…

基于springboot实现在线外卖平台系统项目【项目源码】

基于springboot实现在线外卖平台管理系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的…

使用hping3和wrk模拟泛洪

一、hping3 1、syn随机ip泛洪 hping3 --flood -S --rand-source -p 端口 目标ip hping3 -c 10000 -d 120 -S -p 80 --flood --rand-source 192.168.112.130​说明&#xff1a; -c 100000 packets 发送的数量 -d 120 packet的大小 -S 只发送syn packets -p 80 目标端口&am…

前端js调取摄像头并实现拍照功能

前言 最近接到的一个需求十分有意思&#xff0c;设计整体实现了前端仿 微信扫一扫 的功能。整理了一下思路&#xff0c;做一个分享。 tips: 如果想要实现完整扫一扫的功能&#xff0c;你需要掌握一些前置知识&#xff0c;这次我们先讲如何实现拍照并且保存的功能。 一. windo…

Redis篇---第十四篇

系列文章目录 文章目录 系列文章目录前言一、为什么Redis的操作是原子性的,怎么保证原子性的?二、了解Redis的事务吗?四、Redis 的数据类型及使用场景前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

windows11记事本应用程序无法打开,未响应,崩溃,卡死

windows11记事本应用程序无法打开&#xff0c;未响应&#xff0c;崩溃&#xff0c;卡死 文章目录 问题描述搜索引擎&#xff08;度娘&#xff09;卸载后如何安装问题未解决另一个解决方案&#xff1a;步骤&#xff1a;1.设置 → 语音和区域 → 输入2.选择“高级键盘设置”3.替…

计数排序java实现

计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数&#xff0c;其中k为某个整数&#xff0c;当kO(n)时&#xff0c;排序的运行时间为θ(n)。 计数排序的基本思想是&#xff1a;对每一个输入元素x&#xff0c;确定小于x的元素个数。利用这一信息&#xff0c;就可以直…

LeetCode:2304. 网格中的最小路径代价(C++)

目录 2304. 网格中的最小路径代价 题目描述&#xff1a; 实现代码&#xff1a; dp&#xff08;dp有很多相似的经典题目&#xff0c;比较简单&#xff0c;不再给出解析&#xff09; 2304. 网格中的最小路径代价 题目描述&#xff1a; 给你一个下标从 0 开始的整数矩阵 grid …

神经网络常用激活函数详解

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

C++:AVL树(平衡二叉树)

引言&#xff1a; AVL树是一种特殊的二叉搜索树&#xff0c;二叉搜索树虽然可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Ade…

揭秘成都瀚网科技有限公司:抖音带货是否靠谱?

随着抖音等短视频平台的兴起&#xff0c;越来越多的商家和网红开始利用这些平台进行带货销售。这其中&#xff0c;成都瀚网科技有限公司&#xff08;以下简称瀚网科技&#xff09;也宣称能够在抖音等平台上实现带货销售&#xff0c;那么这家公司是否靠谱呢&#xff1f;本文将为…

外贸自建站的指南?新手如何玩转海洋建站?

外贸自建站工具有哪些&#xff1f;外贸新手怎么搭建独立网站&#xff1f; 拥有自己的外贸网站是提高企业国际竞争力和扩大市场份额的有效途径。然而&#xff0c;许多企业在外贸自建站的过程中感到困惑。海洋建站将为您提供一份详细的外贸自建站指南&#xff0c;助您轻松打造一…

数据库实验二 数据库表的数据插入、修改、删除操作

数据库实验二 数据库表的数据插入、修改、删除操作 一、实验目的二、设计性实验三、观察与思考 一、实验目的 1&#xff0e;掌握MySQL数据库表的数据插入、修改、删除操作SQL语法格式 2&#xff0e;掌握数据表的数据的录入、增加和删除的方法 二、设计性实验 某超市的食品管…