当前位置: 首页 > news >正文

微服务demo(三)nacosfeign

一、feign使用

1、集成方法
1.1、pom

consumer添加依赖

 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency>
1.2、启动类

consumer启动类加上@EnableFeignClients注解,即开启feign;

1.3、consumer调用provider:

编写一个中间service,consumer调用service,service调用provider。这个service类头加@FeignClient注解:

@FeignClient(value = "my-service",path = "/myProvider")

(1)value:provider配置文件中的spring.application.name,

    注意这里的value值不分大小写,my-service和MY-SERVICE都可以。

(2)path:如果provider在配置文件里面配置了server.context-path,FeignClient就需要指明path。

2、调用方法

上面提到的service,关于service调用provider传参的问题:

2.1、无参调用

post、get请求都可以

2.2、非对象参数

如Integer、String等,适用于get请求。

service方法上需要加@RequestParam注解,且括号中一定要有值(参数的别名)和被调用方provider的参数名保持一致,被调用方可加@RequestParam也可不加;

2.3、对象参数

javaBean,map,list等,只适用于post请求。

被调用方provider加@RequestBody注解,调用方service的方法可加可不加;

2.4、header头部参数:

provider和service方法上都使用@RequestHeader注解,且value指明参数别名。

二、集成demo

1、初版

1.1、父pom
<?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><groupId>com.demo.nacos</groupId><artifactId>nacos-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos-demo</name><packaging>pom</packaging><!-- springBoot --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><!-- 模块说明:这里声明多个子模块 --><modules><module>provider</module><module>consumer</module><module>nacos-common</module></modules><!-- 版本说明:这里统一管理依赖的版本号 --><dependencyManagement><dependencies><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>0.2.2.RELEASE</version></dependency><!-- nacos 注册中心客户端 --><!--        <dependency>--><!--            <groupId>com.alibaba.cloud</groupId>--><!--            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>--><!--            <version>2.1.0.RELEASE</version>--><!--        </dependency>--><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.0.RELEASE</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--nocas必须在web环境下--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
1.2、provider:

(1)pom:

 <parent><artifactId>nacos-demo</artifactId><groupId>com.demo.nacos</groupId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>com.demo.nacos</groupId><artifactId>nacos-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies>

(2)bootstrap:

spring:application:name: my-servicecloud:compatibility-verifier:enabled: falsenacos:#服务注册discovery:server-addr: xxx.xx.xxx:8848#配置中心config:server-addr: xxx.xx.xxx:8848group: wtyyprofiles:active: prod
server:port: 1111servlet:context-path: /myProvider

 (3)启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

(4)controller接口

import com.demo.nacos.common.dto.UserDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/configTest")
//刷新配置
@RefreshScope
public class ProviderTestController {@Value("${user.text}")private String userText;private static Logger logger = LoggerFactory.getLogger(ProviderTestController.class);/*** 1、无参 无返回* @param request* @return* @throws InterruptedException*/@GetMapping("/hanNoParam")public void getUserText(HttpServletRequest request) throws InterruptedException {logger.info("调用无参接口");}/*** 2、有参* @return* @throws InterruptedException*/@GetMapping("/hanParams")public String hanParams(String userName) throws InterruptedException {logger.info("调用有参接口");return userName+":"+userText;}/*** 3、有参,对象参数* @return* @throws InterruptedException*/@PostMapping("/hanObjParams")public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {logger.info("调用对象参数接口");return userDTO;}/*** 4、参数加header* @return* @throws InterruptedException*/@PostMapping("/hanParamsAndHeader")public String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token) throws InterruptedException {logger.info("调用参数和header接口");return userDTO.getUserName()+"的token:"+token;}
}
 1.3、consumer:

(1)pom:

<parent><artifactId>nacos-demo</artifactId><groupId>com.demo.nacos</groupId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>com.demo.nacos</groupId><artifactId>nacos-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- SpringCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId></dependency><!-- SpringCloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId></dependency><!--服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--集中配置--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency></dependencies>

(2) bootstrap:

spring:application:name: my-consumercloud:compatibility-verifier:enabled: falsenacos:#服务注册discovery:server-addr: xxx.xx.xxx:8848#配置中心config:server-addr: xxx.xx.xxx:8848group: wtyy
server:port: 2222servlet:context-path: /myConsumer

(3) 启动类:

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
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

(4) service:重点

import com.demo.nacos.common.dto.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@FeignClient(value = "my-service",path = "/myProvider")
public interface NacosConfigTestService {@RequestMapping("/configTest/hanNoParam")void hanNoParam();@RequestMapping("/configTest/hanParams")String hanParams(@RequestParam("userName")String userName);@RequestMapping("/configTest/hanObjParams")UserDTO hanObjParams(@RequestBody UserDTO userDTO);@RequestMapping("/configTest/hanParamsAndHeader")String hanParamsAndHeader(@RequestBody UserDTO userDTO,@RequestHeader("token") String token);
}

(5) controler:

import com.demo.nacos.common.dto.UserDTO;
import com.demo.nacos.consumer.service.NacosConfigTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;@RestController
@RequestMapping("/consumerTest")
public class ConsumerTestController {@Autowiredprivate NacosConfigTestService nacosConfigTestService;@GetMapping("/hanNoParam")public void getTemp(HttpServletRequest request) throws InterruptedException {nacosConfigTestService.hanNoParam();}@GetMapping("/hanParams")public String hanParams(String userName) throws InterruptedException {return nacosConfigTestService.hanParams(userName);}@PostMapping("/hanObjParams")public UserDTO hanObjParams(@RequestBody UserDTO userDTO) throws InterruptedException {return nacosConfigTestService.hanObjParams(userDTO);}@PostMapping("/hanParamsAndHeader")public String hanParamsAndHeader(@RequestBody UserDTO userDTO,HttpServletRequest request) throws InterruptedException {String token = request.getHeader("token");return nacosConfigTestService.hanParamsAndHeader(userDTO,token);}
}
1.4、测试

分别启动provider、consumer,可以看到都注册到nacos上了:

(1)非对象参数

(2)对象参数

(3)对象参数&header

2、feign的继承特性

上面的代码有很多重复的地方,下面利用feign的继承特性进行抽取。

相关文章:

微服务demo(三)nacosfeign

一、feign使用 1、集成方法 1.1、pom consumer添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency&…...

学浪视频如何录屏保存?

学浪软件对录屏进行了防范&#xff0c;不管什么录屏软件只要打开学浪就会黑屏&#xff0c;这里就教大家一个方法&#xff0c;可以使用网页版进行录屏 这里是学浪的网页版地址 https://student-api.iyincaishijiao.com/ep/pc/login 但是你们打开这个地址会直接跳转到这个页面…...

c++中2种返回变量类型名称的方法

std::string real_name abi::__cxa_demangle(typeid(*(*a)).name(), NULL, NULL, &status);必须使用#include <typeinfo> std::string real_name boost::core::demangle(typeid(*(*a)).name());必须使用 #include <boost/core/demangle.hpp> #include <t…...

python仿真报告自动化——excite TD齿轮角加速度级计算

python仿真报告自动化——excite TD齿轮角加速度级计算 1 、问题-燃油泵相位优化2、难点-excite TD结果文件的提取3、代码 1 、问题-燃油泵相位优化 用excite TD对齿轮系进行仿真&#xff0c;模拟不同燃油泵相位对齿轮传动振动的影响&#xff0c;用齿轮角加速度级作为评价指标…...

如何系统的学习 C#

第一阶段&#xff1a;环境搭建与基础知识 1.1 安装开发环境 下载并安装Visual Studio或Visual Studio Code。若选用Visual Studio Code&#xff0c;记得安装C#扩展插件。 1.2 C#语言概述 了解C#的发展历程、特点以及应用场景。学习C#的基本语法规范&#xff0c;例如语句结尾…...

python爬虫----python列表高级

小伙伴们&#xff0c;大家好&#xff01;今天学习的内容是python列表高级。 1、添加元素 append&#xff1a;在列表末尾添加元素 A [xiaoWang, xiaoZhang, xiaoHua] print("添加之前&#xff0c;列表A的数据:", A)temp input(请输入要添加的学生姓名:) A.append…...

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…...

Linux基础命令2

目录 一.查看切换统计目录 1.Linux的文件属性 2. ls 命令 3.通配符 4.alias&#xff08;别名&#xff09; 5.du&#xff08;disk use&#xff09; 二.创建目录 1.mkdir &#xff08;建立文件夹&#xff09; 2.touch &#xff08;建立文件&#xff09; 三.Linux中的链接…...

IP组播基础

原理概述 IANA ( Internet Assigned Numbers Authority &#xff09;将 IP 地址分成了 A 、 B 、 C 、 D 、 E5类&#xff0c;其中的 D 类为组播 IP 地址&#xff0c;范围是224.0.0.0~239.255.255.255。 一个 IP 报文&#xff0c;其目的地址如果是单播 IP 地址&#xff…...

Pytorch的named_children, named_modules和named_children

在 PyTorch 中&#xff0c;named_children、named_modules 和 named_parameters 是用于获取神经网络模型组件和参数的三种不同的方法。下面是它们各自的作用和区别&#xff1a; named_parameters&#xff1a;递归地列出所有参数名称和tensornamed_modules&#xff1a;递归地列…...

3.28总结

1.java学习记录 1.方法的重载 重载换而言之其实就是函数名不变&#xff0c;但是其中的参数需要改变&#xff0c;可以三个方面改变&#xff08;参数类型&#xff0c;参数顺序&#xff0c;参数个数这三个方面入手&#xff0c;这样可以运用的&#xff09; 但是&#xff1a;注意…...

C# 命名空间的两种定义哦写法与区别

这两种写法在C#中都是有效的&#xff0c;但是它们代表了不同的语法风格和C#版本特性。 第一种写法&#xff1a; namespace Nebula.PDF; public class PdfDocument {}这是C# 9.0及更高版本中引入的顶级语句&#xff08;top-level statements&#xff09;特性。它允许你直接在文…...

Rustdesk客户端编译后固定密码不稳定时好时坏

环境&#xff1a; rustdesk1.19 问题描述&#xff1a; Rustdesk客户端编译后固定密码不稳定时好时坏 解决方案&#xff1a; 出现固定密码不稳定的问题可能有多种原因&#xff0c;下面是一些可能的解决方法&#xff1a; 密码强度&#xff1a;确保所设置的固定密码足够强大…...

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…...

TitanIDE与传统 IDE 比较

与传统IDE的比较 TitanIDE 和传统 IDE 属于不同时代的产物&#xff0c;在手工作坊时代&#xff0c;一切都是那么的自然&#xff0c;开发者习惯 Windows 或 MacOS 原生 IDE。不过&#xff0c;随着时代的变迁&#xff0c;软件行业已经步入云原生时代&#xff0c;TitanIDE 是顺应…...

反序列化动态调用 [NPUCTF2020]ReadlezPHP1

在源代码上看到提示 访问一下看看 代码审计一下 <?php #error_reporting(0); class HelloPhp {public $a;public $b;public function __construct(){$this->a "Y-m-d h:i:s";$this->b "date";}public function __destruct(){$a $this->a;…...

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…...

【ONE·基础算法 || 分治·快排并归】

总言 主要内容&#xff1a;编程题举例&#xff0c;理解分治的思想&#xff08;主要是对快排、并归的应用&#xff09;。       文章目录 总言1、基本介绍2、颜色分类&#xff08;medium&#xff09;2.1、题解 3、快速排序&#xff08;medium&#xff09;3.1、题解&#xff…...

Python 从0开始 一步步基于Django创建项目(11)注册新用户

1、修改C:\D\Python\Python310\study\snap_gram\users路径下的urls.py 添加‘注册新用户’URL。 #注册新用户 path(register/,views.register,nameregister), 2、修改C:\D\Python\Python310\study\snap_gram\users路径下的views.py 编写URL对应的视图函数register。 def r…...

银行监管报送系统介绍(十二):非居民金融账户涉税信息报送

国家税务总局、财政部、中国人民银行、中国银行业监督管理委员会、中国证券监督管理委员会、国家金融监督管理总局2017年5月9日发布、2017年7月1日起施行的《非居民金融账户涉税信息尽职调查管理办法》。 一、《管理办法》出台的背景是什么&#xff1f;   受二十国集团&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...