目录
一、背景介绍
二、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 {@Resourceprivate 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的报错
四、总结提升
部署了两套代码一定要确保内容的一致性。如果不一致通过负载均衡就会造成两次情况的结果不一样,甚至报错的情况。做事情要有闭环反馈。减少因为疏忽而产生的一些问题和隐患。