SpringCloud 无法调用内部服务的问题:EnableFeignClients的basePackages

 

参考https://blog.youkuaiyun.com/embbls/article/details/94721283

springcloud的openFeign,在application上需要添加@EnableFeignClients注解.却没有明确指明basePackages的路径是无效的,必spring ioc不会自动为外部引入的其他服务jar包里, 标注了@FeignClient注解的interface自动生成bean对象.

正确的做法应该是明确指定basePackages的值,比如像这样:

图片参考:https://blog.youkuaiyun.com/embbls/article/details/94721283

 

多个的话,是这种

实战项目主页:https://edu.youkuaiyun.com/lecturer/1141

 

 

 

### 如何在 Spring Cloud 中使用 Nacos 进行服务调用 #### 1. 准备工作 为了实现基于 Nacos 的服务发现和服务调用功能,需要完成以下配置: - **下载并启动 Nacos Server** 需要先安装 Nacos 并运行其服务器作为服务注册中心。可以通过官方文档获取详细的部署指南[^1]。 - **引入依赖项** 在项目的 `pom.xml` 文件中添加必要的 Maven 依赖项来支持 Spring Cloud 和 Feign 功能: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` #### 2. 修改应用配置文件 编辑微服务的应用配置文件 `application.yml` 或 `application.properties` 来指定 Nacos 地址以及集群名称等参数。例如,在订单服务 (`order-service`) 中可以这样设置: ```yaml spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 # Nacos 服务端地址 cluster-name: HZ # 设置集群名为 HZ ``` 上述配置指定了本地主机上的 Nacos 实例及其监听端口,并定义了一个特定的集群名用于区分不同的环境或数据中心[^2]。 #### 3. 启用 Feign 客户端 为了让应用程序能够通过 HTTP 接口与其他服务通信,需启用 OpenFeign 支持。这通常是在主类上加上注解即可实现自动化装配过程。 ```java @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients // 开启 Feign 功能的支持 public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } } ``` #### 4. 创建 Feign Client 创建一个接口用来声明远程方法调用的方式。假设有一个提供商品信息的服务叫做 product-service,则可以在项目里定义如下形式的一个客户端代理类: ```java @FeignClient(name = "product-service", fallbackFactory = ProductFallbackFactory.class) public interface ProductService { @GetMapping("/products/{id}") String getProductById(@PathVariable("id") Long id); } ``` 这里我们还设置了熔断机制使用的回退工厂类 `ProductFallbackFactory` ,当目标服务不可达时会触发该逻辑处理异常情况。 #### 5. 注册到 Nacos 最后一步就是让所有的微服务都向同一个 Nacos 注册中心报告自己的存在状态。每当一个新的实例上线或者下线都会更新至内部维护的地图结构当中去[^3]。 --- ### 示例代码展示完整的流程 以下是综合以上各部分内容后的完整示例程序片段: ```java // 主启动类 @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages="com.example.clients") public class DemoApplication { public static void main(String[] args){ SpringApplication.run(DemoApplication.class,args); } } // Feign 调用接口 package com.example.clients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(value="user-service",fallback=UserClientFallback.class) public interface UserClient{ @GetMapping("/users/{userId}") String getUserInfo(@PathVariable("userId")String userId); } // 控制器层演示如何发起请求 @RestController @RequestMapping("/orders") public class OrderController{ private final UserService userService; @Autowired public OrderController(UserService userService){ this.userService=userService; } @GetMapping("/{orderId}/details") public ResponseEntity<String> getOrderDetailsWithUserInfo(@PathVariable Integer orderId,@RequestParam(required=false,name="includeUser")Boolean includeUserFlag){ if(includeUserFlag!=null && Boolean.TRUE.equals(includeUserFlag)){ try{ return new ResponseEntity<>(userService.getUserByOrderId(orderId),HttpStatus.OK); }catch (Exception e){ log.error("Failed to fetch user details.",e); throw new RuntimeException(e.getMessage()); } }else{ return new ResponseEntity<>("Order Details without User Info", HttpStatus.ACCEPTED); } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构师Array

Array老师视频专栏更精彩~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值