提示文章写完后,目录可以自动生成如何生成参考右边的帮助文档


服务

在这里插入图片描述

服务架构,是服务化思想指导下的一套最佳实践架构方案服务化就是单体架构中的功能模块分为多个独立项目

单体架构

在这里插入图片描述
在这里插入图片描述

微服务架构

在这里插入图片描述

在这里插入图片描述

SpringCloud

微服务拆分以后碰到的各种问题都有对应解决方案和微服务组件,而SpringCloud框架可以说是目前Java领域最全面的微服务组件集合了。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
.

服务拆分原则

在这里插入图片描述
在这里插入图片描述
所谓纵向拆分就是按照项目功能模块拆分例如黑马商城中,就有用户管理功能订单管理功能、购物车功能、商品管理功能、支付功能等。那么按照功能模块他们分为一个个服务,就属于纵向拆分。这种拆分模式可以可能提高服务的内聚性。

而横向拆分,是看各个功能模块之间没有公共业务部分,如果有将其抽取出来作为通用服务。例如用户登录需要发送消息通知记录风控数据下单时也要发送短信记录风控数据。因此消息发送、风控数据记录就是通用的业务功能,因此可以他们分别抽取公共服务消息中心服务、风控管理服务。这样可以提高业务复用性,避免重复开发。同时通用业务一般接口稳定较强,也不会使服务之间过分耦合

商城项目

工程结构有两种:

商城并不是一个完整项目,其中的短信发送、风控管理没有实现这里就不再考虑了。而其它的业务按照纵向拆分可以分为以下几个微服务:

服务调用

在拆分的时候我们发现一个问题就是购物车业务中需要查询商品信息,但商品信息查询逻辑全部迁移到了itemservice服务,导致我们无法查询

最终结果就是查询到的购物车数据完整,因此要想解决这个问题,我们就必须改造其中的代码,把原本本地方法调用,改造成跨微服务的远程调用(RPC,即Remote Produce Call)。

因此,现在查询购物车列表流程变成了这样:
在这里插入图片描述
代码中需要变化的就是一步
在这里插入图片描述

在这里插入图片描述

RestTemplate

Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。

在这里插入图片描述
在这里插入图片描述

其中提供了大量的方法,方便我们发送Http请求例如
在这里插入图片描述
可以看到常见的Get、Post、Put、Delete请求支持,如果请求参数比较复杂,还可以使用exchange方法来构造请求。

package com.hmall.cart.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RemoteCallConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

远程调用

接下来,我们修改cartservice中的com.hmall.cart.service.impl.CartServiceImpl的handleCartItems方法,发送http请求到itemservice
在这里插入图片描述
可以看到利用RestTemplate发送http请求与前端ajax发送请求非常相似,都包含四部分信息

handleCartItems方法的完整代码如下

private void handleCartItems(List<CartVO> vos) {
    // TODO 1.获取商品id
    Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
    // 2.查询商品
    // List<ItemDTO> items = itemService.queryItemByIds(itemIds);
    // 2.1.利用RestTemplate发起http请求,得到http的响应
    ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
            "http://localhost:8081/items?ids={ids}",
            HttpMethod.GET,
            null,
            new ParameterizedTypeReference<List<ItemDTO>>() {
            },
            Map.of("ids", CollUtil.join(itemIds, ","))
    );
    // 2.2.解析响应
    if(!response.getStatusCode().is2xxSuccessful()){
        // 查询失败直接结束
        return;
    }
    List<ItemDTO> items = response.getBody();
    if (CollUtils.isEmpty(items)) {
        return;
    }
    // 3.转为 id 到 item的map
    Map<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));
    // 4.写入vo
    for (CartVO v : vos) {
        ItemDTO item = itemMap.get(v.getItemId());
        if (item == null) {
            continue;
        }
        v.setNewPrice(item.getPrice());
        v.setStatus(item.getStatus());
        v.setStock(item.getStock());
    }
}

这个过程中,item-service提供了查询接口cartservice利用Http请求调用该接口。因此item-service可以称为服务的提供者,而cartservice称为服务的消费者或服务调用者

小结

服务拆分之后,不可避免的会出现跨微服务的业务,此时微服务之间需要进行远程调用。微服务之间的远程调用被称为RPC,即远程过程调用。RPC的实现方式有很多,比如

我们上述代码使用的是Http方式,这种方式不关心服务提供者的具体技术实现,只要对外暴露Http接口即可,更符合微服务的需要。

Java发送http请求可以使用Spring提供的RestTemplate使用基本步骤如下

HttpClient

HttpClient–01–简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

原文地址:https://blog.csdn.net/weixin_48052161/article/details/134637958

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39884.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注