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
类。
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)