客户端负载均衡: Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Hetflix Ribbon实现。
客户端负载均衡
负载均衡是对一个系统的高可用、网络压力的缓解、和处理能力扩容的重要手段之一。通常说的负载均衡都指的是服务端负载均衡,主要分为软件负载均衡和硬件负载均衡。硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,比如F5。而软件负载均衡则是通过在服务器中安装一些具有负载均衡功能或者模块的软件来完成请求分发工作,比如Nginx。服务端负载均衡都是维护一个下挂可用的服务器清单,通过某种算法(轮询、按照权重、按照流量等)从可用的服务器清单中取出一台服务器的地址,然后进行转发。客户端负载均衡不同与服务端负载均衡的是所有的客户端都要维护自己要访问的服务器清单,这些清单都来自于注册中心。
Spring Cloud Ribbon使用客户端负载均衡
- 服务提供者只需要启动多个服务实例并注册一个注册中心或者多个相关联的服务注册中心
- 服务注册者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
RestTemplate详解
GET请求(2种方法)
getForEntity函数
该方法返回ResponseEntity(Spring对HTTP请求相应的封装)
getForEntity(String url, Class
responseType, Object… uriVariables)
url : 请求的地址
responseType : 请求响应体body的包装类型
uriVariables : url中的参数绑定,数组内容替代{1}这样的占位符。
例:1
getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi");
getForEntity(String url, Class
responseType, Map uriVariables)
与1中只有uriVariables不同,替代的是制定参数的{key}这样的占位符。
例:1
getForEntity("http://USER-SERVICE/user?name={name}",String.class,new HashMap<>().put("name","peter"));
- getForEntity(URI url, Class
responseType)
使用URI(统一资源标识符)来代替url
getForObject函数
可以认为是getForEntity的进一步封装,通过HttpMessageConverterExtractor对HTTP的请求响应体进行对象转换。
- getForObject(String url, Class
responseType, Object… uriVariables) - getForObject(String url, Class
responseType, Map uriVariables) - getForObject(URI url, Class
responseType)
POST请求(3种方法)
posrFotEntity函数
绝大部分和getForEntity用法相同
- postForEntity(String url, Object request, Class
responseType, Object… uriVariables)
request : 可以是一个普通对象(REstTemlate会将其转化成一个HttpEntity来处理,类型为Object,request的内容被视为body内容),也可以是一个HttpEntity对象(完整的Http请求,包含body和header) - postForEntity(String url, Object request, Class
responseType, Map uriVariables) - postForEntity(URI url, Object request, Class
responseType)
postForObject函数
与getForObject类似
postForLocation函数
以POST方式提交资源,并返回新资源的URI。因为返回新资源的URI,因此不需要指定responseType。
- postForLocation(String url, Object request, Object… uriVariables)
- postForLocation(String url, Object request, Map
uriVariables) - postForLocation(URI url, Object request)
PUT请求
put函数
put方法无返回值,因此也就没有responseType,其他与postForObject类似
- put(String url, Object request, Object… uriVariables)
- put(String url, Object request, Map
uriVariables) - put(URI url, Object request)
DELETE请求
delete函数
通常使用唯一标识,因此无需request的body信息。
- delete(String url, Object… uriVariables)
- delete(String url, Map
uriVariables) - delete(URI url)