在 Spring Cloud 中使用 Ribbon 会更简单,因为 Spring Cloud 在 Ribbon 的基础上进行了一层封装,将很多配置都集成好了。本节将在 Spring Cloud 项目中使用 Ribbon。
使用 RestTemplate 与整合 Ribbon
Spring 提供了一种简单便捷的模板类来进行 API 的调用,那就是 RestTemplate。
1.使用 RestTemplate
在前面介绍 Eureka 时,我们已经使用过 RestTemplate 了,本节会更加详细地跟大家讲解 RestTemplate 的具体使用方法。
首先我们来看看 GET 请求的使用方式:创建一个新的项目 spring-rest-template,配置好 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 来调用我们刚刚定义的两个接口,代码如下所示。
获取数据结果可通过 RestTemplate 的 getForObject 方法(如下代码所示)来实现,此方法有三个重载的实现:
url:请求的 API 地址,有两种方式,其中一种是字符串,另一种是 URI 形式。
responseType:返回值的类型。
uriVariables:PathVariable 参数,有两种方式,其中一种是可变参数,另一种是 Map 形式。
除了 getForObject,我们还可以使用 getForEntity 来获取数据,代码如下所示。
getForEntity 中可以获取返回的状态码、请求头等信息,通过 getBody 获取响应的内容。其余的和 getForObject 一样,也是有 3 个重载的实现。
接下来看看怎么使用 POST 方式调用接口。在 HouseController 中增加一个 save 方法用来接收 HouseInfo 数据,代码如下所示。
接着写调用代码,用 postForObject 来调用,代码如下所示。
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,代码如下所示。
RestTemplate 负载均衡示例
前面我们调用接口都是通过具体的接口地址来进行调用,RestTemplate 可以结合 Eureka 来动态发现服务并进行负载均衡的调用。
修改 RestTemplate 的配置,增加能够让 RestTemplate 具备负载均衡能力的注解 @LoadBalanced。代码如下所示。
修改接口调用的代码,将 IP+PORT 改成服务名称,也就是注册到 Eureka 中的名称,代码如下所示。
接口调用的时候,框架内部会将服务名称替换成具体的服务 IP 信息,然后进行调用。 推荐分布式架构源码
@LoadBalanced 注解原理
相信大家一定有一个疑问:为什么在 RestTemplate 上加了一个 @LoadBalanced 之后,RestTemplate 就能够跟 Eureka 结合了,不但可以使用服务名称去调用接口,还可以负载均衡?
应该归功于 Spring Cloud 给我们做了大量的底层工作,因为它将这些都封装好了,我们用起来才会那么简单。框架就是为了简化代码,提高效率而产生的。
这里主要的逻辑就是给 RestTemplate 增加拦截器,在请求之前对请求的地址进行替换,或者根据具体的负载策略选择服务地址,然后再去调用,这就是 @LoadBalanced 的原理。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69994808/viewspace-2851234/ ,如需转载,请注明出处,否则将追究法律责任。