项目实战典型案例3——fegin调用404情况

简介: 项目实战典型案例3——fegin调用404情况

fegin调用404情况

一:背景介绍

arpro生产部署了两台服务器,进行负载。都用的是同一个nacos命名空间。

只更新了一台。导致请求到了没有更新的那一台所以出现了404问题。

二、OpenFeign基本介绍

OpenFeign是Spring Cloud对Feign的二次封装,在Feign的基础而上支持了Spring MVC的注解。OpenFeign的@FeignClient可以解析Spring MVC的@RequestMapping @GetMapping 和 @PostMapping 等等。

如何使用

  1. 启动类上加上@EnableFeignClients,扫描有@FeignClient注解的接口并注册到spring容器中。
    2.使用上我们只需要创建一个接口,并在接口上添加@FeignClient注解就可以了。该注解会对@RequestMapping注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡,和服务调用。

环境准备


准备一个Spring Cloud项目,包含一个消费者,一个服务提供者,使用nacos作为服务发现和配置中心


项目结构

provider

bootstrap.yml


启动类

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

UserController类

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/get")
    public String findAll() {
        return "服务调用成功";
    }
}

Invoker

bootstrap.yml



启动类

@SpringBootApplication
@EnableDiscoveryClient
//扫描标有@FeignClient的接口
@EnableFeignClients("com.ctsi.sddx.feign")
public class NacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class, args);
    }
}

Feign接口

@FeignClient(value = "arpro-provider-one")//value为Feign调用的服务名,也是注册到nacos中的服务名
public interface UserFeign {
    @GetMapping("user/get")
    String findAll();
}

UserController类

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserFeign userFegin;
    @PostMapping("feign")
    public String getDeviceListByPage() {
        return userFegin.findAll();
    }
}

运行项目

启动Invoker服务和Provider服务,在nacos上观察服务是否注册成功。

在arpro这个命名空间下我们可以看到两个服务都已经注册成功。


Invoker服务调用Provder服务中的findAll()方法

可以看到OpenFeign调用成功了。这就是OpenFeign最基本的应用了,是不是很简单。



三:feign调用404情况的复现

我们熟悉了OpenFeign的基本运用之后,我们回到主题arpro生产部署了两台服务器,进行负载。都用的是同一个nacos命名空间。
只更新了一台。导致请求到了没有更新的那一台所以出现了404问题。
进行问题的复现,首先我们需要两套应用,我这里准备了test-feign-2 和 test-feign-5两个程序,在代码上完全一致,服务的端口号不一致。

首先我们需要将这两套应用都注册到nacos上。那么总共会有两个consumer服务和两个provider服务。


可以看到目前都已经注册上去了,两个两个consumer实例,和两个provider实例。



进行OpenFeign调用

如果我们启动的一个consumer进行OpenFeign调用的话会由nacos进行负载均衡,根据权重进行分发,也就是两个Provider都有可能被调用。如果其中一个provider的代码版本相较于另一个provider落后(例如没有对应的接口),那么就会出现,如果请求到代码落后的这个provider那么就会出现404的问题。下面我们来进行模拟。


先看一下两个provider服务的权重,可以看到服务的权重都是1,这种情况下基本上是平均调用,如果调用4次,两个provider各自两次,并且成先后关系,先调用第一个,然后第二个,再第一个,再第二个。


修改端口号为9009的UserController的代码

注释掉findAll()方法并重启该服务

@RestController
@RequestMapping("/user")
public class UserController {
//    @GetMapping("/get")
//    public String findAll() {
//        return "服务调用成功";
//    }
}

进行测试

consumer进行OpenFeign调用

第一次调用成功走的是代码正确的provider服务



第二次调用失败,走的是注释掉代码的provider服务

404问题成功复现



四:总结

  1. 对生产环境需要有一份敬畏之心
  2. 对于两套环境的代码上生产,需要有严格的流程制度进行保证
    需要进行反馈闭环,如进行测试验证。
    技术手段上:
  3. 由于两套环境的代码都是一致的,是否可以统一构建,再推到各自的服务器上。这要之后一步操作,利用自动化来提高容错率如使用jenkins(统一构建,并推送到各自服务器中)对于OpenFeign的使用本篇博客只是提到了简单运用,如OpenFeign的超时处理熔断日志并没有提到。

五:升华

  1. 生产无小事,对生产环境需要有一份敬畏之心。
  2. 对于问题的处理方式我们可以有多种,从流程制度上、从技术手段上。
  3. 在写博客总学习到的,完成比完美更重要,在规定的时间内完成既定的任务,有空余时间再进行扩展。
目录
相关文章
|
4月前
|
Android开发 开发者
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
25 0
|
7月前
|
Unix Linux 测试技术
C++封装详解——从原理到实践
C++封装详解——从原理到实践
360 0
|
存储 前端开发 搜索推荐
自定义MVC框架【上篇】--原理
自定义MVC框架【上篇】--原理
93 0
|
NoSQL Java Redis
【项目实战典型案例】15.登录之后我加入的课程调用接口报错
【项目实战典型案例】15.登录之后我加入的课程调用接口报错
【项目实战典型案例】15.登录之后我加入的课程调用接口报错
【项目实战典型案例】03.fegin调用404情况
【项目实战典型案例】03.fegin调用404情况
|
存储 缓存 前端开发
项目实战典型案例13——学情页面逻辑问题
项目实战典型案例13——学情页面逻辑问题
70 0
|
存储 缓存 前端开发
【项目实战典型案例】13.学情页面逻辑问题
【项目实战典型案例】13.学情页面逻辑问题
|
设计模式 前端开发 Java
【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常
1. 阅读Spring官方文档,了解Spring框架的基本概念和使用方法。 2. 下载Spring源码,可以从官网或者GitHub上获取。 3. 阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。 4. 阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。 5. 调试Spring源码,可以通过IDEA等工具进行调试,了解Spring框架的内部实现和运行过程。 6. 参考Spring源码的测试用例,了解Spring框架的各个组件的使用方法和测试方法。 7. 参考Spring源码的设计模式和最佳实践,了解如何设计和实现高质量的Java应用程
115 1
|
设计模式 Java Spring
【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以
【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以
|
前端开发 Java 测试技术
【案例实战】高性能SpringBoot整合短线验证码发送(池化思想+异步结合)
【案例实战】高性能SpringBoot整合短线验证码发送(池化思想+异步结合)