zoukankan      html  css  js  c++  java
  • springcloud中ribbon客户端负载均衡

    一、配置

    主流的LB方案可分成两类:

      一种是集中式LB, 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

       另一种是进程内LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    @Configuration
    public class EurekaRibbonConfig {
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

    重试机制

    spring:
      application:
        name: cloud-ribbon
    #hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
    #断路器的超时时间需要大于Ribbon的超时时间,不然不会触发重试

     

    @ConfigurationProperties("spring.cloud.loadbalancer.retry")
    public class LoadBalancerRetryProperties {
        //开启重试机制
        private boolean enabled = true;
    }

    参数配置

    对于Ribbon的参数通常有二种方式:全局配置以及指定客户端配置

    • 全局配置的方式很简单只需要使用ribbon.<key>=<value>格式进行配置即可。其中,<key>代表了Ribbon客户端配置的参数名,<value>则代表了对应参数的值。比如,我们可以想下面这样配置Ribbon的超时时间

    
    
    ribbon.ConnectTimeout=250

    全局配置可以作为默认值进行设置,当指定客户端配置了相应的key的值时,将覆盖全局配置的内容

    • 指定客户端的配置方式<client>.ribbon.<key>=<value>的格式进行配置.<client>表示服务名,比如没有服务治理框架的时候(如Eureka),我们需要指定实例清单,可以指定服务名来做详细的配置,

    
    
    user-service.ribbon.listOfServers=localhost:8080,localhost:8081,localhost:8082

    对于Ribbon参数的key以及value类型的定义,可以通过查看com.netflix.client.config.CommonClientConfigKey类。

    RestTemplate详解

    Get请求

    第一种:getForEntity函数

    <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
    url为请求地址,responseType为请求响应body的包装类型,uriVariables为url中的参数绑定 比如:
    http://USER-SERVICE/user?name={1}
    <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
    url为请求地址,responseType为请求响应body的包装类型,uriVariables为url中的参数绑定 需要在占位符中指定Map中参数的key值,比如:
    http://USER-SERVICE/user?name={name}
    <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)
     url为JDK java.net包下

    第二种;getForObject函数

    <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
    url为请求地址,responseType为请求响应body的包装类型,uriVariables为url中的参数绑定 比如:
    http://USER-SERVICE/user?name={1}
    <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
    url为请求地址,responseType为请求响应body的包装类型,uriVariables为url中的参数绑定 需要在占位符中指定Map中参数的key值,比如:
    http://USER-SERVICE/user?name={name}
    <T> T getForObject(URI url, Class<T> responseType)
       url为JDK java.net包下

    POST请求

    第一种:postForEntity函数

     <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
      大部分和getForEntity一致,request可以是一个普通对象,也可以是一个HttpEntity对象,若一个普通对象,非HttpEntity对象,将会把请求对象转换为一个HttpEntity对象来处理;若是一个HttpEntity对象,当成一个完成的HTTP请求对象来处理,不仅包含body,还有header
    <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
    <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)

    第二种:postForObject函数

    <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
      跟getForObject类似
      <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
    <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType)

    第三种:postForLocation函数

    URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
    返回新资源的URI
    URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
    URI postForLocation(URI url, @Nullable Object request)

    PUT请求

    void put(String url, @Nullable Object request, Object... uriVariables)
    void put(String url, @Nullable Object request, Map<String, ?> uriVariables)
    void put(URI url, @Nullable Object request)
     没有返回内容

    DELETE请求

    void delete(String url, Object... uriVariables)
    void delete(String url, Map<String, ?> uriVariables)
    void delete(URI url)
  • 相关阅读:
    atitit.解决SyntaxError: missing ] after element list"不个object 挡成个str eval ....
    atitit.软件开发概念过滤和投影 数据操作
    atitit.词法分析的实现token attilax总结
    Atitit.软件gui按钮and面板通讯子系统(区) github 的使用....
    Atitit.解决org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
    atitit.故障排除 当前命令发生了严重错误。应放弃任何可能产生的结果sql server 2008
    Atitit.注解解析(1)词法分析 attilax总结 java .net
    atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
    atitit.报表最佳实践oae 与报表引擎选型
    Atitit. 解决unterminated string literal 缺失引号
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12859165.html
Copyright © 2011-2022 走看看