Eureka注册中心 与 OpenFeign调用接口

需求

一个应用通过接口,调用另一个应用的接口。使用OpenFeign来实现接口调用。

说明

通过OpenFeign(本文接下来简称Feign)调用远程接口,需要Eureka注册中心的支持。

OpenFeign调用接口的逻辑如下:

  1. 提供接口的应用(A),将自身注册到Eureka服务器(注册中心);应用A需要给自己起一个应用名称;
  2. 调用接口的应用(B),从Eureka读取所有已注册服务的信息;
  3. B应用的Feign客户端,通过服务的应用名称,从已注册服务的信息中,找到应用A(对应的IP地址和端口号),从而调用A的接口。

本文主要内容

本文主要讲述,如何配置一个注册中心(Eureka),Feign的配置,以及使用Feign来调用接口。
主要包含三个部分:

  1. 配置Eureka注册中心(单体,非集群);
  2. 配置提供接口的应用,注册到Eureka:提供被调用的接口;
  3. 配置调用接口的应用,从Eureka获取到被调用方地址:调用接口。

Eureka服务器

1. 依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2. 配置(application.properties)

此配置为单体服务器配置,非集群配置。

server.port=8761# 主机名,不配置的时候将根据操作系统的主机名获取。
eureka.instance.hostname=localhost# 不将自身注册到注册中心。是否将自己注册到注册中心,默认为true。单个Eureka服务器,不需要注册自身,配置为false;如果是Eureka集群,则需要注册自身,即配置为true。
eureka.client.registerWithEureka=false
# 是否从注册中心获取服务注册信息,默认为true。
eureka.client.fetchRegistry=false
# 注册中心对外暴露的注册地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

3. 开启Eureka服务器

在 Application 启动类上,添加注解 @EnableEurekaServer.

示例代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServerDemoApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerDemoApplication.class, args);}}

FeignServer

提供接口的应用,可以通过Feign来调用接口。

1. 依赖

  • Eureka Discovery Client
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2. 配置(application.properties)

server.port=8081# 应用名称
spring.application.name=feign-server
# 使用 ip地址:端口号 注册
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

3. 提供接口

package com.example.feign.server.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("feign_server_path")
public class FeignServerController {@GetMapping("hello")public String hello() {return "hello feign server!";}@GetMapping("data")public String getData() {return "来自FeignServer的数据!";}}

Feign客户端

通过Feign,调用FeignServer应用的接口。

1. 依赖

需要引入两个依赖:

  • Eureka Discovery Client
  • OpenFeign
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

注意:需要通过 <dependencyManagement><properties>,管理 spring cloud 版本。如果项目中已经添加,则无需再额外修改。

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
<properties><spring-cloud.version>2021.0.8</spring-cloud.version>
</properties>

2. 配置(application.properties)

server.port=8082# 不将自身注册到Eureka注册中心。本配置为是否将自己注册到注册中心,默认为true。
eureka.client.registerWithEureka=false
# 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

3. 开启Feign客户端

在 Application 启动类上,添加注解 @EnableFeignClients.

示例代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@EnableFeignClients
@SpringBootApplication
public class FeignClientDemoApplication {public static void main(String[] args) {SpringApplication.run(FeignClientDemoApplication.class, args);}}

4. 定义接口(与FeignServer对应)

注解 @FeignClient:表示Feign接口。

value:Feign所调用的应用的应用名称。

path:Feign所调用的应用的对应Controller的接口路径,即 Controller 上 @RequestMapping 中的接口路径。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "feign-server", path = "feign_server_path")
public interface FeignInvocationService {@GetMapping("data")String getFeignServerData();}

5. 调用Feign接口

像调用本地方法一样,调用Feign接口。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.example.feign.client.feign.FeignInvocationService;@RestController
@RequestMapping("feign_client")
public class FeignClientController {@GetMapping("hello")public String hello() {return "hello feign client!";}@Autowiredprivate FeignInvocationService feignInvocationService;@GetMapping("feign_server_data")public String getFeignServerData() {return "通过FeignClient调用:" + feignInvocationService.getFeignServerData();}}

调用示例

Eureka

在这里插入图片描述

FeignServer的接口直接调用

在这里插入图片描述

FeignClient通过Feign,调用FeignServer的接口

在这里插入图片描述

Get方法报错

两种报错

Body parameter 0 was null

Feign客户端,调用Get方法时,接口包含一个参数,报错:

java.lang.IllegalArgumentException: Body parameter 0 was null

Method has too many Body parameters

Feign客户端,调用Get方法时,接口包含多个参数,报错:

Method has too many Body parameters

报错接口的原始代码

Body parameter 0 was null

  • Feign服务器端接口
	@GetMapping("result")public String getData(String account) {return "从FeignServer查询的数据!入参为:" + account;}
  • Feign客户端
	@GetMapping("result")String getData(String account);

Method has too many Body parameters

  • Feign服务器端接口
	@GetMapping("two_params")public String getDataByTwoParam(String account, String name) {return "从FeignServer查询的数据!account=" + account + ",name=" + name;}
  • Feign客户端
	@GetMapping("two_params")public String getDataByTwoParam(String account, String name);

解决方法:@RequestParam

Feign接口参数添加@RequestParam注解。

Feign客户端,修改后的代码如下:

import org.springframework.web.bind.annotation.RequestParam;
	@GetMapping("result")String getData(@RequestParam("account") String account);@GetMapping("two_params")public String getDataByTwoParam(@RequestParam("account") String account, @RequestParam("name") String name);

完整的Feign客户端代码示例

package com.example.feign.client.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;@FeignClient(value = "feign-server", path = "feign_server_path")
public interface FeignInvocationService {@GetMapping("data")String getFeignServerData();@GetMapping("result")String getData(@RequestParam("account") String account);@GetMapping("two_params")public String getDataByTwoParam(@RequestParam("account") String account, @RequestParam("name") String name);}

成功调用的接口示例

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

文章详情页 - 评论功能的实现

目录 1. 准备工作 1.1 创建评论表 1.2 创建评论实体类 1.3 创建 mapper 层评论接口和对应的 xml 实现 1.4 准备评论的 service 层 1.5 准备评论的 controller 层 2. 总的初始化详情页 2.1 加载评论列表 2.1.1 实现前端代码 2.1.2 实现后端代码 2.2 查询当前登录用户的…

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:部分填充的提示模板和提示合成]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 部分填充的提示模板 提示模板是一个具有.format方法的类&#xff0c;它接受一个键值映射并返回一个字符串&#xff08;一个提示&#xff09;&#xff0c;以传递给语言模型。与其他方法一样&#xff0c;将提示模板进行…

Android Notification的使用

在AndroidManifest.xml中添加权限 <uses-permission android:name"android.permission.POST_NOTIFICATIONS" />常用通知的写法&#xff0c;兼容android 8.0之后的版本 private NotificationManager getNotificationManager() {return (NotificationManager) g…

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:创建自定义提示模板和含有Few-Shot示例的提示模板]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 创建自定义提示模板 假设我们希望LLM根据函数名称生成该函数的英文语言解释。为了实现这个任务&#xff0c;我们将创建一个自定义的提示模板&#xff0c;以函数名称作为输入&#xff0c;并格式化提示模板以提供函数的…

elasticsearch 安装

下载 https://www.elastic.co/downloads/past-releases/elasticsearch-7-8-0 1 解压 tar xf elasticsearch-7.8.0.tgz -C /usr/local/ 2 普通用户运行 elasticsearch的启动方式有点特殊&#xff0c;只能以普通用户的方式运维 useradd elasticsearch chown -R elasticsearc…

list与流迭代器stream_iterator

运行代码&#xff1a; //list与流迭代器 #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend ist…

Redis的安装部署以及基本的使用

目录 一、Linux下直接安装Redis &#xff08;1&#xff09;下载Redis安装包 &#xff08;2&#xff09;安装GCC编译环境 &#xff08;3&#xff09;安装Redis &#xff08;4&#xff09;服务启动 &#xff08;5&#xff09;后台启动 二、使用Docker安装部署Redis &…

mysql主从复制原理及应用

一、主从复制简介 MySQL主从复制是一种异步、基于日志的、单向的数据库复制技术&#xff0c;它通过在主服务器上启用二进制日志并将其发送给一个或多个从服务器&#xff0c;实现了从服务器与主服务器之间的数据同步。主服务器将所有的数据库操作记录到二进制日志中&#xff0c…

2023年第四届“华数杯”数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常检测 异常…

云原生之深入解析如何在Kubernetes下快速构建企业级云原生日志系统

一、概述 ELK 是三个开源软件的缩写&#xff0c;分别表示 Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat&#xff0c;它是一个轻量级的日志收集处理工具 (Agent)&#xff0c;Filebeat 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输…

Django使用用户列表的展示和添加

接着上一篇&#xff1a;https://blog.csdn.net/javascript_good/article/details/132027702 来实现用户表的查询和添加 1、创建数据库表 在models.py 中&#xff0c;增加UserInfo类&#xff0c;包括字段姓名、密码、年龄、账号余额、入职时间、所属部门、性别 verbose_name 就…

2023年7月文章一览

受台风“杜苏芮”的残余环流影响&#xff0c;雨从7月下到了8月。2023年7月总共更新了4篇文章&#xff0c;如下&#xff1a; 1.Visual Studio Code错误&#xff1a;Cannot build and debug because the … 2.C语言实现解一元二次方程 3.《Programming Abstractions In C》阅读笔…

解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx‘

问题描述 训练模型时&#xff0c;分阶段训练&#xff0c;第二阶段加载第一阶段训练好的模型的参数&#xff0c;接着训练 第一阶段训练&#xff0c;含有代码 if (train_on_gpu):if torch.cuda.device_count() > 1:net nn.DataParallel(net)net net.to(device)第二阶段训练…

STM32 LoRa(学习二)

LoRa关键参数说明 LoRa数据包由三个部分组成&#xff1a;前导码、可选报头、数据有效负载。 前导码&#xff1a;用于保持接收机与输入的数据流同步。默认情况下&#xff0c;数据包含有12个符号长度的前导码。前导码是一个可以通过编程来设置的变量&#xff0c;所以前导码的长度…

台式机/工控机通过网线共享笔记本电脑无线网络(待续)

1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下&#xff08;对应笔记本信息&#xff09; IP地址为192.168.XXX.12 子网掩码为255.255.255.0 默认网关为192.168.XXX.1 首选DNS为192.16…

git | git使用心得记录

公司里项目最近使用Git进行协作开发&#xff0c;总结一下使用心得 一、第一次用git&#xff0c;完全同步最新代码checkout 按照以下步骤操作 1、git init 2、git remote add origin 远程仓库的地址https://gitlab.xxxx.com.cn/xx/xx/xxx/Android/baseline/x.x.x.git(远程仓库…

VB客运中心汽车售票管理系统设计与实现

摘 要:该系统是信息管理系统在售票管理方面的一个分支和具体运用,是为长治客运中心而设计的管理售票、车次、票价及客票收入统计等日常事物的系统。此系统选择Visual Basic 6.0作为开发工具来实现客运中心汽车售票所要求的各种功能。本文主要介绍了开发此管理系统的背景、必要…

【linux 搜索】linux中常见搜索命令用法

文章目录 1 find命令2 grep命令3 locate命令4 which命令5 whereis命令6 find和grep组合 在Linux中&#xff0c;您可以使用多种方法来搜索文件和内容。以下是一些常用的搜索方法介绍&#xff1a; 1 find命令 find命令用于在文件系统中搜索文件和目录。它的基本语法如下&#xf…

Git详解和命令大全

目录 一、Git 的基本概念二、Git 的安装和使用三、Git 的版本分支管理四、Git 的命令大全1. 常用命令2. 命令大全 五、版本分支管理的最佳实践六、Git 实践七、高级特性八、Git 的未来发展 Git 是一款开源的分布式版本控制系统&#xff0c;可以有效地处理从小到非常大的项目版本…

解密Redis:应对面试中的缓存相关问题

文章目录 1. 缓存穿透问题及解决方案2. 缓存击穿问题及解决方案3. 缓存雪崩问题及解决方案4. Redis的数据持久化5. Redis的过期删除策略和数据淘汰策略6. Redis分布式锁和主从同步7. Redis集群方案8. Redis的数据一致性保障和高可用性方案 导语&#xff1a; 在面试过程中&#…