OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装,在微服务中的服务调用发送网络请求起到了重要的作用,简化了开发,可以让我们跟写接口一样调其他服务。
并且OpenFeign内置了Ribbon实现负载均衡。
官方文档:Spring Cloud OpenFeign 中文文档 (springdoc.cn)
我们准备了两个微服务,一个商品微服务一个订单微服务。
商品微服务为根据id查询商品详细信息,订单微服务则传入商品id、用户id对商品服务进行调用生成订单。
使用OpenFegin是需要通过注册中心来访问服务的,消费者想通过服务名称调用提供者,就需要注册中心的服务发现功能。
这里我们使用Nacos,Nacos可以参考SpringCloud之Nacos的学习、快速上手-CSDN博客
<!--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服务
订单微服务
server:
port: 8091 #端口
spring:
application:
name: order-service #服务名称
cloud:
nacos: #配置nacos服务地址
discovery:
server-addr: localhost:8848
商品微服务
我们需要在消费者的启动类上加上注解@EnableFeignClients
因为我们是在订单服务中调用商品服务,所以我们在订单服务的启动类上加上该注解
@SpringBootApplication
@EnableFeignClients
public class OrderServer {
public static void main(String[] args) {
SpringApplication.run(OrderServer.class,args);
}
}
在商品微服务中有个根据商品id查询商品详细信息接口
在订单微服务中则为新增订单? ? ? ? 用户下单--->根据商品id获取商品信息---->返回下单信息
商品微服务
订单微服务
定义接口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;
}
}
为了测试负载均衡我们使用不同端口启动商品服务
右键服务点击复制配置????????
输入-Dserver.port=8082以8082端口再开一个商品微服务
清空三个项目的日志
我们访问订单服务的新增接口可以看到商品数据已经正常拿到了
多访问几次,可以看到两个商品服务的控制台都有查询日志的输出,则说明负载均衡也有被使用