spring cloud的Hoxton.SR1版本的feign的优雅降级的实现
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的优雅降级的实现相关推荐
- 厉害了,Spring Cloud Alibaba 发布 GA 版本!
小马哥 & Josh Long 喜欢写一首诗一般的代码,更喜欢和你共同 code review,英雄的相惜,犹如时间沉淀下来的对话,历久方弥新. 相见如故,@杭州. 4 月 18 日,Josh ...
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑
转载自 Spring Cloud 升级最新 Finchley 版本,踩了所有的坑 Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Bo ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- Spring Cloud学习笔记(Hoxtonl版本)
Spring Cloud 什么是微服务 提出者与时间: Martin Fowler ,Mar 2014 微服务架构是一种架构模式,它提倡单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用 ...
- 5.Spring Cloud Alibaba教程:Nacos整合Feign
概述 Feign是一个声明式的http客户端.使用Feign只需要创建接口并加上对应的注解,就可以实现类似RestTemplate方式的调用,只是它将底层的http请求代码隐藏起来.另外,Feign默 ...
- Spring Cloud Consul 之Greenwich版本全攻略
转载请标明出处: http://blog.csdn.net/forezp/article/details/87273153 本文出自方志朋的博客 个人博客版:https://www.fangzhipe ...
- spring cloud 2020 改变了版本的命名规则
前言 一直对spring cloud 的版本命名规则很诟病,之前的spring cloud 版本名是根据伦敦地铁站名称的英文名称并按照字母a-z进行排序.虽然知道了规则感觉还行,但是这种对非英语语言环 ...
- 【065】Spring Cloud服务注册中心双节点集群,使用Eureka实现,以IP方式配置,基于Spring Cloud的Camden SR5版本
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现.Eureka 采用了 C-S 的设计架构.Eureka Server 作为服务注册功能的服务器,它 ...
- spring cloud 微服务调用--ribbon和feign调用
这里介绍ribbon和feign调用两种通信服务调用方式,同时介绍如何引入第三方服务调用.案例包括了ribbon负载均衡和hystrix熔断--服务降级的处理,以及feign声明式服务调用.例子包括s ...
- spring cloud 微服务的版本介绍与内部组件详解
转载于:https://blog.51cto.com/14185725/2370375
最新文章
- 停止JavaScript中的setInterval调用
- BC26通过LWM2M协议连接ONENET,AT流程,STM32代码
- python操作系统-PYTHON-操作系统基础
- 【PAT乙级】1035 插入与归并 (25 分)
- 使用React和Tailwind CSS搭建项目框架
- Redis高可用分布式内部交流(九)
- java nbsp_引用了实体 nbsp
- git原理详解与实操指南_全网最精:学git一套就够了,从入门到原理深度剖析
- [120_移动开发Android]007_android开发之SAX操作XML文件
- [bzoj1878][SDOI2009]HH的项链
- 用户体验报告(Echo)
- WordPress插件 UberGrid 高级相册图片分享中文插件[更新至v2.0.13]
- rsync简介及部署
- RF信号下采样/矩阵下采样(附python实现代码)
- 163邮箱每天可以无限制的发邮件么?
- Linux基础系统优化及常用命令
- 如何删除Mysql注册列表残余文件
- 一年经验的java程序员薪资有多少?java收入分级
- IO进程——系统IO与文件IO
- ripro9.2明文修正版,无加密无后门,无需扩展(亲测)虚拟机可用
热门文章
- 《悲剧性选择》卡拉布雷西 epub+mobi+azw3
- 【学习摘记】马士兵HTML CSS_课时4-5_表格和表单
- 【Digger爬虫系列】用Digger抓取taptap游戏排行榜
- apache poi excel word 加密,不用借助其他jxcell.jar包
- java读取otf_在webpack中加载.otf字体文件的正确方法是什么?
- Hadoop是什么,Hadoop主要有哪几部分组成?
- 华硕路由搭建php网站,华硕路由器操作模式
- Idear创建Maven项目
- jQuery 遍历 - 同胞(siblings)
- vue3+tsx封装组件