Elasticsearch Java客户端和Spring data elasticsearch

文章目录

  • 官网
  • 版本
  • 组件版本说明
  • 实现代码地址
  • es Spring Data Repositories
    • 例子:
    • ElasticsearchRepository分析
  • es Spring Data Repositories 关键字
  • es Spring Data Repositories client 加载
    • rest风格客户端
    • 直接执行dsl例子
    • 响应式客户端-ReactiveElasticsearchClient
      • pom.xml
      • 例子
  • ES 原生方式加载客户端
    • pom.xml
    • 加载原生客户端
    • controller使用
    • 验证结果
  • 测试请求http文件-TestEs.http
  • 外传

官网

https://www.elastic.co/cn/

整合springboot看上一篇文章

版本

一定要对应好版本,Elasticsearch 的不同版本变化是真大,

https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/

在这里插入图片描述

组件版本说明

Springboot: 2.7.10
spring-data-elasticsearch: 4.4.10
spring-boot-starter-data-elasticsearch: 2.7.10
elasticsearch-java: 7.17.9

实现代码地址

https://github.com/OrderDong/microservice-boot
分支:microservice-boot-1.0.6-es

microservice-boot-eleastic模块

在这里插入图片描述

所有pom.xml引用


<!--elastic search 7.17.9 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!--高版本单独使用elasticsearch client --><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.9</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency><!-- spring-data-elasticsearch 包含此包<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.9</version></dependency>--><!-- Reactive Infrastructure --><dependency><groupId>org.springframework</groupId><artifactId>spring-webflux</artifactId></dependency><dependency><groupId>io.projectreactor.netty</groupId><artifactId>reactor-netty-http</artifactId></dependency>

es Spring Data Repositories

类似于spring data封装的ORM框架,也可以理解为MVC的M层,当然,完全可以灵活应用,也支持rest层
https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/#repositories

例子:

    //controller@PostMapping("/saveVisitLog")@ResponseBodypublic String saveVisitLog(@RequestBody VisitLog visitLog){VisitLog saveVisitLog = visitLogService.saveVisitLog(visitLog);log.info("----saveVisitLog----:{}", JSON.toJSONString(saveVisitLog));return JSON.toJSONString(saveVisitLog);}@GetMapping("/getVisitLogAll")@ResponseBodypublic String getVisitLogAll(){List<VisitLog> logList = visitLogService.findAll();log.info("----getVisitLogAll----:{}", JSON.toJSONString(logList));return JSON.toJSONString(logList);}//service@Overridepublic VisitLog saveVisitLog(VisitLog visitLog) {return visitLogRepository.save(visitLog);}@Overridepublic List<VisitLog> findAll() {Iterable<VisitLog> visitLogs = visitLogRepository.findAll();List<VisitLog> logs = new ArrayList<>();visitLogs.forEach(visitLog -> logs.add(visitLog));return logs;}//dao层@Repositorypublic interface VisitLogRepository extends ElasticsearchRepository<VisitLog, String> {}

ElasticsearchRepository分析

CrudRepository最终继承了这个对象,这个对象被按照规则封装实现了具体的操作

我们可以看下ElasticsearchRepository实现了哪些方法:
在这里插入图片描述


@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);<S extends T> Iterable<S> saveAll(Iterable<S> entities);Optional<T> findById(ID id);boolean existsById(ID id);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> ids);long count();void deleteById(ID id);void delete(T entity);void deleteAllById(Iterable<? extends ID> ids);void deleteAll(Iterable<? extends T> entities);void deleteAll();
}

es Spring Data Repositories 关键字

spring data封装的ORM框架,很多接口继承的方法,也可以自定义方法,需要按照封装的规则自定义
https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/#repositories.definition

例子:

    //controller//自定义查询@GetMapping("/getVisitLogByUserLoginId")@ResponseBodypublic String getVisitLogByUserLoginId(Integer userLoginId){List<VisitLog> logList = visitLogService.findByUserLoginId(userLoginId);log.info("----getVisitLogAll----:{}", JSON.toJSONString(logList));return JSON.toJSONString(logList);}//service impl@Overridepublic List<VisitLog> findByUserLoginId(Integer userLoginId) {return visitLogRepository.findByUserLoginId(userLoginId);}//@Repositorypublic interface VisitLogRepository extends ElasticsearchRepository<VisitLog, String> {//自定义规则,By--关键字,UserLoginId字段,翻译下,就是查询-find 通过--By  字段--UserLoginId//spring data repository会去解析,同样的方式自行查reference文档List<VisitLog> findByUserLoginId(Integer userLoginId);}

es Spring Data Repositories client 加载

当然,一般使用封装好的也有一定的麻烦事情,也可以自己加载客户端,使用spring data repository 加载,两种方式,但是7.17的版本把这种方式去掉了,
https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/#elasticsearch.clients

rest风格客户端

The Java High Level REST Clientis the default client of Elasticsearch,it is configured likes hown:

package org.lwd.microservice.boot.es.config;import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;/*** rest风格客户端* The Java High Level REST Client is the default client of Elasticsearch, it is configured like shown:** @author weidong* @version V1.0.0* @since 2023/7/27*/
@Configuration
public class EsRestHighLevelClientConfig extends AbstractElasticsearchConfiguration {@Value("${spring.elasticsearch.uris}")private String uris;@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(uris).build();return RestClients.create(clientConfiguration).rest();}}

我们看下,那个bean可用(猜测一定被封装好了),AbstractElasticsearchConfiguration

public abstract class AbstractElasticsearchConfiguration extends ElasticsearchConfigurationSupport {/*** Return the {@link RestHighLevelClient} instance used to connect to the cluster. <br />** @return never {@literal null}.*/@Beanpublic abstract RestHighLevelClient elasticsearchClient();/*** Creates {@link ElasticsearchOperations}.** @return never {@literal null}.*/@Bean(name = { "elasticsearchOperations", "elasticsearchTemplate" })public ElasticsearchOperations elasticsearchOperations(ElasticsearchConverter elasticsearchConverter,RestHighLevelClient elasticsearchClient) {ElasticsearchRestTemplate template = new ElasticsearchRestTemplate(elasticsearchClient, elasticsearchConverter);template.setRefreshPolicy(refreshPolicy());return template;}
}

不知道各位发现没:@Bean(name = { “elasticsearchOperations”, “elasticsearchTemplate” })
用这个bean去操作

直接执行dsl例子

    //rest模版操作@AutowiredElasticsearchOperations elasticsearchOperations;//rest客户端模版@GetMapping("/getHighTempt")@ResponseBodypublic String getHighTempt(){Query query = new StringQuery("{ \"match\": { \"userLoginId\": 1 } } ");query.setPageable(PageRequest.of(0, 10));SearchHits<VisitLog>  searchHits = elasticsearchOperations.search(query,VisitLog.class);return JSON.toJSONString(searchHits);}

响应式客户端-ReactiveElasticsearchClient

  • The ReactiveElasticsearchClient is a non official driver based on WebClient.
  • It uses the request/response objects provided by the Elasticsearch core project.
  • Calls are directly operated on the reactive stack, not wrapping async (thread pool bound) responses into reactive types.
    如果不知道什么是响应式,自行百度

pom.xml


<!-- Reactive Infrastructure --><dependency><groupId>org.springframework</groupId><artifactId>spring-webflux</artifactId></dependency><dependency><groupId>io.projectreactor.netty</groupId><artifactId>reactor-netty-http</artifactId></dependency>

例子

package org.lwd.microservice.boot.es.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient;
import org.springframework.data.elasticsearch.client.reactive.ReactiveRestClients;
import org.springframework.data.elasticsearch.config.AbstractReactiveElasticsearchConfiguration;/*** 响应式客户端* The ReactiveElasticsearchClient is a non official driver based on WebClient.* It uses the request/response objects provided by the Elasticsearch core project.* Calls are directly operated on the reactive stack, not wrapping async (thread pool bound) responses into reactive types.** @author weidong* @version V1.0.0* @since 2023/7/28*/
@Configuration
public class EsReactiveRestClientConfig extends AbstractReactiveElasticsearchConfiguration {@Value("${spring.elasticsearch.uris}")private String uris;@Bean@Overridepublic ReactiveElasticsearchClient reactiveElasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(uris) //.build();return ReactiveRestClients.create(clientConfiguration);}
}
    //响应式模版操作@AutowiredReactiveElasticsearchOperations reactiveElasticsearchOperations;//响应式客户端@GetMapping("/getReactiveTemp")@ResponseBodypublic String getReactiveTemp(){Query query = new StringQuery("{ \"match\": { \"userLoginId\": 1 } } ");query.setPageable(PageRequest.of(0, 10));Flux<SearchHit<VisitLog>> result = reactiveElasticsearchOperations.search(query,VisitLog.class);return JSON.toJSONString(result);}

ES 原生方式加载客户端

从 ElasticSearch7.17 这个版本开始,原先的 Java 高级客户端
Java High Level REST Client 废弃了,不支持了。老实说,ElasticSearch 算是我用过的所有 Java 工具中,更新最为激进的一个了,在 Es7 中废弃了 TransportClient,7.17 又废弃了 TransportClient,那么现在用啥呢?现在的客户端叫做 Elasticsearch Java API Client。

Elasticsearch Java API Client 具有如下特性:

为所有 Elasticsearch APIs 提供强类型的请求和响应。
所有 API 都有阻塞和异步版本。
使用构建器模式,在创建复杂的嵌套结构时,可以编写简洁而可读的代码。
通过使用对象映射器(如 Jackson 或任何实现了 JSON-B 的解析器),实现应用程序类的无缝集成。
将协议处理委托给一个 http 客户端,如 Java Low Level REST Client,它负责所有传输级的问题。HTTP 连接池、重试、节点发现等等由它去完成。
关于第三点,松哥吐槽一句,确实简洁,但是可读性一般般吧。

另外还有两点需要注意:

Elasticsearch Java 客户端是向前兼容的,即该客户端支持与 Elasticsearch 的更大或相等的次要版本进行通信。
Elasticsearch Java 客户端只向后兼容默认的发行版本,并且没有做出保证。

pom.xml

<!--高版本单独使用elasticsearch client --><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.9</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency>

加载原生客户端

注意下,一定要用原生elasticsearch-java jar中的类

package org.lwd.microservice.boot.es.config;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 使用elasticsearch client 7.17.9** @author weidong* @version V1.0.0* @since 2023/7/31*/
@Configuration
public class EsRestClientConfig {@Value("${spring.elasticsearch.uris}")private String uris;@Beanpublic ElasticsearchClient initSyncRestClient() {RestClient restClient = RestClient.builder(HttpHost.create(uris)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);return client;}
}

controller使用

@AutowiredElasticsearchClient elasticsearchClient;//elasticsearch client 7.17.9@GetMapping("/getRestTemp")@ResponseBodypublic String getRestTemp(){StringReader sr = new StringReader("{\n" +"  \"query\": { \"match\": {\n" +"    \"userLoginId\": \"1\"\n" +"  }}" +"}");//查询所有/* StringReader sr = new StringReader("{\n" +"  \"query\": {\n" +"    \"match_all\" : {}\n" +"  }\n" +"}\n");*/SearchRequest request = new SearchRequest.Builder().index(Arrays.asList(new String[]{"visit_log"})).withJson(sr).build();try {SearchResponse<VisitLog>  search = elasticsearchClient.search(request,VisitLog.class);System.out.println("search.toString() = " + search.toString());long took = search.took();System.out.println("took = " + took);boolean b = search.timedOut();System.out.println("b = " + b);ShardStatistics shards = search.shards();System.out.println("shards = " + shards);HitsMetadata<VisitLog> hits = search.hits();TotalHits total = hits.total();System.out.println("total = " + total);Double maxScore = hits.maxScore();System.out.println("maxScore = " + maxScore);List<Hit<VisitLog>> list = hits.hits();for (Hit<VisitLog> visitLogHit : list) {System.out.println("visitLogHit.source() = " + JSON.toJSONString(visitLogHit.source()));System.out.println("visitLogHit.score() = " + visitLogHit.score());System.out.println("visitLogHit.index() = " + visitLogHit.index());}} catch (IOException e) {e.printStackTrace();}return "";}

可以看到,直接把查询的 JSON 参数传进来也是可以的。这样我们就可以先在 Kibana 中写好脚本,然后直接将脚本拷贝到 Java 代码中来执行就行了。

验证结果

request [POST http://10.255.20.231:9200/visit_log/_search?typed_keys=true] returned 1 warnings: [299 Elasticsearch-7.17.9-ef48222227ee6b9e70e502f0f0daa52435ee634d "Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security."]
search.toString() = SearchResponse: {"took":0,"timed_out":false,"_shards":{"failed":0.0,"successful":1.0,"total":1.0,"skipped":0.0},"hits":{"total":{"relation":"eq","value":1},"hits":[{"_index":"visit_log","_id":"2","_score":0.9808291,"_type":"_doc","_source":"org.lwd.microservice.boot.es.entity.VisitLog@1bbbdce9"}],"max_score":0.9808291}}
took = 0
b = false
shards = ShardStatistics: {"failed":0.0,"successful":1.0,"total":1.0,"skipped":0.0}
total = TotalHits: {"relation":"eq","value":1}
maxScore = 0.9808291
visitLogHit.source() = {"_class":"org.lwd.microservice.boot.es.entity.VisitLog","createTime":"2023-07-27 16:34:36","id":2,"initialRequest":"http://localhost:8023","msgContent":"test es add2","serverHostName":"weidong","serverIpAddress":"127.0.0.1","tableName":"VisitLog","userLoginId":"1"}
visitLogHit.score() = 0.9808291
visitLogHit.index() = visit_log

测试请求http文件-TestEs.http


## 新增日志
POST http://localhost:8023/es/saveVisitLog
Content-Type: application/json{"id": 3,"tableName": "VisitLog","userLoginId": 3,"serverIpAddress": "127.0.0.1","serverHostName": "weidong","initialRequest": "http://localhost:8023","msgContent": "test es add3","createTime": "2023-07-27 16:34:36"
}### 获取所有数据-不分页GET http://localhost:8023/es/getVisitLogAll### 获取所有数据-自定义查询规则GET http://localhost:8023/es/getVisitLogByUserLoginId?userLoginId=1### 获取所有数据-high restGET http://localhost:8023/es/getHighTempt### 获取所有数据-reactive restGET http://localhost:8023/es/getReactiveTemp### 获取所有数据-elasticsearch client 7.17.9GET http://localhost:8023/es/getRestTemp

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

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

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

相关文章

数据结构:顺序表(C实现)

个人主页 水月梦镜花 个人专栏 C语言 &#xff0c;数据结构 文章目录 一、顺序表二、实现思路1.存储结构2.初始化顺序表(SeqListInit)3.销毁顺序表(SeqListDestroty)4.打印顺序表(SeqListPrint)5.顺序表尾插(SeqListPushBack)and检查容量(SeqListCheckCapacity)6.顺序表头插(Se…

K8S群集调度

目录 一、调度约束二、Pod 启动典型创建过程三、K8S的调度过程3.1 Predicate&#xff08;预选策略&#xff09; 常见的算法使用3.2 常见优先级选项3.3 指定调度节点3.3.1 nodeName指定3.3.2 nodeSelector指定3.3.3 Pod亲和性与反亲和1.节点亲和硬策略示例2.节点亲和软策略示例3…

linux -网络编程-多线程并发服务器

目录 1.三次握手和四次挥手 2 滑动窗口 3 函数封装思想 4 高并发服务器 学习目标&#xff1a; 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器 1.三次握手和四次挥手 思考: 为什么…

【javaSE】 面向对象程序三大特性之继承

目录 为什么需要继承 继承的概念 继承的语法 注意事项 父类成员访问 子类中访问父类的成员变量 子类和父类不存在同名成员变量 子类和父类成员变量同名 访问原则 子类中访问父类的成员方法 成员方法名字不同 总结&#xff1a; 成员方法名字相同 总结&#xff1a; …

【决策树-鸢尾花分类】

决策树算法简介 决策树是一种基于树状结构的分类与回归算法。它通过对数据集进行递归分割&#xff0c;将样本划分为多个类别或者回归值。决策树算法的核心思想是通过构建树来对数据进行划分&#xff0c;从而实现对未知样本的预测。 决策树的构建过程 决策树的构建过程包括以…

数据结构:单链表的实现(C语言)

个人主页 &#xff1a; 水月梦镜花 个人专栏 &#xff1a; 《C语言》 《数据结构》 文章目录 前言一、单链表实现思路和图解1.节点的定义(SListNode)2.申请一个节点(BuySListNode)3.单链表打印(SListPrint)4.单链表尾插(SListPushBack)5.单链表的头插(SListPushFront)6.单链表的…

【目标检测】基于yolov5的水下垃圾检测(附代码和数据集,7684张图片)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

行云管家荣获CFS第十二届财经峰会 “2023产品科技创新奖”

7月26日至27日&#xff0c;CFS第十二届财经峰会暨2023可持续商业大会在京盛大召开。峰会主题为“激活高质量发展澎湃活力”&#xff0c;超1000位政商领袖、专家学者、企业及媒体代表出席了本次盛会&#xff0c;共同分享新技术新产品新趋势、研判全球新挑战与新变局下企业的机遇…

【方法】PDF可以转换成Word文档吗?如何操作?

很多人喜欢在工作中使用PDF&#xff0c;因为PDF格式可以准确地保留文档的原始格式&#xff0c;比如字体、图像、布局和颜色等。 但如果编辑文档的话&#xff0c;PDF还是没有Word文档方便。那可以将PDF转换成Word格式&#xff0c;再来编辑吗&#xff1f;如何操作呢&#xff1f;…

接口自动化测试平台

下载了大神的EasyTest项目demo修改了下<https://testerhome.com/topics/12648 原地址>。也有看另一位大神的HttpRunnerManager<https://github.com/HttpRunner/HttpRunnerManager 原地址>&#xff0c;由于水平有限&#xff0c;感觉有点复杂~~~ 【整整200集】超超超…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试

1.简介 Fiddler有个强大的功能&#xff0c;可以修改发送到服务器的数据包&#xff0c;但是修改前需要拦截&#xff0c;即设置断点。设置断点后&#xff0c;开始拦截接下来所有网页&#xff0c;直到取消断点。这个功能可以在数据包发送之前&#xff0c;修改请求参数&#xff1b…

JVM复习(史上最全!!!)

一、JDK、JRE、JVM的区别 JDK: 全称Java Development Kit&#xff0c;是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。 JRE: JRE&#xff0c;全称Java Runtime Environment&#xff0c;是指Java的运行环境&…

开放麒麟1.0发布一个月后,到底怎么样?另一款操作系统引发热议

具有里程碑意义 7月5日&#xff0c;国产首个开源桌面操作系统“开放麒麟1.0”正式发布。 标志着我国拥有了操作系统组件自主选型、操作系统独立构建的能力&#xff0c;填补了我国在这一领域的空白。 举国欢庆&#xff0c;算的上是里程碑意义了&#xff01; 发布后用着如何&a…

【业务功能篇57】Springboot + Spring Security 权限管理 【上篇】

4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中&#xff0c;通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源&#xff0c;分配用户菜单、资源权限&#xff0c;以及验证用户是否有访问资源权限。 4.1.2 RBAC权限设计模型 …

redis的并发安全问题:redis的事务VSLua脚本

redis为什么会发生并发安全问题&#xff1f; 在redis中&#xff0c;处理的数据都在内存中&#xff0c;数据操作效率极高&#xff0c;单线程的情况下&#xff0c;qps轻松破10w。反而在使用多线程时&#xff0c;为了保证线程安全&#xff0c;采用了一些同步机制&#xff0c;以及多…

windows中注册redis服务启动时报1067错误

注册完redis服务&#xff0c;打开计算机 服务时确实有redis服务存在&#xff0c;但是点击启动时却报1067错误&#xff0c;而命令行用redis-server.exe redis.windows.conf 命令却也可以启动 查看6379的端口也没有被占用&#xff08;netstat -ano | findstr :6379&#xff09; …

Mac 定时重启 TouchBar 脚本(缓解闪烁问题)

背景 Mac 笔记本 TouchBar 是真的脆啊&#xff0c;合盖使用一段时间就废了&#xff0c;右侧一直闪烁简直亮瞎眼 &#x1f602; 经过观察&#xff0c;总结出闪烁规律如下&#xff1a; 工作状态&#xff1a;不断操作电脑时&#xff0c;触控栏处于工作状态&#xff0c;几乎不闪…

Apipost教程?一篇文章玩转Apipost

你是否经常遇到接口开发过程中的各种问题&#xff1f;或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心&#xff01;今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost&#xff0c;并带你深入了解如何玩转它&#xff0c;轻松实现接口测试与调试。 什么是…

1992-2021年全国及31省对外开放度测算数据含原始数据和计算过程(无缺失)

1992-2021年全国及31省对外开放度测算数据含原始数据和计算过程&#xff08;无缺失&#xff09; 1、时间&#xff1a;1992-2021年 2、范围&#xff1a;全国及31省 3、指标&#xff1a;进出口总额、国内生产总值、年均汇率 4、计算方法&#xff1a;对外开放度进出口总额/GDP…

【Linux 网络】 HTTPS协议原理 对称加密 非对称加密 数字证书

HTTPS协议 HTTPS协议和HTTP协议的区别什么是“加密” 和“解密”加密和解密的小故事 为什么要进行加密&#xff1f;臭名昭著的“运营商劫持”事件 常见加密方式对称加密非对称加密 数据摘要数字签名 HTTPS工作过程探究方案 1 &#xff1a; 只使用对称加密方案2 &#xff1a; 只…