Appearance
主要讲解Ribbon支持的负载均衡策略,以及组件内容使用OpenFeign进行RPC远程调用。
Ribbon支持的负载均衡策略介绍
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(默认) |
RetryRule | 重试策略 | 当选择server不成功,短期内尝试选择一个可用的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
WeightedResponseTimeRule | 响应时间加权重策略 | 根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越大,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server |
订单服务增加配置
yaml
# 使用随机负载均衡
xdclass-video-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 注意:订单服务中api方法名那边个save方法,还原为findById,备课的时候忘记还原,不影响使用
DANGER
- 如果每个机器配置一样,则建议不修改策略 (推荐)
- 如果部分机器配置强,则可以改为 WeightedResponseTimeRule
OpenFeign的基本使用
官方文档:https://spring.io/projects/spring-cloud-openfeign
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置注解,启动类增加@EnableFeignClients
增加一个接口
java
订单服务增加接口,服务名称记得和nacos保持一样
@FeignClient(name="xdclass-video-service")
编写代码
java
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
GET方式案例
视频微服务
java
@RestController
@RequestMapping("api/v1/video")
public class VideoController {
@Autowired
private VideoService videoService;
@RequestMapping("find_by_id")
public Video findById(int videoId){
return videoService.findById(videoId);
}
}
订单微服务调用视频微服务
Controller
java
@RestController
@RequestMapping("api/v1/order")
public class OrderController {
@Autowired
private VideoService videoService;
@RequestMapping("/find_by_id")
public Video findOrderById(Integer id){
return videoService.findById(id);
}
}
Service
java
@FeignClient(name = "xk857-video-service")
public interface VideoService {
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
}
POST方式
java
@PostMapping(value = "/api/v1/video/save")
Video saveVideo(@RequestBody Video video);
@PostMapping("save")
public Object save(@RequestBody Video video){
System.out.println(video.getTitle());
return video;
}