Skip to content

主要讲解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

  1. 如果每个机器配置一样,则建议不修改策略 (推荐)
  2. 如果部分机器配置强,则可以改为 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;
}