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端口再开一个商品微服务

清空三个项目的日志
我们访问订单服务的新增接口可以看到商品数据已经正常拿到了

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




















![IDEA连接mysql5.7,报[08001] Could not create connection to database server错误](https://img-blog.csdnimg.cn/direct/e27f04c35c1f442cbdc31b6e038c7231.png)
