RestTemplate Feign Ribbon

RestTemplate

springboot中封装了基于HttpClient的RestTemplate去调用http请求。能与Ribbon集成

    @Bean
    // 开启负载均衡
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

get请求

    使用占位符 

    String url ="http://provider/getObjParam?name={1}";
       
    ResponseEntity<Person> entity = restTemplate.getForEntity(url, Person.class,"hehehe...");

post请求

        String url ="http://provider/postParam";
           
        Map<String, String> map = Collections.singletonMap("name", " memeda");
         ResponseEntity<Person> entity = restTemplate.postForEntity(url, map, Person.class);

拦截器

需要实现ClientHttpRequestInterceptor接口

    public class LoggingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
​
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
            throws IOException {
            System.out.println("拦截啦!!!");
            System.out.println(request.getURI());
            ClientHttpResponse response = execution.execute(request, body);
            System.out.println(response.getHeaders());
            return response;
        }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add(new LoggingClientHttpRequestInterceptor());
        return restTemplate;
    }

Feign

springcloud的openFeign是基于RestTemplate实现的,且能与Ribbon集成

public interface ConsumerApi extends UserApi {
   
   /**
    * 这里 getMapping 是给Feign看的 get请求 user-provider/getMap?id={1}
    * @RequestParam("id") 也是给Feign看的
    * 
    * HttpClient Http协议
    * @param id
    * @return
    */
   @GetMapping("/getMap")
   Map<Integer, String> getMap(@RequestParam("id") Integer id);
}

引入pom 才可区分Get Post

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

Ribbon

客户端的负载均衡,配置策略选择服务。与网关Nginx不同,它不需要单独启动服务->选择服务。

可与Eureka搭配、自定义自己配置选择的节点信息。

超时

Feign默认支持Ribbon;Ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,使用Ribbon的重试机制

#连接超时时间(ms)
ribbon.ConnectTimeout=1000
#业务逻辑超时时间(ms)
ribbon.ReadTimeout=6000

重试

#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=1
#重试负载均衡其他的实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetriesNextServer=1
#是否所有操作都重试
ribbon.OkToRetryOnAllOperations=false

使用ribbon重试机制,请求失败后,每个6秒会重新尝试

Eureka Feign搭配

@FeignClient(name = "user-provider")
public interface ConsumerApi extends UserApi {
   
   /**
    * 这里 getMapping 是给Feign看的 get请求 user-provider/getMap?id={1}
    * @RequestParam("id") 也是给Feign看的
    * 
    * HttpClient Http协议
    * @param id
    * @return
    */
   @GetMapping("/getMap")
   Map<Integer, String> getMap(@RequestParam("id") Integer id);
}

Ribbon脱离Eureka

ribbon.eureka.enabled=false
ribbon.listOfServers=localhost:80,localhost:81
@Autowired
LoadBalancerClient lb;
lb.choose("provider");

负载均衡算法

默认实现:

ZoneAvoidanceRule(区域权衡策略):复合判断Server所在区域的性能和Server的可用性,轮询选择服务器。

其他规则:

BestAvailableRule(最低并发策略):会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。逐个找服务,如果断路器打开,则忽略。

RoundRobinRule(轮询策略):以简单轮询选择一个服务器。按顺序循环选择一个server。

RandomRule(随机策略):随机选择一个服务器。

AvailabilityFilteringRule(可用过滤策略):会先过滤掉多次访问故障而处于断路器跳闸状态的服务和过滤并发的连接数量超过阀值得服务,然后对剩余的服务列表安装轮询策略进行访问。

WeightedResponseTimeRule(响应时间加权策略):据平均响应时间计算所有的服务的权重,响应时间越快服务权重越大,容易被选中的概率就越高。刚启动时,如果统计信息不中,则使用RoundRobinRule(轮询)策略,等统计的信息足够了会自动的切换到WeightedResponseTimeRule。响应时间长,权重低,被选择的概率低。反之,同样道理。此策略综合了各种因素(网络,磁盘,IO等),这些因素直接影响响应时间。

RetryRule(重试策略):先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败则在指定的时间会进行重试,进行获取可用的服务。如多次获取某个服务失败,就不会再次获取该服务。主要是在一个时间段内,如果选择一个服务不成功,就继续找可用的服务,直到超时。

切换负载均衡策略

注解方式

@Bean
    public IRule myRule(){
        //return new RoundRobinRule();
        //return new RandomRule();
        return new RetryRule(); 

配置文件

针对服务定ribbon策略:

(服务名)provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
​

给所有服务定ribbon策略:

ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

属性配置方式优先级高于Java代码。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值