当前位置: 首页 > news >正文

SpringCloud 之 Feign 以及 Feign 异常处理

在微服务中经常会出现这样一个场景,比如我有一个服务 admin,里面有着获取用户信息的接口,我有一个服务 service-a,需要用户信息,这时我需要通过 service-a 去调用 admin  服务的接口来获得用户信息

通过 Feign,我们不需要自己来写个 http 请求发送获取数据,也不需要引用其他服务来获取数据,做到服务间的解耦

Feign 会自动通过轮询的方式去进行负载均衡,且开启 Feign 的 Hystrix 支持后就会自动对宕机的服务进行拦截,防止雪崩效应

1.引入依赖

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

2.编写一个 admin 服务

这个服务端口号 8181 ,服务名是 service-admin

#配置端口号
server:
  port: 8181

spring:
  application:
    #配置服务名
    name: service-admin
@RestController
@RequestMapping(value = "/serviceAdmin")
public class AdminController {

    @GetMapping(value = "/admin")
    public String admin() {
        return "admin 信息";
    }
}

先来访问下

接下来编写一个服务A,来请求这个admin获取数据

3.编写 service-a 服务

这个服务端口号 8182 ,服务名是 service-a

#配置端口号
server:
  port: 8182

spring:
  application:
    #配置服务名
    name: service-a

启动类上加上 @EnableFeignClients 注解来启用 Feign

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

TestController:

@RestController
@RequestMapping(value = "/serviceTest")
public class TestController {

    @Resource
    private TestService testService;

    @GetMapping(value = "/admin")
    public Object admin() {
        return testService.admin();
    }
}

TestService:

通过 @FeignClient 注解会在 Eureka 中找到 service-admin 服务,然后根据路径找到对应的接口
所以 @FeignClient 的 name 是要访问的服务的服务名
@RequestMapping 的 value 是要访问的接口的路径
Feign会自动根据 服务名 + 路径的方式去发送 Http 请求来获取数据
这里的 TestService 不需要写实现,因为是去请求另外一个服务,本就没有实现

@FeignClient(name = "service-admin")
public interface TestService {

    @RequestMapping(value = "/serviceAdmin/admin", method = RequestMethod.GET)
    String admin();
}

把两个服务启动,就可以在 Eureka 上看到这两个服务了

先来访问下

可以看到通过 service-a 服务,成功访问 service-admin 的服务

4.结合 Hystrix 进行异常捕获处理

这时候 service-admin 的服务突然宕机了
虽然我这里已经做了,全局的异常捕获,但是出异常了我需要特殊的处理怎么办?

Feign 中启用 hystrix 支持

#配置端口号
server:
  port: 8182

#feign 配置
feign:
  hystrix:
    #开启feign的hystrix支持,默认是false
    enabled: true

spring:
  application:
    #配置服务名
    name: service-a

编写 TestFallBack 来进行异常处理
注意 @Component 注解别漏了

@Component
public class TestFallBack implements FallbackFactory<TestService> {
    @Override
    public TestService create(Throwable throwable) {
        return new TestService(){
            @Override
            public String admin() {
                return "请求没成功啊,数据没了!!!!!!!";
            }
        };
    }
}

在 TestService 的 @FeignClient 中引用 TestFallBack

@FeignClient(name = "service-admin", fallbackFactory = TestFallBack.class)
public interface TestService {

    @RequestMapping(value = "/serviceAdmin/admin", method = RequestMethod.GET)
    String admin();
}

现在再来通过 service-a 服务,调用下已经宕机的 service-admin 服务

可以看到,返回的不再是之前被捕获的异常,而是在出现异常后我进行的特殊处理
 

相关文章:

  • SpringCloud 之 Eureka 配置,Eureka 集群,Eureka 监听
  • 我的程序人生:码农
  • Vue 新手学习笔记:vue-element-admin 之按钮级权限管控
  • SpringBoot 集成 Druid 配置及数据库密码加密
  • MySQL 集群(一):Docker 搭建 MySQL,MySQL 主从同步搭建及踩坑
  • MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证
  • Jenkins + Docker 部署,使用,持续集成以及踩坑
  • Docker 删除 Exited 容器以及删除 none 镜像
  • LeetCode Java 深度优先算法(DFS)实现岛屿个数计算,附带详细分析
  • LeetCode Java 队列结合广度优先算法(BFS)实现岛屿个数计算,附带详细分析
  • navicat连接oracle报错:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK
  • Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳
  • RestTemplate 工具类
  • SpringCloud 之 Ribbon
  • SpringCloud 之 Hystrix 断路器,服务降级,自定义配置
  • [nginx文档翻译系列] 控制nginx
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Cookie 在前端中的实践
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • isset在php5.6-和php7.0+的一些差异
  • Java 内存分配及垃圾回收机制初探
  • Java程序员幽默爆笑锦集
  • Laravel Mix运行时关于es2015报错解决方案
  • nginx 负载服务器优化
  • PHP CLI应用的调试原理
  • ucore操作系统实验笔记 - 重新理解中断
  • V4L2视频输入框架概述
  • Vue.js 移动端适配之 vw 解决方案
  • Vue.js-Day01
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于 Cirru Editor 存储格式
  • 马上搞懂 GeoJSON
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用 @font-face
  • 原生Ajax
  • const的用法,特别是用在函数前面与后面的区别
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 仓管云——企业云erp功能有哪些?
  • ​什么是bug?bug的源头在哪里?
  • #{} 和 ${}区别
  • #if和#ifdef区别
  • (42)STM32——LCD显示屏实验笔记
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Java)【深基9.例1】选举学生会
  • (差分)胡桃爱原石
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (规划)24届春招和25届暑假实习路线准备规划
  • (四) 虚拟摄像头vivi体验
  • (一) storm的集群安装与配置
  • (译)计算距离、方位和更多经纬度之间的点
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)一些感悟