Logstash
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据、格式化数据,然后将数据发送到es进行存储。
ElasticSearch
Elasticsearch 是基于JSON的分布式搜索和分析引擎,是利用倒排索引实现的全文索引。
Kibana Kibana 能够可视化 Elasticsearch 中的数据并操作。
es在elk生态圈中处于核心地位,是开源大规模基于倒排索引的全文搜索分析引擎,他几乎能实时的支持存储搜索分析。 优势:
- 横向可扩展性: 增加服务器可直接配置在集群中
- 分片机制提供更好的分布性: 分而治之的方式来提升处理效率
- 高可用: 提供复制(replica)机制
- 实时性: 通过将磁盘上的文件放入文件缓存系统来提高查询速度
基本概念
- Index: 一系列文档的集合,类似于mysql中数据库的概念
- Type: 在Index里面可以定义不同的type,type的概念类似于mysql中表的概念,是一系列具有相同特征数据的结合。
- Document: 文档的概念类似于mysql中的一条存储记录,并且为json格式,在Index下的不同type下,可以有许多document。
- Shards: 在数据量很大的时候,进行水平的扩展,提高搜索性能
- Replicas: 防止某个分片的数据丢失,可以并行得在备份数据里及搜索提高性能
elasticsearch查询语法
_cat API
查询当前es集群的相关消息,包括集群中的index数量、运行状态、当前集群所在的ip,目的在于将查询的结果以更加友好的方式输出。
- cat: 输出
_cat api
中所有支持的查询命令 - cat health: 检查es集群运行的状况
- cat count: 可以快速的查询集群或者index中文档的数量
- cat indices: 查询当前集群中所有index的数据,包括index的分片数、document的数量、存储所用的空间大小...
- 其他cat api参考官方文档: www.elastic.co/guide/en/el…[1]
Search APIs
搜索数据,查询语法多,功能强大 REST request URI: 轻便快速的URI查询方法 REST request body: 可以有许多限制条件的json格式查询方法
- "query": 在请求消息体中的
query
允许我们用Query DSL
的方式查询。- "term": 查询时判断某个document是否包含某个具体的值,不会对被查询的值进行分词查询
- "match" 将被查询值进行分词,然后用评分机制(TF/IDF)进行打分
- "match_phrase": 查询指定段落
- "Bool": 结合其他真值查询,通常和
must should mustnot
(与或非)一起组合出复杂的查询 - "range": 查询时指定某个字段在某个特定的范围
location / {
# 指向我们打包后上传的前端文件
root /opt/nginx/dist;
index index.html;
}
location /jwt/ {
# 转发请求到后端服务网关
proxy_pass http://127.0.0.1:8765/jwt/;
}
location /api/ {
proxy_pass http://127.0.0.1:8765/api/;
}
默认的 Nginx 配置文件路径如下:
- Nginx 主配置文件路径:
/www/server/nginx/conf/nginx.conf
- 网站配置文件路径:
/www/server/panel/vhost/nginx/
- 默认主页文件路径:
/www/server/panel/vhost/index.html
1.开始nginx
切换到相应路径
start nginx.exe
2.重新加载配置文件
nginx -s reload
进入jar包所在路径
输入:
代码语言:javascript复制nohup java -jar xxx.jar &
按下回车后再输入exit(注意,一定要输入exit,才能让其一直运行。)
要想让其停止运行,输入:
代码语言:javascript复制netstat -antp | grep java
然后停止对应进程:
代码语言:javascript复制kill -9 pid
TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
一、Swagger报错:
1、报错类型:
TypeError: Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body
2、解决方案:
请求方式错误:请求参数使用了@RequestBody注解,就要用Post来进行请求
二、@RequestParam与@RequestBody的区别
1、@RequestParam:
@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求。
2、@RequestBody:
@RequestParam接收的参数是来自requestBody中,即请求体。主要用来接收前端传递给后端的json字符串中的数据的,所以只能发送POST请求。
代码语言:javascript复制server {
listen 80;
server_name www.aaa.ink;
client_max_body_size 1000M;
client_body_timeout 20s;
client_header_timeout 10s;
send_timeout 30s;
ssl_protocols TLSv1.2;
charset utf-8;
#后端接口
location ^~ /api/ {
proxy_pass http://127.0.0.1:8080/api/;
}
location ~/(.*)$ {
#前端项目
root /usr/local/nginx/ttm;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- LB 转发的时候带上
X-Forwarded-Port
请求头,转发原始请求的端口号(需要 LB 转发自己能够控制,我们如果要配置还需要让 DevOps 的童鞋帮忙弄,如果完全是自己控制的就比较方便【推荐】) - 在使用 Swagger 中间件之前把
X-Forwarded-Port
请求头设置为443
(不够灵活,如果访问 LB 是 http 或者有特别的端口号就会有问题) - 在使用 swagger 中间件之前把
X-Forwarded-Host
请求头移除掉,这样就不会有 servers 这个属性了(感觉不够优雅) - 注册一个
PreSerializeFilter
把 Servers 清空
在Swagger UI中,您可以使用servers
配置指定API的服务器信息。这使您能够在Swagger UI中定义和切换不同的服务器配置,以便与不同的API环境进行交互。
以下是一个示例Swagger UI配置文件,演示如何使用servers
配置:
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SwaggerConfig {
@Value("${swagger.enabled:true}")
private boolean enabled;
@Value("${swagger.pathMapping:/api}")
private String pathMapping;
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
.enable(enabled)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build()
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(pathMapping)
.servers(servers());
}
private List<Server> servers() {
List<Server> servers = new ArrayList<>();
servers.add(new Server("https://1024bat.cn"));
// 添加其他服务器配置
return servers;
}
// 其他方法...
}
具体的错误消息为 "org.apache.ibatis.type.TypeException: Could not set parameters for mapping"。该错误通常发生在尝试为 MyBatis 映射中的参数设置值时出现问题。
根据错误消息,这个具体的问题是 "Error setting non null for parameter #1 with JdbcType null",即尝试为第一个参数设置非空值时出现了问题,并且 JdbcType 为 null。另外,错误消息还提到了一个类型转换问题:"java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.String"。
这意味着在你的 MyBatis 映射文件中,可能存在一个参数类型不匹配的问题。具体地说,它期望一个 String 类型的参数,但实际传入的是一个 Long 类型的值,导致类型转换失败。
为了解决这个问题,你可以尝试以下几个步骤:
- 检查参数类型:检查 MyBatis 映射文件中相关的参数定义,确保参数类型与数据库字段的类型匹配。如果参数类型与数据库字段类型不匹配,可能会导致类型转换错误。
- 检查传入的参数值:检查代码中传入的参数值,确保参数值的类型与 MyBatis 映射文件中定义的参数类型一致。如果参数值的类型不正确,你可能需要进行相应的类型转换或更正。
- 设置正确的 JdbcType:在 MyBatis 映射文件中,尝试为该参数设置一个合适的 JdbcType。你可以通过在映射文件中的参数定义中添加
jdbcType
属性来指定 JdbcType,例如jdbcType="VARCHAR"
。 - 检查配置:检查 MyBatis 的配置文件,确保没有配置问题,例如类型别名或类型处理器的配置。
image.png
如果你希望在Spring Boot中,当数据库中没有对应值时,仍然返回字段但其值为空,你可以使用Jackson库的另一个配置选项。
在Spring Boot的配置文件中添加以下配置:
代码语言:javascript复制spring.jackson.default-property-inclusion=non_empty
或者,在application.yml
配置文件中使用以下配置:
spring:
jackson:
default-property-inclusion: non_empty
这将告诉Jackson在序列化对象时,忽略值为null
或空的属性,并只返回非空属性。当数据库中没有对应值时,该属性将被序列化为空字符串而不是null
。
请注意,non_empty
选项除了将null
值排除在外,还会排除空字符串、空集合、空数组等。如果你只想排除null
值而保留空字符串,请使用non_null
选项。
使用上述配置后,当属性的值为null
时,它将被序列化为一个空字符串。如果属性的值为空字符串或空集合,则不会返回该属性。
SpringBoot Jackson 支持 Java8 LocalDate 格式和 null 转 “”
代码语言:javascript复制@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// 1.将null转""
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object paramT, JsonGenerator paramJsonGenerator, SerializerProvider paramSerializerProvider) throws IOException {
//设置返回null转为 空字符串""
paramJsonGenerator.writeString("");
}
});
// 2.支持java8 LocalDate时间
objectMapper.findAndRegisterModules();
return objectMapper;
}
default-property-inclusion
配置属性有以下几个选项:
always
: 始终包含属性,即使属性值为null
或空值。non_null
: 只包含非null
的属性,其他空值(如空字符串、空集合、空数组)将被排除。non_absent
: 包含非null
和非缺失(absent)的属性。"缺失"指的是在JSON中未出现的属性。non_default
: 包含非null
和非默认值的属性。"默认值"是指Java对象字段的默认初始化值,例如0
、false
、空字符串等。non_empty
: 包含非null
和非空的属性,其他空值(如空字符串、空集合、空数组)将被排除。null
: 包含所有属性,即使属性值为null
或空值。
在Spring Boot中,默认的配置选项是default-property-inclusion=null
,即所有属性都被包含在序列化的结果中,包括null
和空值。
根据提供的错误信息,看起来存在JSON解析错误。错误提示显示在解析过程中遇到了意外的字符'}',期望的是双引号以开始字段名。
这种情况通常发生在接收的JSON数据格式不正确时,可能是由于发送的数据格式错误或存在其他格式问题。请确保传递给JSON.parse()
的数据是有效的JSON字符串,并符合JSON的语法要求。
您可以尝试检查传递给JSON.parse()
的event.data
数据,并确保它是有效的JSON字符串。检查JSON字符串中是否存在不正确的字符、缺少引号或其他语法错误。
另外,您可以使用console.log(event.data)
输出接收到的event.data
数据,以便查看实际接收到的内容。这样可以更好地了解接收到的数据,以便进一步调试和定位问题。
如果您需要更详细的帮助,请提供实际接收到的event.data
数据,以便我能够更准确地帮助您解决问题。
仓库地址:https://github.com/webVueBlog/JavaGuideInterview
参考资料
[1]
https://link.jianshu.com?t=https://www.elastic.co/guide/en/elasticsearch/reference/5.5/cat.html: https://link.juejin.cn?target=https://link.jianshu.com?t=https://www.elastic.co/guide/en/elasticsearch/reference/5.5/cat.html