springboot整合feign实现RPC调用,并通过Hystrix实现服务降级

这篇具有很好参考价值的文章主要介绍了springboot整合feign实现RPC调用,并通过Hystrix实现服务降级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

springboot整合eureka、config搭建注册中心和配置中心https://blog.csdn.net/heyl163_/article/details/131715281

目录

一、服务提供者

二、服务消费者

三、测试效果

四、开启Hystrix实现服务降级


首先,要实现服务间的调用,需要有服务提供者和服务消费者,创建两个项目,分别用于服务提供者和服务消费者。

一、服务提供者

创建一个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</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</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</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</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.openfeign.EnableFeignClients;

@EnableFeignClients
@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,发现成功返回了字符串。

四、开启Hystrix实现服务降级

首先需要开启hystrix

在pom.xml文件中添加配置

feign:
  hystrix:
    enabled: true

然后创建一个FeignService的实现类,交给spring管理

package com.example.consumer.feign;

import org.springframework.stereotype.Component;

/**
 * @author heyunlin
 * @version 1.0
 */
@Component
public class FeignServiceImpl implements FeignService {

    @Override
    public String name() {
        return "error";
    }

}

 最后,在FeiginService接口的的@FeiginCilent注解上指定fallback=FeignServiceImpl.class

@FeignClient(value = "provider", fallback = FeignServiceImpl.class)

完成以上配置之后,重启consumer,访问http://localhost:8086/user/name时正确调用了provider的控制器方法,得到了正确的结果。

接着把关掉provider项目,再访问,发现调用失败,成功执行了配置的降级方法,直接返回了error

springboot整合feign实现RPC调用,并通过Hystrix实现服务降级,spring boot,rpc,后端

好了,springboot整合feign的介绍到这里就完了,代码已开源,按需获取~

注册中心

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

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

consumerhttps://gitee.com/he-yunlin/consumer.git文章来源地址https://www.toymoban.com/news/detail-599073.html

到了这里,关于springboot整合feign实现RPC调用,并通过Hystrix实现服务降级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用 no suitable HttpMessageConverter found for response type

    目录 一、SpringBoot快速整合Feign 1.添加Pom依赖 2.启动类添加注解 3.引用Feign服务 二、为请求添加Header的3种方式 1.添加固定header 2.通过接口签名添加header 3.动态添加header 三、为请求添加超时配置 1.默认超时时间 3.超时异常 4.全局超时配置 5.为单个服务设置超时配置 四、为请求配

    2024年02月11日
    浏览(55)
  • Springboot整合Netty实现RPC服务器

    try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, worker) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new IdleStateHandler(0, 0, 60)); pipeline.addLast(new JsonDecoder()); pipeline.addLast(new JsonEnco

    2024年04月09日
    浏览(43)
  • Java 【dubbo rpc改feign调用】解决调用服务提供方无法传递完整参数问题

    【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第二篇】feign接口异常解决 【描述】多参数情况下,调用服务提供方无法传递完整参数、改@SpringQueryMap原因是会将实体自动拆分为拼接参数。目前只遇到多参数:实体和单参数情况,持续更新… 汇总: 1.多个普通参数,

    2024年02月16日
    浏览(67)
  • 【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

    在日益增长的业务需求中,一开始使用的是每个项目独立开发,虽然都是前后端分离的项目,但是每一个项目之间互不干扰。后来,因为某种需求,需要几个项目的数据相互交错获取。 最开始的想法就是集成多个数据源。 举例 有A、B、C三个项目,对应着数据库DBa、DBb、DBc、

    2024年02月04日
    浏览(57)
  • 聊聊不同集群的微服务如何通过feign调用

    之前业务部门的某项目微服务调用关系如下图 后因业务改造需要,该项目需要将服务A部署到另外一个集群,但服务A仍然需要能调用到服务B,调用关系如下图 之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队,服务A开发团队直接将客户端包引入

    2024年02月13日
    浏览(50)
  • SpringCloud Alibaba(一)微服务简介+Nacos的安装部署与使用+Nacos集成springboot实现服务注册+Feign实现服务之间的远程调用+负载均衡+领域划分

    目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署+服务注册 (一)linux安装包方式单节点安装部署 1. jdk安装配置 2. na

    2024年02月09日
    浏览(46)
  • [RPC]:Feign远程调用

    摘要:RestTemplate;Feign;远程调用; Feign是一个简化HTTP客户端编写的框架,通过声明式方式将远程服务调用封装成简单接口调用。 1.2.1 使用RestTemplate发送远程调用代码 要求:系统调用者在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。 1.2.1.1 项目示例

    2024年02月10日
    浏览(45)
  • Java 【dubbo rpc改feign调用】feign接口异常统一处理

    【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第一篇】feign接口异常统一处理 示例代码中【ApplicationException 】、【Payload 】为自定义异常类和通用结果返回实体类: 示例代码中【ApplicationException 】、【StringUtil】为自定义异常类和自定义工具,自己平替即可:

    2024年02月16日
    浏览(35)
  • 服务间通过Feign相互调用报错,参数是MultiparFile、参数是POJO报错

    目录 1.Feign传文件报错,Feign不支持上传文件需要借助外面的依赖才可以实现上传 2.服务之间通过Feign相互调用传递DTO(实体对象)报错 具体报错内容: 原因就是Feigin相互调用不支持文件上传,怎么才可支持呢???那就是借助feign-form-spring、feign-form。 在消费端引入依赖并创建

    2024年02月11日
    浏览(39)
  • Java 【dubbo rpc改feign调用】feign接口调用 Body parameter 4 was null

    【框架改造问题点记录,dubbo改为spring cloud alibaba】 【第四篇】feign接口调用 Body parameter 4 was null 【描述】Feign是一个声明式的Web服务客户端,它使得写HTTP客户端变得更简单。如果你在使用Feign进行服务调用时遇到了\\\"Body parameter 4 was null\\\"这样的错误,这通常意味着你尝试将一个

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包