OpenFeign介绍

OpenFeign:将提供者的restful服务伪装成接口进行消费,消费者只需要通过feign接口+注解就可以直接调用提供者的服务,而无需通过restTemplate方式进行调用

注意一点,openFeign内置了负载均衡器-Ribbon

消费者:

1、@EnableFeignClients,开启feign

2、@FeignClien("服务名"),声明当前的接口是一个Feign接口,调用的时候通过指定的服务名处理请求

提供者

将服务注册到注册中心

注意:Feign 支持对请求和响应进行 Gzip 压缩以提高通信效率
# 设置压缩的内容数据类型
feign.compression.request.mime-types: text/xml,application/xml,application/json
# 压缩触发的最小大小,1kb压缩没有意义
feign.compression.request.min-request-size: 2048

Ribbon负载均衡策略

        负载均衡策略的定义接口 IRule
        Ribbon默认采用轮询的负载均衡策略,通过修改消费者的配置文件或者修改消费者的配置类来修改默认的负载均衡策略
# 第一种改法:指定要使用的负载均衡策略
# <clientName>.<clientConfigNameSpace>.NFLoadBalancerRuleClassName
msc-provider-depart:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    /**
     * 第二种方式
     * 配置全局的负载均衡策略
     * @return
     */
    @Bean
    public IRule iRule(){
        IRule rule = new RandomRule();
        return rule;
    }

自定义负载均衡策略:在所有可用的provider中排除掉指定端口的provider,然后再剩余的provider进行随机选择

    @Bean
    public IRule iRule(){
//        使用自定义的负载均衡策略
        List<Integer> excludePorts= Lists.newArrayList(8082);
        CustomRule rule = new CustomRule(excludePorts);
        return rule;
    }

自定义负载均衡策略CustomRule

/**
 * 自定义负载均衡算法
 */
public class CustomRule implements IRule {
    private ILoadBalancer lb;
    private List<Integer> excludePorts;

    public CustomRule() {
    }

    public CustomRule(List<Integer> excludePorts) {
        this.excludePorts = excludePorts;
    }

    @Override
    public void setLoadBalancer(ILoadBalancer lb) {
        this.lb = lb;
    }

    @Override
    public ILoadBalancer getLoadBalancer() {
        return lb;
    }

    /**
     * 目标:自定义负载均衡策略:从所有可用的provider中排除掉指定端口号的provider,剩余provider进行随机选择
     * 实现步骤:
     * 1.获取到所有Server
     * 2.从所有Server中排除掉指定端口的Server后,剩余的Server
     * 3.从剩余Server中随机选择一个Server
     */
    @Override
    public Server choose(Object key) {
        // 1.获取到所有Server
        List<Server> servers = lb.getReachableServers();
        // 2.从所有Server中排除掉指定端口的Server后,剩余的Server
        List<Server> availableServers = this.getAvailableServers(servers);
        // 3.从剩余Server中随机选择一个Server
        return this.getAvailableRandomServers(availableServers);
    }

    private List<Server> getAvailableServers(List<Server> servers) {
        // 若没有指定要排除的port,则返回所有Server
        if(excludePorts == null || excludePorts.size() == 0) {
            return servers;
        }
        List<Server> aservers = servers.stream()
                // filter()
                // noneMatch() 只有当流中所有元素都没有匹配上时,才返回true,只要有一个匹配上了,则返回false
                .filter(server -> excludePorts.stream().noneMatch(port -> server.getPort() == port))
                .collect(Collectors.toList());
        return aservers;
    }

    private Server getAvailableRandomServers(List<Server> availableServers) {
        // 获取一个[0,availableServers.size())的随机数
        int index = new Random().nextInt(availableServers.size());
        return availableServers.get(index);
    }
}

Ribbon内置的负载均衡策略

1、RoundRobin'Rule

轮询策略,默认。若通过轮训的方式找到可用的provider

2、RandomRule

随机策略,从所有可用的provider中随机选择一个

3、RetryRule

重试策略,首先使用RoundRobinRule的方式获取server,如果获取失败,则在限定的时间内重试

4、BestAvailableRule

最可用策略,选择并发量最小的provider,便利所有的server,选择当前连接数量最小的server

5、AvailabilityFilteringRule

最可用过滤策略,过滤掉处于熔断状态的server和已经超过连接极限的server,再对剩余的server采用轮询的策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值