ITPub博客

首页 > 架构设计 > 数据架构 > java Spring Cloud企业快速开发架构之Ribbon结合RestTemplate实现负载均衡

java Spring Cloud企业快速开发架构之Ribbon结合RestTemplate实现负载均衡

原创 数据架构 作者:畏惧小田 时间:2022-01-07 21:40:32 0 删除 编辑

在 Spring Cloud 中使用 Ribbon 会更简单,因为 Spring Cloud 在 Ribbon 的基础上进行了一层封装,将很多配置都集成好了。本节将在 Spring Cloud 项目中使用 Ribbon。

使用 RestTemplate 与整合 Ribbon 
Spring 提供了一种简单便捷的模板类来进行 API 的调用,那就是 RestTemplate。

1.使用 RestTemplate 
在前面介绍 Eureka 时,我们已经使用过 RestTemplate 了,本节会更加详细地跟大家讲解 RestTemplate 的具体使用方法。 
首先我们来看看 GET 请求的使用方式:创建一个新的项目 spring-rest-template,配置好 RestTemplate:

1
2
3
4
5
6
7
[object  Object ]@Configuration
public  class  BeanConfiguration {
     @Bean
     public  RestTemplate getRestTemplate() {
         return  new  RestTemplate();
     }
}


新建一个 HouseController,并增加两个接口,一个通过 @RequestParam 来传递参数,返回一个对象信息;另一个通过 @PathVariable 来传递参数,返回一个字符串。请尽量通过两个接口组装不同的形式,具体代码如下所示。

1
2
3
4
5
6
7
8
@GetMapping( "/house/data" )
public  HouseInfo getData(@RequestParam( "name" )  String  name) {
     return  new  HouseInfo(1L,  "上海"  "虹口"  "东体小区" );
}
@GetMapping( "/house/data/{name}" )
public  String  getData2(@PathVariable( "name" )  String  name) {
     return  name;
}


新建一个 HouseClientController 用于测试,使用 RestTemplate 来调用我们刚刚定义的两个接口,代码如下所示。

1
2
3
4
5
6
7
8
@GetMapping( "/call/data" )
public  HouseInfo getData(@RequestParam( "name" )  String  name) {
     return  restTemplate.getForObject( ");
}
@GetMapping( "/call/data/{name}" )
public  String  getData2(@PathVariable( "name" )  String  name) {
     return  restTemplate.getForObject(  "{name}" ,  String . class , name);
}



获取数据结果可通过 RestTemplate 的 getForObject 方法(如下代码所示)来实现,此方法有三个重载的实现:

url:请求的 API 地址,有两种方式,其中一种是字符串,另一种是 URI 形式。 
responseType:返回值的类型。 
uriVariables:PathVariable 参数,有两种方式,其中一种是可变参数,另一种是 Map 形式。

1
2
3
public  <T> T getForObject( String  url, Class<T> responseType,  Object ... uriVariables);
public  <T> T getForObject( String  url, Class<T> responseType, Map< String , ?> uriVariables);
public  <T> T getForObject(URI url, Class<T> responseType);


除了 getForObject,我们还可以使用 getForEntity 来获取数据,代码如下所示。

1
2
3
4
5
6
7
8
9
@GetMapping( "/call/dataEntity" )
public  HouseInfo getData(@RequestParam( "name" )  String  name) {
     ResponseEntity<HouseInfo> responseEntity = restTemplate
             .getForEntity(");
     if  (responseEntity.getStatusCodeValue() ==  200 ) {
         return  responseEntity.getBody();
     }
     return  null ;
}


getForEntity 中可以获取返回的状态码、请求头等信息,通过 getBody 获取响应的内容。其余的和 getForObject 一样,也是有 3 个重载的实现。

接下来看看怎么使用 POST 方式调用接口。在 HouseController 中增加一个 save 方法用来接收 HouseInfo 数据,代码如下所示。

1
2
3
4
5
@PostMapping( "/house/save" )
public  Long addData(@RequestBody HouseInfo houseInfo) {
     System.out.println(houseInfo.getName());
     return  1001L;
}



接着写调用代码,用 postForObject 来调用,代码如下所示。

1
2
3
4
5
6
7
8
9
@GetMapping( "/call/save" )
public  Long add() {
     HouseInfo houseInfo =  new  HouseInfo();
     houseInfo.setCity( "上海" );
     houseInfo.setRegion( "虹口" );
     houseInfo.setName( "×××" );
     Long id = restTemplate.postForObject(");
     return  id;
}



postForObject 同样有 3 个重载的实现。除了 postForObject 还可以使用 postForEntity 方法,用法都一样,代码如下所示。

1
2
3
public  <T> T postForObject( String  url,  Object  request, Class<T> responseType,  Object ... uriVariables);
public  <T> T postForObject( String  url,  Object  request, Class<T> responseType, Map< String , ?> uriVariables);
public  <T> T postForObject(URI url,  Object  request, Class<T> responseType);


除了 get 和 post 对应的方法之外,RestTemplate 还提供了 put、delete 等操作方法,还有一个比较实用的就是 exchange 方法。exchange 可以执行 get、post、put、delete 这 4 种请求方式。更多地使用方式大家可以自行学习。

2.整合 Ribbon 
在 Spring Cloud 项目中集成 Ribbon 只需要在 pom.xml 中加入下面的依赖即可,其实也可以不用配置,因为 Eureka 中已经引用了 Ribbon,代码如下所示。

1
2
3
4
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>



RestTemplate 负载均衡示例 
前面我们调用接口都是通过具体的接口地址来进行调用,RestTemplate 可以结合 Eureka 来动态发现服务并进行负载均衡的调用。

修改 RestTemplate 的配置,增加能够让 RestTemplate 具备负载均衡能力的注解 @LoadBalanced。代码如下所示。

1
2
3
4
5
6
7
8
@Configuration
public  class  BeanConfiguration {
     @Bean
     @LoadBalanced
     public  RestTemplate getRestTemplate() {
         return  new  RestTemplate();
     }
}



修改接口调用的代码,将 IP+PORT 改成服务名称,也就是注册到 Eureka 中的名称,代码如下所示。

1
2
3
4
@GetMapping( "/call/data" )
public  HouseInfo getData(@RequestParam( "name" )  String  name) {
     return  restTemplate.getForObject(");
}



接口调用的时候,框架内部会将服务名称替换成具体的服务 IP 信息,然后进行调用。 推荐分布式架构源码

@LoadBalanced 注解原理 
相信大家一定有一个疑问:为什么在 RestTemplate 上加了一个 @LoadBalanced 之后,RestTemplate 就能够跟 Eureka 结合了,不但可以使用服务名称去调用接口,还可以负载均衡?

应该归功于 Spring Cloud 给我们做了大量的底层工作,因为它将这些都封装好了,我们用起来才会那么简单。框架就是为了简化代码,提高效率而产生的。

这里主要的逻辑就是给 RestTemplate 增加拦截器,在请求之前对请求的地址进行替换,或者根据具体的负载策略选择服务地址,然后再去调用,这就是 @LoadBalanced 的原理。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69994808/viewspace-2851234/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 程序员之爱情观
请登录后发表评论 登录
全部评论

注册时间:2021-02-10

  • 博文量
    14
  • 访问量
    2188