我们之前使用ribbon完成负载均衡有什么缺点: restTemplate---url地址。
①代码可读性比较差
②编码风格和我们习惯的不同,习惯的编码风格service 调用dao service中注入dao,dao对象调用相应的方法
1、什么是OpenFeign
OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了Feign, Feign负载均衡默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
2、OpenFeign的使用
2.1 在order微服务中加入Feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 在主启动类上加开启注解
@SpringBootApplication
@EnableFeignClients //开启OpenFeign注解
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class,args);
}
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.3 创建Feign的接口
@FeignClient用于创建声明是API接口,该接口是RESTful风格的。Feign被设计成插拔式的,可注入其他组件和Feign一起使用。最典型的是如果Ribbon可用,Feign会和Ribbon相结合进行负载均衡。value()和name()一样,是被调用的服务的ServiceId
这里接口的方法参数要和product的controller接口的方法参数一致
@FeignClient(value = "springcloud-product")
public interface ProductFeign {
@GetMapping("product/getOne/{id}")
CommonResult getOne(@PathVariable Integer id);
}
2.4 修改controller层
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@Autowired
private ProductFeign productFeign;
@GetMapping("buy/{pid}/{num}")
public CommonResult buy(@PathVariable Integer pid,@PathVariable Integer num){
CommonResult result = productFeign.getOne(pid);
Product product = JSON.parseObject(JSON.toJSONString(result.getData()), Product.class);
Order order = new Order(2, "饺子皮", product.getPid(), product.getPname(), product.getPprice(), num);
Integer addOrder = orderService.addOrder(order);
if (addOrder>0){
return new CommonResult(2000,"购买成功",addOrder);
}
return new CommonResult(5000,"购买失败",null);
}
}
重启order微服务,查看效果,可以成功购买就说明配置成功