负载均衡Ribbon和远程调用OpenFeign

2021-08-03 SpringCloudSpringCloudAlibaba

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

# 订单服务增加配置

# 使用随机负载均衡
xdclass-video-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 注意:订单服务中api方法名那边个save方法,还原为findById,备课的时候忘记还原,不影响使用

  1. 如果每个机器配置一样,则建议不修改策略 (推荐)
  2. 如果部分机器配置强,则可以改为 WeightedResponseTimeRule

# OpenFeign的基本使用

官方文档:https://spring.io/projects/spring-cloud-openfeign (opens new window)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置注解,启动类增加@EnableFeignClients

# 增加一个接口

订单服务增加接口,服务名称记得和nacos保持一样
@FeignClient(name="xdclass-video-service") 

编写代码

@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);

# GET方式案例

视频微服务

@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

@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

@FeignClient(name = "xk857-video-service")
public interface VideoService {

    @GetMapping(value = "/api/v1/video/find_by_id")
    Video findById(@RequestParam("videoId") int videoId);
}

# POST方式

@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;
}
上次更新: 2 年前