远程调用Feign

1.什么是Feign

  • Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务
    一样简单, 只需要创建一个接口并添加一个注解即可。
  • Nacos很好的兼容了Feign, Feign默认集成了 LoadBalancer, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

2. 什么是OpenFeign

  • OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。
  • OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。他是Feign的升级版。

3.订单微服务集成Feign

1.在shop-order-server项目的pom文件加入Fegin的依赖

<!--fegin组件-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.在启动类OrderServer.java上添加Fegin的扫描注解,注意扫描路径(默认扫描当前包及其子包)

/**
 * @author lk
 * @version 1.0.0
 * @Description TODO
 * @createTime 2025/5/8 4:19
 */
@SpringBootApplication
@EnableFeignClients
public class OrderServer {
    public static void main(String[] args) {
        SpringApplication.run(OrderServer.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3.在shop-order-server项目中新增接口ProductFeignApi

package com.sun.fegin;

import com.sun.pojo.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author lk
 * @version 1.0.0
 * @Description TODO
 * @createTime 2025/5/8 21:04
 */
//name的名称一定要和商品服务的服务名保持一致
@FeignClient(name = "product-service",path = "/product")
public interface ProductFeignApi {
    @RequestMapping("/get")
    Product findByPid(@RequestParam("pid") Long pid);
}

4.修改OrderServiceImpl.java的远程调用方法

@Service
@Slf4j
public class OrderServiceImpl implements OrderService{

    @Autowired
    private OrderDao orderDao;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private ProductFeignApi productFeignApi;

    @Override
    public Order createOrder(Long productId, Long userId) {
        log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", productId);
        //远程调用商品微服务,查询商品信息
        Product product = productFeignApi.findByPid(productId);
        log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));
        //创建订单并保存
        Order order = new Order();
        order.setUid(userId);
        order.setUsername("叩丁狼教育");
        order.setPid(productId);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        orderDao.save(order);
        log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));
        return order;
    }
}

5.重启订单服务,并验证.

### 微服务Feign远程调用使用教程、原理、配置与示例 #### 什么是 FeignFeign 是一种声明式的 Web Service 客户端工具,它使得编写 HTTP API 调用变得更加简单。通过 Feign,开发人员可以像本地方法一样调用远程的服务接口[^1]。 --- #### Feign 的工作原理 Feign 实现了基于接口的动态代理机制,当程序运行时会根据定义好的接口生成具体的实现类并完成远程服务的调用过程。其底层依赖于 Ribbon 和 Hystrix 来提供负载均衡和服务熔断的功能[^2]。 --- #### 开启 Feign 功能的核心注解 为了启用 Feign 的功能,在 Spring Boot 应用中的启动类上需要添加 `@EnableFeignClients` 注解。该注解的作用是指定哪些包下的接口会被扫描为 Feign Client 接口,并自动生成对应的代理对象[^4]。 ```java @SpringBootApplication @EnableFeignClients(basePackages = "com.example.feign.clients") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- #### 定义远程服务调用接口 通过 `@FeignClient` 注解标注的接口用来描述如何访问目标服务的方法签名以及 URL 映射关系。下面是一个简单的例子: ```java @FeignClient(name = "producer-service", url = "http://localhost:8081") public interface ProducerServiceClient { @GetMapping("/api/data/{id}") String getDataById(@PathVariable("id") Long id); @PostMapping("/api/data/save") ResponseEntity<String> saveData(@RequestBody DataRequest request); } ``` 上述代码片段展示了如何利用 Feign 对指定路径发起 GET 请求和 POST 请求[^3]。 --- #### 配置 OpenFeign 日志增强 如果希望查看更详细的调试信息,则可以通过设置日志级别来观察每次请求的具体情况。例如修改 application.yml 文件如下所示: ```yaml logging: level: com.example.feign.clients.ProducerServiceClient: DEBUG ``` 同时还需要确保项目引入了 spring-cloud-starter-openfeign 依赖项以便支持高级特性如日志记录等功能。 --- #### 解决常见问题——跨服务认证失败 在一个分布式系统里实施统一身份验证之后可能会遇到一个问题:当前用户的身份令牌无法自动传递给下游服务造成未授权错误。针对这种情况有两种解决方案可供选择: - **手动复制 Header** :可以在 Consumer 端显式地把 Token 添加到每一次对外部资源发出的新 Request 中去; - **借助拦截器自动化处理** : 创建一个专门负责附加必要 Headers 的 Interceptor 类型 Bean 并注册至上下文中即可[^5]。 以下是第二种方式的一个具体实现案例: ```java @Component public class AuthTokenInterceptor implements RequestInterceptor { private final AuthenticationHolder authHolder; public AuthTokenInterceptor(AuthenticationHolder authHolder){ this.authHolder=authHolder; } @Override public void apply(RequestTemplate template) { Optional<Authentication> optionalAuth = authHolder.get(); if(optionalAuth.isPresent()){ template.header("Authorization","Bearer "+optionalAuth.get().getCredentials()); } } } ``` --- #### 总结 综上所述,Feign 提供了一种优雅的方式来简化微服务架构下不同应用之间的交互流程。通过对以上知识点的学习可以帮助开发者快速掌握它的基本概念及其实际应用场景下的操作步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值