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)

 

posted @ 2020-05-09 17:51  mufeng07  阅读(149)  评论(0编辑  收藏  举报