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采用轮询的策略