微服务day03

导入黑马商城项目

创建Mysql服务

由于已有相关项目则要关闭DockerComponent中的已开启的项目


[root@server02 ~]# docker compose down
WARN[0000] /root/docker-compose.yml: `version` is obsolete
[+] Running 4/4✔ Container nginx  Removed                                                0.2s✔ Container hmall  Removed                                                0.4s✔ Container mysql  Removed                                                1.5s✔ Network hmall    Removed                                                0.1s
[root@server02 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server02 ~]#

创建网络用来连接项目容器

[root@server02 ~]# docker network create hm-net
025bba52632ae4d789c1281fb0114fd10f58fe9b0cf7c998a32c660b2eb889e9
[root@server02 ~]#

创建并运行Mysql容器

[root@server02 ~]# docker run -d \
>   --name mysql \
>   -p 3306:3306 \
>   -e TZ=Asia/Shanghai \
>   -e MYSQL_ROOT_PASSWORD=123 \
>   -v /root/mysql/data:/var/lib/mysql \
>   -v /root/mysql/conf:/etc/mysql/conf.d \
>   -v /root/mysql/init:/docker-entrypoint-initdb.d \
>   --network hm-net\
>   mysql
a88243bf07574804e6a580e66dbf5b885c73c4d72e4a33b288c4d1f1f7541bea
[root@server02 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
a88243bf0757   mysql     "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@server02 ~]#

导入后端代码

打开准备的后端代码

导入前端代码

将提供的hmail-nginx文件迁移到英文目录下,使用命令行启动

start nginx.exe

单体结构

微服务项目

SpringCloud

微服务的技术栈。

微服务拆分

熟悉黑马商城

黑马商城的组成

拆分原则

服务拆分

黑马商城采用Maven聚合来进行微服务。

案例:拆分服务

拆分商品相关微服务:

远程调用

由于启动类也是一个配置类,因此在启动类添加Bean容器

    @Beanpublic RestTemplate restTemplate() {return new RestTemplate();}

修改后的service文件

@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {private final RestTemplate restTemplate;@Overridepublic void addItem2Cart(CartFormDTO cartFormDTO) {// 1.获取登录用户Long userId = UserContext.getUser();// 2.判断是否已经存在if (checkItemExists(cartFormDTO.getItemId(), userId)) {// 2.1.存在,则更新数量baseMapper.updateNum(cartFormDTO.getItemId(), userId);return;}// 2.2.不存在,判断是否超过购物车数量checkCartsFull(userId);// 3.新增购物车条目// 3.1.转换POCart cart = BeanUtils.copyBean(cartFormDTO, Cart.class);// 3.2.保存当前用户cart.setUserId(userId);// 3.3.保存到数据库save(cart);}@Overridepublic List<CartVO> queryMyCarts() {// 1.查询我的购物车列表List<Cart> carts = lambdaQuery().eq(Cart::getUserId, 1L /*TODO UserContext.getUser()*/).list();if (CollUtils.isEmpty(carts)) {return CollUtils.emptyList();}// 2.转换VOList<CartVO> vos = BeanUtils.copyList(carts, CartVO.class);// 3.处理VO中的商品信息handleCartItems(vos);// 4.返回return vos;}private void handleCartItems(List<CartVO> vos) {// 1.获取商品id TODO 处理商品信息Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);//通过restTemplate查询商品信息ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},CollUtil.join(itemIds, ","));List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {throw new BadRequestException("购物车中商品不存在!");}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (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());}}@Overridepublic void removeByItemIds(Collection<Long> itemIds) {// 1.构建删除条件,userId和itemIdQueryWrapper<Cart> queryWrapper = new QueryWrapper<Cart>();queryWrapper.lambda().eq(Cart::getUserId, UserContext.getUser()).in(Cart::getItemId, itemIds);// 2.删除remove(queryWrapper);}private void checkCartsFull(Long userId) {int count = Math.toIntExact(lambdaQuery().eq(Cart::getUserId, userId).count());if (count >= 10) {throw new BizIllegalException(StrUtil.format("用户购物车课程不能超过{}", 10));}}private boolean checkItemExists(Long itemId, Long userId) {int count = Math.toIntExact(lambdaQuery().eq(Cart::getUserId, userId).eq(Cart::getItemId, itemId).count());return count > 0;}
}

注入RestTemplate来进行信息交互。

 private final RestTemplate restTemplate;

由于springboot不推荐@Autoword注入因此使用无参构造进行注入Lombok中的@RequiredArgsConstructor注解可以将类中所有必要的参数加入无参构造(final),以此进行注入

获取商品信息并返回:

 private void handleCartItems(List<CartVO> vos) {// 1.获取商品id TODO 处理商品信息Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);//通过restTemplate查询商品信息ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},CollUtil.join(itemIds, ","));List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {throw new BadRequestException("购物车中商品不存在!");}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (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());}}

修改位置:

  // 2.查询商品
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);//通过restTemplate查询商品信息ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",//要访问的接口位置HttpMethod.GET,//访问的类型null,//requestEnitiy设置为空new ParameterizedTypeReference<List<ItemDTO>>() {},//用以将List<ItemDTO>作为泛型传入CollUtil.join(itemIds, ",")//要携带的属性);List<ItemDTO> items = response.getBody();//获取数据

服务治理

注册中心原理

Nacos注册中心

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

1、创建nacos:

在数据库中导入nacos的数据库

2、在docker中创建nacos

  1. 将配置文件导入虚拟机
  2. 将nacos的tar包导入虚拟机,nacos.tar
  3. 上传nacos包到本地镜像
docker load -i nacos.tar
  1. 创建nacos容器
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim
0
[root@server02 ~]# docker load -i nacos.tar9c1b6dd6c1e6: Loading layer   83.9MB/83.9MB
13a34b6fff78: Loading layer  5.177MB/5.177MB
8373e87e0617: Loading layer  3.584kB/3.584kB
dc68e54a0b44: Loading layer  109.3MB/109.3MB
445489eb2a14: Loading layer  2.048kB/2.048kB
cb4f3f38c79e: Loading layer  127.6MB/127.6MB
91e3449baf4f: Loading layer   7.68kB/7.68kB
a28384a784e0: Loading layer  5.632kB/5.632kB
8fa6b76bdc24: Loading layer  3.072kB/3.072kB
5f70bf18a086: Loading layer  1.024kB/1.024kB
Loaded image: nacos/nacos-server:v2.1.0-slim
[root@server02 ~]#
[root@server02 ~]#
[root@server02 ~]# dis
REPOSITORY           TAG               IMAGE ID       CREATED        SIZE
root-hmall           latest            3e78751a9f66   42 hours ago   370MB
docker-demo          1.0               9e95eddcf939   43 hours ago   319MB
mysql                latest            be960704dfac   2 weeks ago    602MB
nacos/nacos-server   v2.1.0-slim       49addbd025a1   2 years ago    322MB
openjdk              11.0-jre-buster   57925f2e4cff   2 years ago    301MB
nginx                latest            3f8a4339aadd   6 years ago    108MB
[root@server02 ~]# docker run -d \
> --name nacos \
> --env-file ./nacos/custom.env \
> -p 8848:8848 \
> -p 9848:9848 \
> -p 9849:9849 \
> --restart=always \
> docker ps -a^C
[root@server02 ~]#
[root@server02 ~]# docker run -d \
> --name nacos \
> --env-file ./nacos/custom.env \
> -p 8848:8848 \
> -p 9848:9848 \
> -p 9849:9849 \
> --restart=always \
> nacos/nacos-server:v2.1.0-slim
a46373d69c1dcaf7a8183a21b81aeec3c790e3016d25607e90930e94e08119a6
[root@server02 ~]# dps
CONTAINER ID   IMAGE                            PORTS                                                                                                      STATUS          NAMES
a46373d69c1d   nacos/nacos-server:v2.1.0-slim   0.0.0.0:8848->8848/tcp, :::8848->8848/tcp, 0.0.0.0:9848-9849->9848-9849/tcp, :::9848-9849->9848-9849/tcp   Up 21 seconds   nacos
dc43e5e833fe   mysql                            0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                                       Up 13 minutes   mysql
[root@server02 ~]#

服务注册

服务发现

引入依赖:

<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置RestTemplate类

    @Beanpublic RestTemplate restTemplate() {return new RestTemplate();}

引入nacos的地址:

spring:cloud:nacos:server-addr: 192.168.150.101:8848

修改代码:

    private final RestTemplate restTemplate;//引入 服务发现 客户端,使用该客户端获取对应的服务列表private final DiscoveryClient discoveryClient;
    private void handleCartItems(List<CartVO> vos) {// 1.获取商品id TODO 处理商品信息Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品//获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("item-service");//进行负载均衡(随机负载均衡)ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));//获取该服务的URLURI uri = serviceInstance.getUri();//通过restTemplate查询商品信息ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(uri+"/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},CollUtil.join(itemIds, ","));List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {throw new BadRequestException("购物车中商品不存在!");}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (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());}}

OpenFeign

引入依赖:

  <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

在启动项添加注解:

@EnableFeignClients //启用openfeign@EnableFeignClients //启用openfeign
@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
public class CartApplication {public static void main(String[] args) {SpringApplication.run(CartApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

创建接口:

import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.Collection;
import java.util.List;@FeignClient("item-service")
public interface ItemClient {// 获取商品详情@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

修改代码:

      //注入bean
private final ItemClient itemClient;//    private final RestTemplate restTemplate;
//
//    //引入 服务发现 客户端,使用该客户端获取对应的服务列表
//    private final DiscoveryClient discoveryClient;private void handleCartItems(List<CartVO> vos) {// 1.获取商品id TODO 处理商品信息Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
//        // 2.查询商品List<ItemDTO> items = itemClient.queryItemByIds(itemIds);
//        //获取服务列表
//        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
//
//        //进行负载均衡(随机负载均衡)
//        ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));
//        //获取该服务的URL
//        URI uri = serviceInstance.getUri();
//
//        //通过restTemplate查询商品信息
//        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
//                uri+"/items?ids={ids}",
//                HttpMethod.GET,
//                null,
//                new ParameterizedTypeReference<List<ItemDTO>>() {
//                },
//                CollUtil.join(itemIds, ",")
//        );
//        List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {throw new BadRequestException("购物车中商品不存在!");}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (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());}}

连接池

引入okhttp的依赖

<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>

修改配置文件,开启连接池

feign:okhttp:enabled: true # 开启OKHttp功能

最佳实践

采用方法二进行改造

  1. 创建 hm-api 模块。
  2. 在该模块下创建 com.hmall.api.client包和com.hmall.api.dto和com.hmall.api.config包
  3. 在cart-servicer启动项 添加扫描包
  4. @EnableFeignClients(basePackages = "com.hmall.api.client")
  5. 引入模块cart-servicer模块中的代码
@FeignClient("item-service")
public interface ItemClient {// 获取商品详情@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
@Data
@ApiModel(description = "商品实体")
public class ItemDTO {@ApiModelProperty("商品id")private Long id;@ApiModelProperty("SKU名称")private String name;@ApiModelProperty("价格(分)")private Integer price;@ApiModelProperty("库存数量")private Integer stock;@ApiModelProperty("商品图片")private String image;@ApiModelProperty("类目名称")private String category;@ApiModelProperty("品牌名称")private String brand;@ApiModelProperty("规格")private String spec;@ApiModelProperty("销量")private Integer sold;@ApiModelProperty("评论数")private Integer commentCount;@ApiModelProperty("是否是推广广告,true/false")private Boolean isAD;@ApiModelProperty("商品状态 1-正常,2-下架,3-删除")private Integer status;
}

日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 事务@Transactional

Spring 事务Transactional 事务 Transactional 可设置多个属性来控制事务的行为&#xff1a; propagation&#xff1a;事务传播行为 isolation&#xff1a;隔离级别 timeout&#xff1a;超时设置&#xff08;单位&#xff1a;秒&#xff09; readOnly&#xff1a;事务是否只…

每日一题之二叉树

已知结点元素值为正整数且值不相同的一棵二叉树。 该二叉树通过给出其先序遍历序列和中序遍历序列构造而成。 输入一个整数x&#xff0c;针对此二叉树编写程序求出x的右子树中所有结点值的和&#xff08;若x不在树上&#xff0c;输出-1&#xff09;。 输入说明&#xff1a;第一…

win10系统使用Visual Studio 2019或cmake编译SDL2为32位库时出现error C2118: 负下标winnt.h的解决方法

提示&#xff1a; 下图蓝体字中的VS2008是错误的&#xff0c;其实SDL.sln是用VS2010版本的软件开发的&#xff08;对于SDL-release-2.0.5.zip源码而言至少是这样&#xff0c;而2024-11-6为止SDL是2.30.9版本了&#xff0c;2.30.9版本则无需自己编译&#xff0c;只需下载带后缀…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据&#xff0c;拥有一个全面的管道类型、配件和材料数据库。 软件特点&#xff1a; 1. 技术参数查询&#xff1a;Pipedata-Pro 提供关于管道…

算法竞赛(Python)-数组

文章目录 一 、排序算法二 、二分查找1 二分查找讲解2 二分查找题目&#xff08;1&#xff09;二分查找&#xff08;2&#xff09;在排序数组中查找元素的第一个和最后一个位置&#xff08;3&#xff09;两数之和 II - 输入有序数组 三、数组双指针1对撞指针对撞指针题目1&…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…

CPP贪心算法示例

设有n个正整数&#xff08;n ≤ 20&#xff09;&#xff0c;将它们联接成一排&#xff0c;组成一个最大的多位整数。 例如&#xff1a;n3时&#xff0c;3个整数13&#xff0c;312&#xff0c;343联接成的最大整数为&#xff1a;34331213 又如&#xff1a;n4时&#xff0c;4个整…

SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0

springboot项目在编译时报错&#xff1a; /Users/Apple/Developer/art/caicai/cai-api/dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider/ProviderApplication.java:22:32 java…

写一个 EventBus 实现微信小程序的发布订阅,支持全局消息通知、跨页面通信,高效好用!

eventBus.js 在微信小程序中实现发布/订阅模式可以通过创建一个简单的事件管理器来实现。这个事件管理器将负责注册事件监听器、触发事件以及移除监听器。下面是一个具体的实现示例&#xff1a; 1. 创建事件管理器 首先&#xff0c;我们创建一个单独的文件 eventBus.js 来管理…

东胜物流软件 AttributeAdapter.aspx SQL 注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计&#xff0c;使得Mac book有着非常棒的使用体验&#xff0c;但是在Mac电脑的使用时间过长时&#xff0c;电脑也会出现响应速度变慢或应用程序崩溃的情况&#xff0c;当发生的时候却不知道什么原因导致的&#xff0c;想要查询电脑…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

Leetcode 34 Find First and Last Position of Element in Sorted Array

题意&#xff1a;找到非严格递增的数组中和target相等的左右边界 https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/ 解答&#xff1a; 经典二分&#xff0c;找左右边界&#xff0c;要查看l是否满足题意 class Solution …

LinkedList和单双链表。

java中提供了双向链表的动态数据结构 --- LinkedList&#xff0c;它同时也实现了List接口&#xff0c;可以当作普通的列表来使用。也可以自定义实现链表。 单向链表&#xff1a;一个节点本节点数据下个节点地址 给定两个有序链表的头指针head1和head2&#xff0c;打印两个链表…

实现简易开屏弹窗

要实现一个简易的开屏弹窗&#xff0c;并展示一些文章内容&#xff0c;以下是一个简单的HTML和CSS实现。这个弹窗会在页面加载时显示&#xff0c;并包含一个标题和一些文章内容。用户可以点击按钮关闭弹窗&#xff0c;关闭后&#xff0c;弹窗的状态会保存在浏览器的 sessionSto…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

图神经网络(GNN)入门笔记(2)——从谱域理解图卷积,ChebNet和GCN实现

一、谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09; 与谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09;对应的是空间域&#xff08;Spatial Domain&#xff09;图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 …

leetcode92:反转链表||

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

知识图谱是如何通过数据集构建的,比如通过在MSCOCO和Flickr30k数据集和Visual Genome数据集

系列博客目录 文章目录 系列博客目录1. 数据准备与实体识别2. 关系抽取3. 图结构构建4. 图嵌入学习5. 知识图谱存储与查询示例&#xff1a;通过 Visual Genome 构建一个简单的知识图谱 构建知识图谱通常涉及从数据集中提取实体和关系&#xff0c;并将其结构化为图的形式。在 MS…