openfeign接口Springboot启动Bean报错未找到Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!

检查步骤

  1. 检查springboot启动类是否标注@EnableFeignClients注解,未标注该注解会导致无法注入bean
  2. 检查远程调用模块是否标注注解@FeignClient
  3. 检查@FeignClient注解中是否写了正确的微服务名称(区分大小写)
  4. 检查@FeignClient注解中标识的微服务是否启动

​ ​ 原因:此处接口可以声明@@Component注入ioc容器;并且启动类注解@EnableFeignClients若声明了接口所扫描package范围;则需要对应加上否则feign调用不生效启动bean报错s。

​ ​ OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便。

作用:

  • ​ OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。

  • ​ OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。

    入门使用:

<!--Open feign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  
<!--服务发现客户端-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>

  <!--web服务-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

主类主要注解:

@EnableFeignClients({"com.xx.xx", "com.xx.xx"})

代码示例:

A服务

controller层

@RequiredArgsConstructor
@Slf4j
@RestController
@RequestMapping("/inter/Demo")
public class Demo {
   @Autowired
   TestInterface testInterface;
   @PostMapping("/test")
   public String test(@RequestBody String param) {
      String str= testInterface.test(param);
      System.out.println("输出 str:{} " + str);
      return str;
   }
}

Interface

@FeignClient(
      name = "${xx.name:xx}",
      url = "${xx.application.xx.url:}",
      contextId = "testInterface"
)
public interface TestInterface {
   @PostMapping({"/test"})
   String test(@RequestBody String var1);
}

url是应用服务对应调用url

B服务

@FeignClient(
      name = "${xx.name:xx}",
      url = "${xx.application.xx.url:}",
      contextId = "testInterface"
)
public interface TestInterface {
   @PostMapping({"/test"})
   String test(@RequestBody String var1);
}
@RestController
public class TestInterfaceImpl implements TestInterface {

   @Override
   public String test(String var1) {
     
      System.out.println("var1:{} " + var1);
      return "OKOKOK";
   }
}
posted @ 2024-05-09 20:15  chillymint  阅读(2914)  评论(0)    收藏  举报