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 {@Autowiredprivate OrderDao orderDao;@Autowiredprivate ProductFeignApi productFeignApi;@Overridepublic 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端口再开一个商品微服务
清空三个项目的日志
我们访问订单服务的新增接口可以看到商品数据已经正常拿到了
多访问几次,可以看到两个商品服务的控制台都有查询日志的输出,则说明负载均衡也有被使用