目录
一、背景介绍
二、Fegin调用
Invoker模块
1.引入的依赖
2.bootstrap.yml文件
3.启动类
4.Feign接口
5.UserController类
Provider模块
1.引入的依赖
2.bootstrap.yml文件
3.启动类
4.UserController类
运行程序
三、问题复现
1.准备两个程序,分别为test-feign-2 和 test-feign-5。在代码上完全一致,服务的端口号不一致。
2. 将四个服务都注册到nacos上
3.nacos进行负载均衡配置,根据权重进行分发
4.修改 服务端口为9009的代码注释掉
5.调用服务,验证报错情况
在项目当中我们经常使用Nacos来管理配置文件。Nacos从中起到了两个作用一个是注册中心,一个是配置中心。配置中心将配置从应用中抽离出来,交给nacos统一的来管理配置,可以配置多套环境,发生改变各个微服务各自到nacos配置中心拉取相关配置,实现配置中心化避免频繁修改配置文件;作为注册中心实现服务调用者对服务提供者远程调用,项目中出现了两台使用同一个命名空间的nacos只更新了一台,导致请求到了没更新的那一台导致了404问题的出现。
准备一个Spring Cloud项目,包含一个消费者,一个服务提供者,使用nacos作为服务发现和配置中心
Invoker
8
8
1.8
0.2.10
Greenwich.SR2
2.1.0.RELEASE
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring.cloud.alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
org.apache.commons
commons-lang3
org.projectlombok
lombok
1.18.10
provided
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-actuator
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.springframework.cloud
spring-cloud-starter-openfeign
@SpringBootApplication
@EnableDiscoveryClient
//扫描标有@FeignClient的接口
@EnableFeignClients("com.ctsi.sddx.feign")
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
@FeignClient(value = "arpro-provider-one")//value为Feign调用的服务名,也是注册到nacos中的服务名
public interface UserFeign {
@GetMapping("user/get")
String findAll();
}
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserFeign userFegin;
@PostMapping("feign")
public String getDeviceListByPage() {
return userFegin.findAll();
}
}
provider
8
8
Greenwich.SR2
2.1.0.RELEASE
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring.cloud.alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.3.0
mysql
mysql-connector-java
8.0.11
org.projectlombok
lombok
1.18.10
provided
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-actuator
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.boot
nacos-config-spring-boot-starter
0.2.1
com.alibaba.boot
nacos-discovery-spring-boot-starter
0.2.1
@EnableDiscoveryClient
@SpringBootApplication
public class TestFeignApplication {
public static void main(String[] args) {
SpringApplication.run(TestFeignApplication.class, args);
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/get")
public String findAll() {
return "服务调用成功";
}
}
启动两个服务,在nacos上可以看到两个服务都已经注册上去了。
通过Invoker服务的UserFeign接口就可以调用到Provider服务的findAll方法了。
@RestController
@RequestMapping("/user")
public class UserController {
// @GetMapping("/get")
// public String findAll() {
// return "服务调用成功";
// }
}
第一次调用,走的是没有注释代码的服务
第二次调用,走的是注释代码的服务,产生了404的报错
四、总结提升
部署了两套代码一定要确保内容的一致性。如果不一致通过负载均衡就会造成两次情况的结果不一样,甚至报错的情况。做事情要有闭环反馈。减少因为疏忽而产生的一些问题和隐患。