1.Ribbon负载均衡源码
2.微服务新⼀代负载均衡组件Open-Feign
- 原先ribbon代码存在的问题:不规范,⻛格不统⼀,维护
性⽐较差 - 什么是Feign
SpringCloud提供的伪http客户端(本质还是⽤http),封装了Http调⽤流程,更适合⾯向接⼝化让⽤Java接⼝注解的⽅式调⽤Http请求.不⽤像Ribbon中通过封装HTTP请求报⽂的⽅式调⽤ Feign默认集成了Ribbon - Nacos⽀持Feign,可以直接集成实现负载均衡的效果
3.集成Feign实现远程⽅法调⽤
- 加⼊依赖
<!--引入feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 配置注解
启动类增加 @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<ServiceInstance> 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
写起来更加思路清晰和⽅便
采⽤注解⽅式进⾏配置,配置熔断等⽅式⽅便