【Spring开发】SpringCloud服务端高级框架第11篇:3.文档操作,4.RestAPI【附代码文档】

举报
小帅说java 发表于 2025/10/10 19:31:29 2025/10/10
【摘要】 微服务保护、服务异步通信、消息中间件部署、分布式事务、搜索引擎、缓存、数据同步以及相关组件的安装配置等技术要点。在微服务保护方面,介绍了 Sentinel 的基础知识,包括雪崩问题、超时处理、舱壁模式、断路器机制,以及不同服务保护技术的对比;讲解了流量控制(簇点链路、流控模式、热点参数限流)、隔离与降级(FeignClient 整合 Sentinel、线程隔离)、授权规则(自定

🏆🏆🏆教程全知识点简介:微服务保护、服务异步通信、消息中间件部署、分布式事务、搜索引擎、缓存、数据同步以及相关组件的安装配置等技术要点。在微服务保护方面,介绍了 Sentinel 的基础知识,包括雪崩问题、超时处理、舱壁模式、断路器机制,以及不同服务保护技术的对比;讲解了流量控制(簇点链路、流控模式、热点参数限流)、隔离与降级(FeignClient 整合 Sentinel、线程隔离)、授权规则(自定义异常结果)及规则持久化(规则管理模式与 pull 模式),并演示了基于 Nacos 的规则持久化改造。服务异步通信部分探讨了消息可靠性(生产者消息确认、Return 回调、ConfirmCallback)、死信交换机、TTL 队列等高级应用。RabbitMQ 部署指南涵盖了单机部署、DelayExchange 插件安装、集群部署、镜像模式等内容。分布式事务部分介绍了 CAP 定理、BASE 理论、常见解决方案,Seata 的基础与部署(TC 服务部署、Nacos 配置、数据库表创建)、多种事务模式(XA 模式及优缺点、四种模式对比)和高可用架构。分布式搜索引擎章节讲解了 Elasticsearch 的原理(ELK 技术栈、倒排索引)、索引库与文档操作、RestAPI 与 RestClient 的使用、排序与高亮、酒店搜索案例(分页、竞价排名、ad标记、算分函数)、自动补全、数据同步(同步调用、监听 binlog)、集群搭建与脑裂问题、分片存储测试,以及单点 ES、Kibana、IK 分词器安装。缓存部分介绍了 Redis 持久化(RDB 与 AOF 对比)、单机安装 Redis、Redis 集群、多级缓存(JVM 进程缓存、Caffeine)、请求参数处理、Tomcat 查询、HTTP 工具与 CJSON 工具类、Redis 缓存查询。数据同步与网关部分包括 Canal 安装(开启 MySQL 主从、设置权限)、OpenResty 安装(开发库、目录结构、环境变量配置)及运行流程。


📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459519    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459519    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/460704    中查看

✨ 本教程项目亮点

🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

3.文档操作

3.1.新增文档

语法:

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
    // ...
}

示例:

POST /heima/_doc/1
{
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

响应:

3.2.查询文档

根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里 把文档id带上。

语法:

GET /{索引库名称}/_doc/{id}

通过kibana查看数据:

GET /heima/_doc/1

查看结果:

3.3.删除文档

删除使用DELETE请求,同样,需要根据id进行删除:

语法:

DELETE /{索引库名}/_doc/id值

示例:

# 根据id删除数据
DELETE /heima/_doc/1

结果:

[Javadoc 工具]

3.4.修改文档

修改有两种方式:

  • 全量修改:直接覆盖原来的文档
  • 增量修改:修改文档中的部分字段

3.4.1.全量修改

全量修改是覆盖原来的文档,其本质是:

  • 根据指定的id删除文档
  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

[Apache DBCP 文档]

语法:

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

示例:

PUT /heima/_doc/1
{
    "info": "黑马程序员高级Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

3.4.2.增量修改

增量修改是只修改指定id匹配的文档中的部分字段。

语法:

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

[JDK 8 API 文档]

示例:

POST /heima/_update/1
{
  "doc": {
    "email": "ZhaoYun@itcast.cn"
  }
}

3.5.总结

文档操作有哪些?

  • 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
  • 查询文档:GET /{索引库名}/_doc/文档id
  • 删除文档:DELETE /{索引库名}/_doc/文档id
  • 修改文档:
  • 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
  • 增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}

4.RestAPI

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:

其中的Java Rest Client又包括两种:

  • Java Low Level Rest Client
  • Java High Level Rest Client

学习的是Java HighLevel Rest Client客户端API

4.0.导入Demo工程

4.0.1.导入数据

首先导入课前资料提供的数据库数据:

数据结构如下:

[EclipseLink 文档]

CREATE TABLE `tb_hotel` (
  `id` bigint(20) NOT NULL COMMENT '酒店id',
  `name` varchar(255) NOT NULL COMMENT '酒店名称;例:7天酒店',
  `address` varchar(255) NOT NULL COMMENT '酒店地址;例:航头路',
  `price` int(10) NOT NULL COMMENT '酒店价格;例:329',
  `score` int(2) NOT NULL COMMENT '酒店评分;例:45,就是4.5分',
  `brand` varchar(32) NOT NULL COMMENT '酒店品牌;例:如家',
  `city` varchar(32) NOT NULL COMMENT '所在城市;例:上海',
  `star_name` varchar(16) DEFAULT NULL COMMENT '酒店星级,从低到高分别是:1星到5星,1钻到5钻',
  `business` varchar(255) DEFAULT NULL COMMENT '商圈;例:虹桥',
  `latitude` varchar(32) NOT NULL COMMENT '纬度;例:31.2497',
  `longitude` varchar(32) NOT NULL COMMENT '经度;例:120.3925',
  `pic` varchar(255) DEFAULT NULL COMMENT '酒店图片;例:/img/1.jpg',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4.0.2.导入项目

然后导入课前资料提供的项目:

项目结构如图:

4.0.3.mapping映射分析

创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:

  • 字段名
  • 字段数据类型
  • 是否参与搜索
  • 是否需要分词
  • 如果分词,分词器是什么?

其中:

  • 字段名、字段数据类型,可以参考数据表结构的名称和类型
  • 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
  • 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
  • 分词器, 可以统一使用ik_max_word

来看下酒店数据的索引库结构:

[HikariCP 文档]

PUT /hotel
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "all"
      },
      "city":{
        "type": "keyword",
        "copy_to": "all"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

几个特殊字段说明:

  • location:地理坐标,里面包含精度、纬度
  • all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索

地理坐标说明:

copy_to说明:

4.0.4.初始化RestClient

在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。

分为三步:

1)引入es的RestHighLevelClient依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-h

🚀✨ (未完待续)项目系列下一章

📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。