微服务之服务间通信:关于Feign的练习demo

news2025/1/17 4:40:32

一、主要流程:

  1. 创建两个最基础的springboot项目
  2. 调用方引入Feign的依赖
  3. 在调用方服务项目中创建agent接口类,类使用@FeignClient注解,注解重点配置url(即被调用方服务所在的地址ip端口号)、写接口方法等。
  4. 在具体业务代码中注入agent类,使用接口方法。

二、具体代码实现

2.1、第一个服务:Player

我这player属于被调用方,只是最简单的一个springBoot服务demo。

application

平平无奇的启动类,呵呵

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

pojo

public class PlayerVO {
    private List<String> players;

    public List<String> getPlayers() {
        return players;
    }

    public void setPlayers(List<String> players) {
        this.players = players;
    }
}

controller

就一个方法,记住url路径,后续等着另一个微服务远程调用

@RestController
@RequestMapping("/player")
public class Controller {

    public Controller(PlayerService playerService) {
        this.playerService = playerService;
    }

    private PlayerService playerService;

    @GetMapping("/list")
    public PlayerVO getPlayers() {
        return playerService.getPlayers();
    }
}

service

public interface PlayerService {

    /**
     * 查询阵容
     * @return player
     */
    PlayerVO getPlayers();
}

没写持久层,练习Feign嘛,简单点

@Service
public class PlayerServiceImpl implements PlayerService {

    @Override
    public PlayerVO getPlayers() {
        PlayerVO playerVO = new PlayerVO();
        playerVO.setPlayers(new ArrayList<>(Arrays.asList("kobe", "james")));
        return playerVO;
    }
}

application.yml

超简单配置

server:
  port: 8083

spring:
  application:
    name: nba-player

依赖(我这服务springboot版本是2.5.11,因为不注意这些可能会和feign依赖有版本不兼容问题)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.11</version>
</dependency>

2.2、第二个服务:Team

 

这里是调用方,好好注意细节

新增openfeign依赖(feign我用的3.0.3版本)


<!-- Spring Cloud Starter OpenFeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>3.0.3</version>
</dependency>

application

启动类上多了一个注解,顾名思义是开启支持这个远程调用。

@SpringBootApplication
@ComponentScan(basePackages = {"com.loong.nba"})
@EnableFeignClients
public class TeamApplication {

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

pojo

public class PlayerVO {
    private List<String> players;

    public List<String> getPlayers() {
        return players;
    }

    public void setPlayers(List<String> players) {
        this.players = players;
    }
}
public class TeamVO {
    private String team;
    private PlayerVO players;

    public PlayerVO getPlayers() {
        return players;
    }

    public void setPlayers(PlayerVO players) {
        this.players = players;
    }

    public String getTeam() {
        return team;
    }

    public void setTeam(String team) {
        this.team = team;
    }
}

controller

平平无奇

@RestController
@RequestMapping("/team")
public class Controller {

    public Controller(TeamService teamService) {
        this.teamService = teamService;
    }

    private TeamService teamService;

    @GetMapping("/list")
    public TeamVO getTeams() {
        return teamService.getTeams();
    }
}

agent

重点:注意要调用别的服务的话,需要在自己服务里面创建一个接口类,这个接口类上面用@FeignClient注解,可配置的参数很多,但这我们重点关注必不可少的url(这个只是别名,在后面配置文件里面有具体值映射过来)

@FeignClient(name = "nba-player",primary = false, url = "${player.api.addr}")
public interface PlayerAgent {

    @GetMapping("/list")
    PlayerVO getPlayers();

}

service

public interface TeamService {

    /**
     * 查询队伍名
     * @return TeamVO
     */
    TeamVO getTeams();
}

使用的时候,像注入普通业务代码一样,将agent接口类注入进来,正常使用即可。


@Service
public class TeamServiceImpl implements TeamService {

    public TeamServiceImpl(PlayerAgent playerAgent) {
        this.playerAgent = playerAgent;
    }

    private final PlayerAgent playerAgent;

    @Override
    public TeamVO getTeams() {
        TeamVO teamVO = new TeamVO();
        teamVO.setTeam("Lakers");
        PlayerVO playerVO = playerAgent.getPlayers();
        teamVO.setPlayers(playerVO);
        return teamVO;
    }
}

application.yml

看自定义配置那块:player下面的url就是agent类注解中的那个url,指向player服务(192.168.0.5是我的虚拟机)

server:
  port: 8081

spring:
  application:
    name: nba-team

player:
  api:
    addr: http://192.168.0.5:8083/player

三、测试

1、启动两个服务

2、浏览器请求team服务那个conroller方法,发现链路全通了,过程中加点日志的话,可更直观看到player服务被调用的轨迹。

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

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

相关文章

Softing邀您参加第16届诊断大会

第16届机电车辆系统诊断大会将于2023年5月23-24日在德累斯顿举行。今年的主题将再次围绕预测性维护、远程诊断、机器学习、标准化以及检验和ePTI方面的当前挑战和新技术展开。 在5月23日&#xff08;周二&#xff09;&#xff0c;Softing汽车电子的创新与测试经理-Jrgen Heilm…

【FMC147】 基于VITA57.4标准的单通道6GSPS 12位采样ADC,单通道 6GSPS 16位采样DAC子卡模块

板卡概述 FMC147是一款单通道6.4GSPS&#xff08;或者配置成2通道3.2GSPS&#xff09;采样率的12位AD采集、单通道6GSPS&#xff08;或配置成2通道3GSPS&#xff09;采样率16位DA输出子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4规范&#xff0c;该模块可以作…

React 内 JSX了解及使用

Jsx的全称是Javascript XML&#xff0c;react定义的一种类似XML的JS拓展语法&#xff1a;JSXML&#xff0c;使我们可以用类似于xml方式描述视图。 本质是React.createElement(component, props, ...children) 的语法糖 原理&#xff1a;babel-loader会预编译JSx为React.creat…

【论文阅读-TPAMI2021】Curriculum Learning(课程学习)综述

简介 Curriculum learning (CL&#xff0c;课程学习)是一种模型训练策略&#xff0c;通过先让模型学习简单数据后再学习困难数据的方式模拟学生进行课程学习的场景。通用的课程学习框架为Difficulty Measurer &#xff08;困难程度评估&#xff09; Training Scheduler&#x…

基于分页实现数据的增删查改

一&#xff1a;主要思路 1:分页功能: 新建一个实体类&#xff0c;用来存储每页数据&#xff0c;数据量&#xff0c;页码&#xff0c;页数&#xff0c;下一页&#xff0c;上一页的相关信息。 Data public class PageModel<T> {//本页数据private List<T> pageDat…

当年差点把我折磨疯的DOS下的打字游戏

最近群里有人喊有没有好用的打字游戏&#xff0c;想给学生找点事儿做&#xff0c;省得他们调皮。我就突然想到当年差点把我折磨疯的这个TT游戏。 记得之前有一个版本我可以使用&#xff0c;打开一看自己当初还写了一段好简单的介绍&#xff0c;就一行字 把tt.com文件拖到DOSB…

C. Plasticine zebra(思维)

Problem - C - Codeforces 这道题目要求你从一个由b和w组成的字符串中选择连续的、交替出现的颜色块来拼出斑马纹路&#xff0c;然后对这个字符串进行零次或多次的切分、翻转和粘合操作&#xff0c;以达到最大的斑马长度。 具体来说&#xff0c;Grisha想要选择若干连续的、交替…

STM32HAL库 总线舵机驱动库的编写

STM32 HAL库 总线舵机驱动库的编写 文章目录 STM32 HAL库 总线舵机驱动库的编写1 理论基础1.1 硬件1.2 电路图1.3 原理1.4 通信协议 2 程序编写2.1 cube mx设置&#xff08;1&#xff09;USART1设置&#xff08;2&#xff09;USART3设置 2.2 程序编写&#xff08;1&#xff09;…

【C程序设计】——最简单的C语言程序

目录 &#x1f34a;&#x1f34a;一、最简单的C语言程序 1.1 最简单的C语言程序举例 1.2 C语言程序的结构 首先&#xff0c;让我们先了解一下C语言的特点&#xff1a; 语言简洁、紧凑&#xff0c;使用方便、灵活&#xff1b;运算符丰富&#xff1b;数据类型丰富&#xff1b…

806. 写字符串需要的行数

806. 写字符串需要的行数 一、题目描述&#xff1a; 我们要把给定的字符串 S 从左到右写到每一行上&#xff0c;每一行的最大宽度为100个单位&#xff0c;如果我们在写某个字母的时候会使这行超过了100 个单位&#xff0c;那么我们应该把这个字母写到下一行。我们给定了一个数…

关于ubuntu20.04 apt 安装源中搜索不到最新版本gcc 12的问题

一、问题描述 最近在搞Open 3d 点云point cloud 相关的东西&#xff0c;过程需要安装较高版本的cmake 3.20版本以上&#xff0c;3.20版本又需要gcc 更高版本 至少11.0以上&#xff0c;理论上本机配置的有 ubuntu 官方的源和阿里云的源&#xff0c;不过 通过搜索就只能搜索安装的…

大模型中的temperature参数+随机采样策略

一、问题来源&#xff1a; 使用GPT-3.5的时候发现相同的输入会得不一样的结果 二、根因定位&#xff1a; 核心就在于采样策略&#xff0c;一图胜千言&#xff1a; 上图中语言模型 (language model) 的预测输出其实是字典中所有词的概率分布&#xff0c;而通常会选择生成其中…

【JavaScript全解析】ES6定义变量与箭头函数详解

箭头函数可以说是ES6的一大亮点,使用箭头函数,可以简化编码过程,使代码更加的简洁 本文由千锋前端老师独家创作&#xff0c;主要给大家介绍了关于ES6中箭头函数的相关资料,文中通过实例代码介绍的非常详细,觉得有帮助的话可以【关注】持续追更~ ES6定义变量 我们现在知道定义…

二、easyUI中的layout(布局)组件

1.layout&#xff08;布局&#xff09;组件的概述 布局容器有5个区域&#xff1a;北、南、东、西和中间。中间区域面板是必须的&#xff0c;边缘的面板都是可选的。每个边缘区域面板都可以通过拖拽其边框改变大小&#xff0c;也可以点击折叠按钮将面板折叠起来。布局可以进行嵌…

前端单元测试是怎么做的?

为什么要做单元测试 1. 执行单元测试&#xff0c;就是为了证明这段代码的行为和我们期望的一致 2. 进行充分的单元测试&#xff0c;是提高软件质量&#xff0c;降低开发成本的必由之路 3. 在开发人员做出修改后进行可重复的单元测试可以避免产生那些令人不快的负作用 怎么去…

YOLOv8中的C2f的详细解读

C2f的结构图,看不懂没关系,继续往下看,一定会看懂的!!!首先是C2f的逻辑代码: class C2f(nn.Module):# CSP Bottleneck with 2 convolutionsdef __init__(self, c1, c2, n=1, shortcut=

排序算法的比较与java实现

冒泡排序 基本思想: 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤&#xff0c;除了最后一个。…

网络安全大厂常见面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

原神3.2服务端架设服务器搭建教程ubuntu系统(保姆级)

原神3.2服务端架设服务器搭建教程ubuntu系统&#xff08;保姆级&#xff09; 大家好&#xff0c;我是艾西今天跟大家分享下原神3.2服务端架设ubuntu系统实操教程 准备阶段&#xff1a;服务器一台 32h32g起、服务端、客户端、服务器装Ubuntu20.04系统 特别强调&#xff1a;ja…

怎样通过font属性控制CSS字体样式?

为了更方便地控制网页中各种各样的字体&#xff0c;CSS提供了一系列的字体样式属性&#xff0c;具体如下。 (1)font-size属性&#xff1a;字号 font-size属性用于设置字号&#xff0c;该属性的属性值可以为像素值、百分比数值、倍率等。表3-l列举了fomt-size属性常用的属性值…