SpringCloud--Ribbon--使用demo

Posted liconglong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud--Ribbon--使用demo相关的知识,希望对你有一定的参考价值。

  SpringCloud Ribbon是一个基于Http和Tcp的客户端负载工具。

  负载均衡可以是服务端负载也可以是客户端负载,服务端负载又可以是物理负载或是软件负载,服务端物理负载:F5,服务端软件负载:nginx,他们都是在各自下面维护一个可用的服务端清单,通过心跳检测来剔除故障的服务节点以保证清单中都是可以正常访问的服务端节点。

  而客户端负载均衡和服务端负载均衡最大的不同点在于上面提到的服务清单所存储的位置。

  通过SpringCloud的封装,我们在为服务架构中使用客户端负载均衡调用只需要两步即可:

  (1)服务提供者只需要启动多个服务实例并注册到注册中心或是多个相关联的服务注册中心

  (2)服务消费者直接调用被@LoadBlanced注解修饰过的RestTemplate来实现面向服务的接口调用

  具体的使用方法已经在SpringCloud--Eureka--搭建中已经演示,但是在演示中,只演示了一种调用方法,下面就详细介绍一下RestTemplate的几种请求类型

请求类型 方法 描述 重载方法
get getForEntity 获取对象为ResponseEntity <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
<T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)
getForObject 获取对象为Body体的内容 <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
<T> T getForObject(URI url, Class<T> responseType)
post postForEntity 获取对象为ResponseEntity

<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)

<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 获取对象为Body体的内容 <T> T postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables)
<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 URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
URI postForLocation(URI url, @Nullable Object request)
put 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 delete 没有返回值 void delete(String url, Object... uriVariables)
void delete(String url, Map<String, ?> uriVariables)
void delete(URI url)

 

  1、get请求

  (1)getForEntity函数

    getForEntity提供了3个重载方法。

     a、重载方法1:

<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)

     描述:返回对象是ResponseEntity,该对象是对HTTP请求响应的封装,其中主要存储了几个重要的HTTP元素(例如相应状态),其父类HttpEntity中还存储着HTTP请求头对象HttpHeaders及泛型类的请求体对象

       样例:

ResponseEntity responseEntity = restTemplate.getForEntity("http://EUREKA-CLIENT/v1/hello?name={1}&age={2}",String.class,"demoName",18);

    上面例子中,请求的是EUREKA-CLIENT服务中的/v1/hello请求,第二个String.class是调用该方法的返回值类型,后面的多个参数,就是服务后面跟随的入参;如果返回值是一个对象,那么可以使用泛型来处理:

ResponseEntity<UserDto> responseEntity1 = restTemplate.getForEntity("http://EUREKA-CLIENT/v1/hello?name={1}",UserDto.class,"demoName");

    这种是使用的比较多也是比较常见的方法。

    b、重载方法2

<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)

     描述:该方法和上面说的方法基本上一致,只有传参时,上面的方法是用的是多个入参,是用入参顺序匹配占位符,而该方法则是是用的map中的key对应的占位符

     样例:

        Map map = new HashMap<String,String>();
        map.put("name","demoname");
        map.put("age","15");
        ResponseEntity<UserDto> responseEntity2 = restTemplate.getForEntity("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",UserDto.class,map);

    c、重载方法3

<T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)

    描述:该方法用于没有入参时是用

    样例:

ResponseEntity<String> responseEntity3 = restTemplate.getForEntity("http://EUREKA-CLIENT/v1/hello}",String.class);

  (2)getForObject函数

  getForObject函数可以理解为对getForEntity的一种封装,获取的直接是Body体内的内容,其余使用方法与getForEntity一致,使用方法也一致。

  a、重载方法一

<T> T getForObject(String url, Class<T> responseType, Object... uriVariables)

  样例:

UserDto userDto1 = restTemplate.getForObject("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",UserDto.class,"demoName",18);

  b、重载方法二

<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)

  样例:

UserDto userDto2 = restTemplate.getForObject("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",UserDto.class,map);

  c、重载方法三

<T> T getForObject(String url, Class<T> responseType, Object... uriVariables)

  样例:

UserDto userDto = restTemplate.getForObject("http://EUREKA-CLIENT/v1/hello",UserDto.class);

2、post请求

  (1)postForEntity函数

  postForEntity函数和getForEntity一样,有三个重载方法,且使用方法与getForEntity一致

<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType,  Object... uriVariables) throws RestClientException;
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
<T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;

 

  根据上述代码,可以发现,postForEntity函数和getForEntity函数的区别在于多了一个Object request入参,该入参可以是普通的对象,也可以是一个HttpEntity对象,如果request是一个普通对象,requestTemplate会将其转换成一个HttpEntity对象进行调用,而HttpEntity的body即是该request对象;如果该对象是一个HttpEntity对象的话,则可以直接进行调用。

  使用样例:

        //postForEntity使用demo
        UserDto userDto3 = new UserDto("demoname","15");
        ResponseEntity<String> userDtoResponseEntity = restTemplate.postForEntity("http://EUREKA-CLIENT/v1/hello",userDto3,String.class);
        String body = userDtoResponseEntity.getBody();
        ResponseEntity<UserDto> userDtoResponseEntity2 = restTemplate.postForEntity("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",userDto3,UserDto.class,"demoname","15");
        ResponseEntity<UserDto> userDtoResponseEntity3 = restTemplate.postForEntity("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",userDto3,UserDto.class,map);

  (2)postForObject函数

    <T> T postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables) throws RestClientException;
    <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;
    <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables) throws RestClientException;

  该方法与getForObject函数使用方式一致,区别也是多了一个Object request,

  使用样例:

        String body1 = restTemplate.postForObject("http://EUREKA-CLIENT/v1/hello",userDto3,String.class);
        String body2 = restTemplate.postForObject("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}", userDto3, String.class,"demoname","15");
        String body3= restTemplate.postForObject("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}", userDto3, String.class, map);

  (3)postForLocation函数

    URI postForLocation(String url, @Nullable Object request, Object... uriVariables) throws RestClientException;
    URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)throws RestClientException;
    URI postForLocation(URI url, @Nullable Object request) throws RestClientException;

  该类重载方法实现了一POST请求提交资源,并返回新资源地址的URI,且该类函数不需要像前两种函数一样指定返回类型。

  使用样例:

        //postForLocation使用样例
        URI uri1 = restTemplate.postForLocation("http://EUREKA-CLIENT/v1/hello",userDto3);
        URI uri2 = restTemplate.postForLocation("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}", userDto3, "demoname","15");
        URI uri3= restTemplate.postForLocation("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}", userDto3, map);

3、put

    void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException;
    void put(String url, @Nullable Object request, Map<String, ?> uriVariables) throws RestClientException;
    void put(URI url, @Nullable Object request) throws RestClientException;

  put函数也有三个重载方法,所有的put方法都没有返回值,因此入参就没有返回值类型的入参。

  使用样例:

        //put使用样例
        restTemplate.put("http://EUREKA-CLIENT/v1/hello",userDto3);
        restTemplate.put("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",userDto3,UserDto.class,"demoname","15");
        restTemplate.put("http://EUREKA-CLIENT/v1/hello?name={name}&age={age}",userDto3,UserDto.class,map);

4、delete

    void delete(String url, Object... uriVariables) throws RestClientException;
    void delete(String url, Map<String, ?> uriVariables) throws RestClientException;
    void delete(URI url) throws RestClientException;

  delete函数没有返回值,因此入参没有返回值类型;同样不需要request的body,像get方法一样,直接将参数绑定url即可

  使用样例:

        //delete使用样例
        restTemplate.delete("http://EUREKA-CLIENT/v1/hello");
        restTemplate.delete("http://EUREKA-CLIENT/v1/hello","demoname","15");
        restTemplate.delete("http://EUREKA-CLIENT/v1/hello",map);

 

以上是关于SpringCloud--Ribbon--使用demo的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud--Ribbon--源码解析--Ribbon入口实现

SpringCloud--Ribbon--使用demo

springCloud:Ribbon实现客户端侧负载均衡-消费者整合Ribbon

SpringCloud---Ribbon服务调用,源码分析

SpringCloud:ribbon项目搭建(Gradle项目)

SpringCloud Ribbon组成和负载均衡规则