原先ribbon代码存在的问题:不规范,⻛格不统⼀,维护
性⽐较差什么是Feign
SpringCloud提供的伪http客户端(本质还是⽤http),封装了Http调⽤流程,更适合⾯向接⼝化让⽤Java接⼝注解的⽅式调⽤Http请求.不⽤像Ribbon中通过封装HTTP请求报⽂的⽅式调⽤ Feign默认集成了RibbonNacos⽀持Feign,可以直接集成实现负载均衡的效果
3.集成Feign实现远程⽅法调⽤
加⼊依赖
org.springframework.cloud
spring-cloud-starter-openfeign
配置注解
启动类增加 @EnableFeignClients
增加⼀个接⼝
//服务名称记得和nacos保持⼀样
@FeignClient(name="xdclass-video-service")
public interface VideoService {
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
//订单服务这边
@PostMapping(value = "/api/v1/video/save")
int saveVideo(@RequestBody Video video);
}
修改Controller
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private VideoService videoService;
@RequestMapping("find_by_id")
public Object findById(int videoId){
//Video video = restTemplate.getForObject("http://localhost:9000/api/v1/video/find_by_id?videoId="+videoId, Video.class);
//List list = discoveryClient.getInstances("xdclass-video-service");
//ServiceInstance serviceInstance = list.get(0);
//Video video = restTemplate.getForObject("http://xdclass-video-service/api/v1/video/find_by_id?videoId="+videoId, Video.class);
Video video = videoService.findById(videoId);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
videoOrder.setServerInfo(video.getServerInfo());
return videoOrder;
}
@PostMapping("save")
public Object save(@RequestBody Video video){
int rows = videoService.saveVideo(video);
Map map = new HashMap<>();
map.put("rows",rows);
return map;
}
}
Ribbon和feign两个的区别和选择
选择feign
默认集成了ribbon
写起来更加思路清晰和⽅便
采⽤注解⽅式进⾏配置,配置熔断等⽅式⽅便



