arpro生产部署了两台服务器,进行负载。都用的是同一个nacos命名空间。
只更新了一台。导致请求到了没有更新的那一台所以出现了404问题。
OpenFeign是Spring Cloud对Feign的二次封装,在Feign的基础而上支持了Spring MVC的注解。OpenFeign的@FeignClient可以解析Spring MVC的@RequestMapping @GetMapping 和 @PostMapping 等等。
准备一个Spring Cloud项目,包含一个消费者,一个服务提供者,使用nacos作为服务发现和配置中心
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 "服务调用成功";}}
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 {@Resourceprivate UserFeign userFegin;@PostMapping("feign")public String getDeviceListByPage() {return userFegin.findAll();}}
启动Invoker服务和Provider服务,在nacos上观察服务是否注册成功。
在arpro这个命名空间下我们可以看到两个服务都已经注册成功。
Invoker服务调用Provder服务中的findAll()方法
可以看到OpenFeign调用成功了。这就是OpenFeign最基本的应用了,是不是很简单。
我们熟悉了OpenFeign的基本运用之后,我们回到主题arpro生产部署了两台服务器,进行负载。都用的是同一个nacos命名空间。
只更新了一台。导致请求到了没有更新的那一台所以出现了404问题。
进行问题的复现,首先我们需要两套应用,我这里准备了test-feign-2 和 test-feign-5两个程序,在代码上完全一致,服务的端口号不一致。
首先我们需要将这两套应用都注册到nacos上。那么总共会有两个consumer服务和两个provider服务。
可以看到目前都已经注册上去了,两个两个consumer实例,和两个provider实例。
如果我们启动的一个consumer进行OpenFeign调用的话会由nacos进行负载均衡,根据权重进行分发,也就是两个Provider都有可能被调用。如果其中一个provider的代码版本相较于另一个provider落后(例如没有对应的接口),那么就会出现,如果请求到代码落后的这个provider那么就会出现404的问题。下面我们来进行模拟。
先看一下两个provider服务的权重,可以看到服务的权重都是1,这种情况下基本上是平均调用,如果调用4次,两个provider各自两次,并且成先后关系,先调用第一个,然后第二个,再第一个,再第二个。
注释掉findAll()方法;并重启该服务
@RestController
@RequestMapping("/user")
public class UserController {
// @GetMapping("/get")
// public String findAll() {
// return "服务调用成功";
// }}
consumer进行OpenFeign调用
第一次调用成功走的是代码正确的provider服务
第二次调用失败,走的是注释掉代码的provider服务
404问题成功复现
上一篇:二、MongoDB 的基本操作