springboot整合feign实现RPC调用

news2024/11/24 16:33:28

目录

一、服务提供者

二、服务消费者

三、测试效果


feign/openfeign和dubbo是常用的微服务RPC框架,由于feigin内部已经集成ribbon,自带了负载均衡的功能,当有多个同名的服务注册到注册中心时,会根据ribbon默认的负载均衡算法将请求分配到不同的服务。这篇文章就简单介绍一下怎么使用feign来调用远程的服务。

首先,需要有一个微服务注册中心来提供服务注册与发现,本章就使用之前创建的eureka作为注册中心。点击以下文章链接,教你快速搭建一个eureka server

springboot整合eureka、config搭建注册中心和配置中心https://blog.csdn.net/heyl163_/article/details/131715281首先,要实现服务间的调用,需要有服务提供者和服务消费者,创建两个项目,分别用于服务提供者和服务消费者。

一、服务提供者

创建一个springboot项目,取名为provider

1、修改maven配置文件pom.xml

<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <eureka.version>1.4.4.RELEASE</eureka.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>${eureka.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、修改系统配置文件

server:
  port: 8085

spring:
  application:
    name: provider

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka

3、创建一个controller

在根目录下创建controller包,然后在controller包下创建一个UserController

package com.example.provider.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=utf-8")
public class UserController {

    @RequestMapping(value = "/name", method = RequestMethod.GET)
    public String name() {
        return "heyunlin";
    }

}

4、启动类上添加@EnableDiscoveryClient注解

package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

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

}

二、服务消费者

1、创建一个springboot项目并命名为consumer

2、修改pom.xml配置文件

<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <eureka.version>1.4.4.RELEASE</eureka.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>${eureka.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

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

3、修改配置文件,注册到eureka

server:
  port: 8086

spring:
  application:
    name: consumer

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka

4、通过feign调用远程的方法

根目录下创建feign包,在feign包下创建一个接口FeignService(类名不重要)

@FeignClient("provider")指定注册到eurka的服务名

@RequestMapping的路径写provider服务的控制器接口路径

package com.example.consumer.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author heyunlin
 * @version 1.0
 */
@FeignClient("provider")
public interface FeignService {

    @RequestMapping(value = "/user/name", method = RequestMethod.GET)
    String name();

}

5、最后,创建一个控制器类,类名随便取

package com.example.consumer.controller;

import com.example.consumer.feign.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    FeignService feignService;

    @RequestMapping(value = "/name", method = RequestMethod.GET)
    public String name() {
        return feignService.name();
    }

}

这时候@Autowired会报错,找不到FeignService的bean,因为没有在配置类上面添加@EnableFeignClients注解

package com.example.consumer;

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

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

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

}

三、测试效果

完成以上操作之后,依次启动euraka-server,provider和consumer

浏览器上访问consumer的控制器地址http://localhost:8086/user/name,发现成功返回了字符串。

至此,springboot整合feign就完成了,代码已开源,按需获取~

注册中心

eurekahttps://gitee.com/he-yunlin/eureka.git服务提供者

providerhttps://gitee.com/he-yunlin/provider.git服务消费者

consumerhttps://gitee.com/he-yunlin/consumer.git

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

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

相关文章

用 perfcollect 洞察 Linux 上.NET程序CPU爆高

一&#xff1a;背景 1. 讲故事 如果要分析 Linux上的 .NET程序 CPU 爆高&#xff0c;按以往的个性我肯定是抓个 dump 下来做事后分析&#xff0c;这种分析模式虽然不重但也不轻&#xff0c;还需要一定的底层知识&#xff0c;那有没有傻瓜式的 CPU 爆高分析方式呢&#xff1f;…

使用testify包辅助Go测试指南

我虽然算不上Go标准库的“清教徒”&#xff0c;但在测试方面还多是基于标准库testing包以及go test框架的&#xff0c;除了需要mock的时候&#xff0c;基本上没有用过第三方的Go测试框架。我在《Go语言精进之路》[2]一书中对Go测试组织的讲解也是基于Go testing包和go test框架…

【Java|golang】415. 字符串相加

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&#xff…

五笔衰落,PC和OCR惹得祸?

许多人认为五笔输入法的衰落主要因素是败给了拼音输入法&#xff0c;是被拼音输入法给“打残”了&#xff0c;取代了&#xff0c;其实这只是表面原因&#xff0c;笔者认为&#xff0c;其关键因素是PC的衰落和OCR技术的不断改进和发展&#xff0c;理由如下&#xff1a; 1、PC出…

TCP/IP详解

目录 一、OSI参考模型 1.图示 2.OSI七层模型各自作用 3.七层通信过程 二、IP协议 1.IPv4首部 2.IPv6首部 三、TCP协议 1.tcp首部格式 2.握手挥手图示 3.握手流程 4.为什么要三次握手&#xff1f; 5.四次挥手流程 6.为什么要四次分手&#xff1f; 7.为什么要等待…

kafka接收外部接口的数据,并实现转发

目录 一、什么是kafka 二、kafka接收外部接口数据 三、kafka收到数据后转发 四、kafka总结 一、什么是kafka Kafka是一种分布式流式处理平台&#xff0c;最初由LinkedIn开发。它设计用于高吞吐量、低延迟的数据处理&#xff0c;能够处理大规模的实时数据流。Kafka采用发布…

[PHP]解决exec执行unzip出现中文文件名乱码的问题

查看Linux编码&#xff0c;例如下图可看出Linx编码是zh_CN.UTF-8 问题截图&#xff1a; 以下代码都会产生乱码 exex(unzip -d /xxx /x/test.zip); exex(unzip -O zh_CN.UTF-8 -d /xxx /x/test.zip); exex(unzip -I zh_CN.UTF-8 -d /xxx /x/test.zip); 解决方法&#xff1a; …

Java线程的创建和使用

目录 基本概念 线程的创建和使用 线程的生命周期 基本概念 程序(program) 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 进程(process) 进程(process)是程序的一次执行过程&#xff0c;或是正在运行的一个程…

ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

ESP32MQTTMySQL实现发布订阅【气味数据收集】 &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;相关文章&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e; ESP32连接MQ Sensor实现气味反应 &#x1f517; https://blog.csdn.net/ws1516…

指针知多少

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; ⛵前言 不知道大家还记…

avi格式怎么转换成mp4?教你几种简单转换小技巧

由于 AVI 格式的文件结构&#xff0c;它们不适合用于流式传输。这意味着&#xff0c;如果你想在线观看一个 AVI 格式的视频&#xff0c;你需要等待整个文件下载完成后才能开始观看。这对于那些希望尽快开始观看视频的人来说可能是一个问题。那么我们怎么将AVI格式的视频转换成M…

【C语言】memcpy,memmove,memcmp,memset函数详解

memcpy,memmove,memcmp,memset函数详解 memcpy函数一、 memcpy函数的定义&#xff1a;二、memcpy函数的功能&#xff1a;三、memcpy函数模拟memcpy注意事项 memmove函数一、memmove函数简介二、memmove函数的模拟1.两种情况2模拟实现 memcmp函数memecmp函数介绍 memset函数mems…

Cell 子刊 - 4D打印一只可变形的蜘蛛

国自然“十四五”优先发展领域公布&#xff0c;共计115项&#xff01;&#xff08;生物医学领域节选&#xff0c;近 50 项&#xff09;中提到 4D打印是一个重要方向。 凝胶状墨水使得3D打印应用于电子设备的金属物体更容易。 3D打印在经济性、设计自由度和效率方面均超越了传统…

Matplotlib中文乱码解决方案(两种方式)

Matplotlib 默认不支持中文字体&#xff0c;这因为 Matplotlib 只支持 ASCII 字符&#xff0c;但中文标注更加符合中国人的阅读习惯。因此&#xff0c;本节重点讲解如何在 Windows 环境下让 Matplotlib 显示中文。 Matplotlib中文乱码 当不对 Matplotlib 进行设置&#xff0c…

网页版五子棋设计实现自动化测试

目录 一、设计测试用例 二、执行测试 登录页面 功能测试 界面测试 注册界面 功能测试 界面测试 游戏大厅 功能测试 界面测试 游戏房间 功能测试 界面测试 一、设计测试用例 二、执行测试 在执行测试之前首先获取到驱动。 登录页面 功能测试 首先定义star…

2023年9月长沙/郑州/济南DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

Spark(26):Spark通讯架构

目录 0. 相关文章链接 1. Spark通信架构概述 2. Spark 通讯架构解析 0. 相关文章链接 Spark文章汇总 1. Spark通信架构概述 Spark 中通信框架的发展&#xff1a; Spark 早期版本中采用 Akka 作为内部通信部件。Spark1.3 中引入 Netty 通信框架&#xff0c;为了解决 Shuf…

靶机渗透之prime1(解法2)

prime1 靶机渗透获取目标shell查看当前用户下的信息查找是否含有有效的备份文件经过查找找到enc文件密码md5格式生成登录靶机Prime提权成功获取flag 靶机渗透 获取目标shell 查看当前用户下的信息 在当前文件夹下&#xff0c;enc文件需要密码&#xff0c;尝试去寻找该文件的密…

移远通信发布新款5G/4G、LPWA和GNSS天线,进一步优化物联网终端性能

2023年7月17日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出三款新型天线产品&#xff0c;以更优的通信和定位性能&#xff0c;满足各类物联网终端在5G/4G、LPWA和GNSS等技术上的更高设计需求。这三款天线包括&#xff1a; YEMN926J1A&…

【GlobalMapper精品教程】061:快速生成全球任意地区等高线

本文讲解在globalmapper中根据任意指定的区域下载数字地形并生成等高线,支持在CASS中打开并编辑。 文章目录 一、指定下载区域二、下载地形数据三、生成等高线四、投影转换五、导出等高线一、指定下载区域 首先,通过在线地图指定一个区域。当然你有区域范围,可以直接下载。…