RestTemplate
是 Spring 提供的一个同步 HTTP 客户端,用于在 Java 应用程序中进行 RESTful API 调用。它支持多种 HTTP 方法(如 GET、POST、PUT、DELETE 等),并且能够处理 JSON、XML 和其他格式的响应。
使用场景
当应用需要从外部服务获取数据时,例如天气、支付服务、媒体数据等,可以使用 RestTemplate
发起 HTTP 请求。
微服务通信
在微服务架构中,服务之间是隔离的,一个服务可能需要调用另一个服务的 API。例如,购物车服务可以调用商品订单服务来获取数据,如:
1,声明RestTemplate
首先可以在一个配置类(如启动类)中声明RestTemplate,并交给IOC容器进行管理。
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
然后去购物车的service层发起远程调用,购物车需要用到商品的数据:
2,注入RestTemplate
在这里,我们通过构造函数实现注入。@AllArgsConstructor注解会为所有属性生成构造方法进行赋值。如果我们只想为某些特定属性生成构造方法,可以在这些属性上添加final关键字,表示它们必须被初始化且不可更改,然后使用@RequiredArgsConstructor注解,这样就只为这些属性注入了构造方法。
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
private final RestTemplate restTemplate;
3,exchange发送客户端请求并得到响应结果
大致流程如下:客户端发出请求后,另一个服务的控制器方法将接收此请求并返回结果。
itemIds是一个包含所有商品ID的已处理Set集合。
Map.of()是一个静态方法,用于创建一个不可变的键值对Map,这个Map用于处理占位符的参数。
CollUtils.join(itemIds, ",")的作用是将Set集合中的元素用逗号连接起来,形成一个字符串,这个字符串将作为Map的值。
ResponseEntity<List<ItemDTO>> exchange = restTemplate.exchange(
"http://localhost:8081/items?ids={ids}",
HttpMethod.GET,
//请求体,get无
null,
//这里返回值类型是一个实体对象集合,一般:实体.class,这里:特殊处理
new ParameterizedTypeReference<List<ItemDTO>>() {
},
//占位符参数处理,把id的set集合拼接为字符串,替换到占位符中的位置
Map.of("ids", CollUtils.join(itemIds, ","))
);
4,解析响应结果
(可以通过响应状态码判断是否请求发送成功)
响应体就是我们需要的数据
List<ItemDTO> items = exchange.getBody();
这个items就是我们需要的结果了,如果没有使用RestTemplate,这里的items就需要注入商品的service进行处理了,但是这是一个独立的服务,所以重新对items的值的由来进行了处理。保证服务的独立性。
服务治理问题
使用远程调用的方法会产生一些问题:
像上面看到的,另一个服务的url是写死的,实际不知道服务地址怎么办
同样的服务可能会部署好多个,该访问哪一个
如果知道某个服务地址,那个服务挂掉了怎么办
对于程序启动后,新服务的地址不知道
解决方案:注册中心......
JWT令牌验证https://mp.csdn.net/mp_blog/creation/editor/141727904
标签:Map,调用,服务,exchange,items,RestTemplate,远程 From: https://blog.csdn.net/2301_81243054/article/details/143351234