spring cloud的Hoxton.SR1版本的feign的优雅降级的实现

  • 源码下载
  • 前言
  • feign的优雅降级的实现
    • 注册中心
    • 账户微服务
    • 订单微服务
    • 验证feign的降级

源码下载


大家可以直接微信扫描上面的二维码关注我的公众号,然后回复hoxton feign里面就会给到源代码的下载地址同时会附上相应的视频教程,并定期的与大家分享相关的技术文章。

前言

在我们基于spring cloud进行开发的时候我们的微服务之间的调用,会由于网络原因、程序原因、数据库等原因导致我们的微服务的调用失败,而失败则会导致抛出错误,这些错误就会不断往上抛,而给到用户很不好的体验,最简单粗暴的处理的方式就是调用其他微服务的时候我们直接try…catch起来直接进行处理,这种处理方式简单粗暴而且后期维护起来也是一个麻烦,因此我们需要一种更加优雅的处理方式,而feign刚好就为我们提供了这种优雅的处理方式,接下来我将为大家讲解如何优雅的实现我们的降级。

feign的优雅降级的实现

首先我们使用intellij开发工具创建一个空的项目,主要用于存放我们的整个工程,整个工程由以下三个项目组成,分别是:feign-demote-eureka【注册中心】、feign-demote-order【订单微服务】、feign-demote-account【账户微服务】。

注册中心

接着我们创建我们的注册中心工程feign-demote-eureka,创建完成以后修改我们的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.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cloud.feign.demote</groupId><artifactId>feign-demote-eureka</artifactId><version>0.0.1-SNAPSHOT</version><name>feign-demote-eureka</name><description>注册中心</description><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

接着修改我们的主入口类【FeignDemoteEurekaApplication.java】,将当前的工程配置为eureka的服务端,代码如下:

/*** @author linzf* @since 2019-12-26* 类描述: 注册中心的启动类*/
@SpringBootApplication
@EnableEurekaServer
public class FeignDemoteEurekaApplication {public static void main(String[] args) {SpringApplication.run(FeignDemoteEurekaApplication.class, args);}}

最后修改我们的application.yml配置文件,可能你创建的时候是application.properties,直接修改后缀为yml即可,修改以后代码如下:

server:port: 8761
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:register-with-eureka: falsefetch-registry: falseservice-url:defultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

这样我们就完成了我们注册中心的配置了,我们这时候可以直接启动我们的注册中心,然后访问:http://127.0.0.1:8761/就可以看到eureka的页面。

账户微服务

接着我们创建我们的账户微服务【feign-demote-account】,账户微服务没有任何特别的东西,只是提供了两个接口以及将自己注册到注册中心而已,因此我们只需要引入eureka的依赖即可,无需引入我们的feign的依赖,创建完成以后修改我们的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.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cloud.feign.demote</groupId><artifactId>feign-demote-account</artifactId><version>0.0.1-SNAPSHOT</version><name>feign-demote-account</name><description>账户模块</description><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

接着修改我们的主入口类【FeignDemoteAccountApplication.java】,将当前的工程配置为eureka的客户端,代码如下:

/*** @author linzf* @since 2019-12-26* 类描述: 账户的主入口类*/
@SpringBootApplication
@EnableDiscoveryClient
public class FeignDemoteAccountApplication {public static void main(String[] args) {SpringApplication.run(FeignDemoteAccountApplication.class, args);}}

最后修改我们的application.yml配置文件,可能你创建的时候是application.properties,直接修改后缀为yml即可,修改以后代码如下:

eureka:instance:hostname: localhostprefer-ip-address: trueclient:serviceUrl:defaultZone: http://${eureka.instance.hostname}:8761/eureka/# 若将这个参数设置为false,将不会触发feign的降级处理
feign:hystrix:enabled: truelogging:level:root: INFOcom:cloud:feign:demote:account: DEBUGserver:port: 8280
spring:application:name: account-serverribbon:eureka:enabled: trueReadTimeout: 120000ConnectTimeout: 120000MaxAutoRetries: 0MaxAutoRetriesNextServer: 0OkToRetryOnAllOperations: falseNFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 设置断路器超时时间
hystrix:threadpool:default:coreSize: 1000maxQueueSize: 1000queueSizeRejectionThreshold: 500command:default:execution:isolation:thread:timeoutInMilliseconds: 490000strategy: SEMAPHORE

编写我们的【AccountService】的实现,一个方法是正常的方法【feignDemoteCheckSuccess】,另外一个方法是抛出异常的方法【feignDemoteCheckFail】,代码如下:

/*** @author linzf* @since 2019/12/26* 类描述:*/
@Service
public class AccountService {private static Logger logger = LoggerFactory.getLogger(AccountService.class);/*** 功能描述: 正常的feign的调用* @return 返回处理结果*/public String feignDemoteCheckSuccess(){logger.debug("我是正常的feign的调用!");return "success";}/*** 功能描述: 正常的feign的调用* @return 返回处理结果*/public String feignDemoteCheckFail(){logger.debug("我调用的时候出错了!");throw new RuntimeException("我被抛出了异常了!");}}

最后直接编写我们的接口【AccountController.java】的实现,单纯的接口的编写就不再累述了,直接贴代码:

/*** @author linzf* @since 2019/12/26* 类描述: 账户的controller*/
@RestController
@RequestMapping(value = "account")
public class AccountController {@Autowiredprivate AccountService accountService;/*** 功能描述: 正常的feign的调用* @return 返回处理结果*/@GetMapping("feignDemoteCheckSuccess")public String feignDemoteCheckSuccess(){return accountService.feignDemoteCheckSuccess();}/*** 功能描述: 正常的feign的调用* @return 返回处理结果*/@GetMapping("feignDemoteCheckFail")public String feignDemoteCheckFail(){return accountService.feignDemoteCheckFail();}}

到此处我们就完成了我们account-server的编写了,接着我们直接启动我们的account-server。

订单微服务

接着我们创建我们的订单微服务【feign-demote-order】,账户微服务需要调用我们的账户微服务因此需要在引入eureka的基础上海需要引入我们的feign的依赖,创建完成以后修改我们的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.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cloud.feign.demote</groupId><artifactId>feign-demote-order</artifactId><version>0.0.1-SNAPSHOT</version><name>feign-demote-order</name><description>订单模块</description><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencies><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--feign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

接着修改我们的主入口类【FeignDemoteOrderApplication.java】,将当前的工程配置为eureka的客户端,同时开启我们的feign,代码如下:

/*** @author linzf* @since 2019-12-26* 类描述: 订单的主入口类*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignDemoteOrderApplication {public static void main(String[] args) {SpringApplication.run(FeignDemoteOrderApplication.class, args);}}

最后修改我们的application.yml配置文件,可能你创建的时候是application.properties,直接修改后缀为yml即可,修改以后代码如下:

eureka:instance:hostname: localhostprefer-ip-address: trueclient:serviceUrl:defaultZone: http://${eureka.instance.hostname}:8761/eureka/# 若将这个参数设置为false,将不会触发feign的降级处理
feign:hystrix:enabled: truelogging:level:root: INFOcom:cloud:feign:demote:order: DEBUGserver:port: 8380
spring:application:name: order-serverribbon:eureka:enabled: trueReadTimeout: 120000ConnectTimeout: 120000MaxAutoRetries: 0MaxAutoRetriesNextServer: 0OkToRetryOnAllOperations: falseNFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule# 设置断路器超时时间
hystrix:threadpool:default:coreSize: 1000maxQueueSize: 1000queueSizeRejectionThreshold: 500command:default:execution:isolation:thread:timeoutInMilliseconds: 490000strategy: SEMAPHORE

编写我们的账户的feign【AccountFeignDemote】用于当前订单服务来调用,代码如下:

package com.cloud.feign.demote.order.feign;import com.cloud.feign.demote.order.feign.impl.AccountFeignDemoteImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;/*** @author linzf* @since 2019/12/26* 类描述:*/
@FeignClient(value = "account-server", path = "account" ,fallback = AccountFeignDemoteImpl.class)
public interface AccountFeignDemote {/*** 功能描述: 正常的feign的调用** @return 返回处理结果*/@GetMapping("feignDemoteCheckSuccess")String feignDemoteCheckSuccess();/*** 功能描述: 正常的feign的调用** @return 返回处理结果*/@GetMapping("feignDemoteCheckFail")String feignDemoteCheckFail();}

编写我们的账户降级的feign【AccountFeignDemote】的实现,用于当调用失败的时候的降级处理,代码如下:

package com.cloud.feign.demote.order.feign.impl;import com.cloud.feign.demote.order.feign.AccountFeignDemote;
import org.springframework.stereotype.Component;/*** @author linzf* @since 2019/12/26* 类描述:*/
@Component
public class AccountFeignDemoteImpl implements AccountFeignDemote {@Overridepublic String feignDemoteCheckSuccess() {return "我被降级处理了";}@Overridepublic String feignDemoteCheckFail() {return "我被降级处理了";}
}

编写订单的service【OrderService.java】的实现,代码如下:

package com.cloud.feign.demote.order.service;import com.cloud.feign.demote.order.feign.AccountFeignDemote;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author linzf* @since 2019/12/26* 类描述:*/
@Service
public class OrderService {private static Logger logger = LoggerFactory.getLogger(OrderService.class);@Autowiredprivate AccountFeignDemote accountFeignDemote;/*** 功能描述: 有降级的feign调用的成功的方法* @return*/public String feignDemoteCheckSuccess(){logger.debug("这是有降级的调用成功以后的方法!");return accountFeignDemote.feignDemoteCheckSuccess();}/*** 功能描述: 有降级的feign调用的失败的方法* @return*/public String feignDemoteCheckFail(){logger.debug("这是有降级的调用失败以后的方法!");return accountFeignDemote.feignDemoteCheckFail();}}

编写订单的controller【OrderController.java】的实现,代码如下:

package com.cloud.feign.demote.order.controller;import com.cloud.feign.demote.order.service.OrderService;
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;/*** @author linzf* @since 2019/12/26* 类描述: 订单的controller*/
@RestController
@RequestMapping(value = "order")
public class OrderController {@Autowiredprivate OrderService orderService;/*** 功能描述: 有降级的feign调用的成功的方法* @return*/@GetMapping("feignDemoteCheckSuccess")public String feignDemoteCheckSuccess(){return orderService.feignDemoteCheckSuccess();}/*** 功能描述: 有降级的feign调用的失败的方法* @return*/@GetMapping("feignDemoteCheckFail")public String feignDemoteCheckFail(){return orderService.feignDemoteCheckFail();}}

到此处我们就完成了我们的订单微服务开发了,我们直接启动我们的订单微服务。

验证feign的降级

在保证我们的三个服务都正常启动,且我们的订单和账户都注册到注册中心的情况下,我们直接打开浏览器输入以下的地址:
http://127.0.0.1:8380/order/feignDemoteCheckFail,我们在控制台会看到如下的页面,则说明服务被降级了:

若我们希望不要进行全局的降级处理,那我们就直接修改我们的application.yml的配置文件的以下的代码部分,将改值由true改为false即可。

若我们只希望我们的某个feign不需要降级处理,那么我们直接删除相应的feign接口的fallback即可,删除如下图箭头所示位置的代码即可:

到此处我们就完成了我们的feign的优雅的降级的demo的实现了,若需要源代码可以关注我的公众号回复hoxton feign即可

spring cloud的Hoxton.SR1版本的feign的优雅降级的实现相关推荐

  1. 厉害了,Spring Cloud Alibaba 发布 GA 版本!

    小马哥 & Josh Long 喜欢写一首诗一般的代码,更喜欢和你共同 code review,英雄的相惜,犹如时间沉淀下来的对话,历久方弥新. 相见如故,@杭州. 4 月 18 日,Josh ...

  2. Spring Cloud 升级最新 Finchley 版本,踩了所有的坑

    转载自   Spring Cloud 升级最新 Finchley 版本,踩了所有的坑 Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Bo ...

  3. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  4. Spring Cloud学习笔记(Hoxtonl版本)

    Spring Cloud 什么是微服务 提出者与时间: Martin Fowler ,Mar 2014 微服务架构是一种架构模式,它提倡单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用 ...

  5. 5.Spring Cloud Alibaba教程:Nacos整合Feign

    概述 Feign是一个声明式的http客户端.使用Feign只需要创建接口并加上对应的注解,就可以实现类似RestTemplate方式的调用,只是它将底层的http请求代码隐藏起来.另外,Feign默 ...

  6. Spring Cloud Consul 之Greenwich版本全攻略

    转载请标明出处: http://blog.csdn.net/forezp/article/details/87273153 本文出自方志朋的博客 个人博客版:https://www.fangzhipe ...

  7. spring cloud 2020 改变了版本的命名规则

    前言 一直对spring cloud 的版本命名规则很诟病,之前的spring cloud 版本名是根据伦敦地铁站名称的英文名称并按照字母a-z进行排序.虽然知道了规则感觉还行,但是这种对非英语语言环 ...

  8. 【065】Spring Cloud服务注册中心双节点集群,使用Eureka实现,以IP方式配置,基于Spring Cloud的Camden SR5版本

    Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现.Eureka 采用了 C-S 的设计架构.Eureka Server 作为服务注册功能的服务器,它 ...

  9. spring cloud 微服务调用--ribbon和feign调用

    这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...

  10. spring cloud 微服务的版本介绍与内部组件详解

    转载于:https://blog.51cto.com/14185725/2370375

最新文章

  1. 停止JavaScript中的setInterval调用
  2. BC26通过LWM2M协议连接ONENET,AT流程,STM32代码
  3. python操作系统-PYTHON-操作系统基础
  4. 【PAT乙级】1035 插入与归并 (25 分)
  5. 使用React和Tailwind CSS搭建项目框架
  6. Redis高可用分布式内部交流(九)
  7. java nbsp_引用了实体 nbsp
  8. git原理详解与实操指南_全网最精:学git一套就够了,从入门到原理深度剖析
  9. [120_移动开发Android]007_android开发之SAX操作XML文件
  10. [bzoj1878][SDOI2009]HH的项链
  11. 用户体验报告(Echo)
  12. WordPress插件 UberGrid 高级相册图片分享中文插件[更新至v2.0.13]
  13. rsync简介及部署
  14. RF信号下采样/矩阵下采样(附python实现代码)
  15. 163邮箱每天可以无限制的发邮件么?
  16. Linux基础系统优化及常用命令
  17. 如何删除Mysql注册列表残余文件
  18. 一年经验的java程序员薪资有多少?java收入分级
  19. IO进程——系统IO与文件IO
  20. ripro9.2明文修正版,无加密无后门,无需扩展(亲测)虚拟机可用

热门文章

  1. 《悲剧性选择》卡拉布雷西 epub+mobi+azw3
  2. 【学习摘记】马士兵HTML CSS_课时4-5_表格和表单
  3. 【Digger爬虫系列】用Digger抓取taptap游戏排行榜
  4. apache poi excel word 加密,不用借助其他jxcell.jar包
  5. java读取otf_在webpack中加载.otf字体文件的正确方法是什么?
  6. Hadoop是什么,Hadoop主要有哪几部分组成?
  7. 华硕路由搭建php网站,华硕路由器操作模式
  8. Idear创建Maven项目
  9. jQuery 遍历 - 同胞(siblings)
  10. vue3+tsx封装组件