SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign

OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装,在微服务中的服务调用发送网络请求起到了重要的作用,简化了开发,可以让我们跟写接口一样调其他服务。

并且OpenFeign内置了Ribbon实现负载均衡。

官方文档:Spring Cloud OpenFeign 中文文档 (springdoc.cn)

2、OpenFeign的使用

2.1准备

我们准备了两个微服务,一个商品微服务一个订单微服务。

商品微服务为根据id查询商品详细信息,订单微服务则传入商品id、用户id对商品服务进行调用生成订单。

使用OpenFegin是需要通过注册中心来访问服务的,消费者想通过服务名称调用提供者,就需要注册中心的服务发现功能。

这里我们使用Nacos,Nacos可以参考SpringCloud之Nacos的学习、快速上手-CSDN博客

2.2使用步骤

2.2.1引入依赖

        <!--nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>

        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>

在order-service和product-service都引入上面两个依赖

在maven管理中我们可以看到OpenFeign已经集成了负载均衡ribbon

启动Nacos服务

2.2.2application.yml

订单微服务

server:
  port: 8091    #端口
spring:
  application:
    name: order-service    #服务名称
  cloud:
    nacos:     #配置nacos服务地址
      discovery:
        server-addr: localhost:8848

商品微服务

2.2.3开启OpenFeign

我们需要在消费者的启动类上加上注解@EnableFeignClients

因为我们是在订单服务中调用商品服务,所以我们在订单服务的启动类上加上该注解

@SpringBootApplication
@EnableFeignClients
public class OrderServer {
    public static void main(String[] args) {
        SpringApplication.run(OrderServer.class,args);
    }
    
}

2.2.4业务逻辑

在商品微服务中有个根据商品id查询商品详细信息接口

在订单微服务中则为新增订单        用户下单--->根据商品id获取商品信息---->返回下单信息

商品微服务

订单微服务

2.2.5使用OpenFeign发起请求

定义接口ProductFeignApi

使用注解@FeignClient()中的name属性则为需要调用的服务名称

@FeignClient(name = "product-service")
public interface ProductFeignApi {

    @RequestMapping("/product/{pid}")
    Product findByPid(@PathVariable("pid") Long pid);
}

在OrderServiceImpl中调用

@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    @Autowired
    private OrderDao orderDao;
    @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;
    }
}

2.2.6启动项目测试

为了测试负载均衡我们使用不同端口启动商品服务

右键服务点击复制配置        

输入-Dserver.port=8082以8082端口再开一个商品微服务

清空三个项目的日志

我们访问订单服务的新增接口可以看到商品数据已经正常拿到了

多访问几次,可以看到两个商品服务的控制台都有查询日志的输出,则说明负载均衡也有被使用