- 浏览: 270984 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (183)
- oracle (4)
- informix (1)
- web开发 (6)
- java (49)
- hibernate (1)
- hadoop (1)
- spring (23)
- 非技术 (8)
- ibatis2 (5)
- Linux (6)
- tomcat (14)
- nginx (7)
- dubbo (3)
- myibatis (7)
- webservice 开发 (2)
- mysql (2)
- svn (2)
- redis (7)
- 分布式技术 (17)
- zookeeper (2)
- kafka (2)
- velocity (1)
- maven (7)
- js (1)
- freemarker (1)
- Thymeleaf (3)
- 代码审计 (1)
- ibatis3 (1)
- rabbitmq (1)
最新评论
1.下载 Elasticsearch ,下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.zip
解压文件,进入bin目录 单击“elasticsearch.bat”启动。
2.启动后,在浏览器输入如下命令
1:查看是否部署成功
http://localhost:9200/
如下说明成功:
{
"name" : "l5YPTqU",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "WMcmRohDSqSYPOtvF8Nb-A",
"version" : {
"number" : "5.1.1",
"build_hash" : "5395e21",
"build_date" : "2016-12-06T12:36:15.409Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}
2:查看健康情况
http://localhost:9200/_cat/health?v
如下:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1514450156 16:35:56 elasticsearch yellow 1 1 255 255 0 0 255 0 - 50.0%
下面是一些通过curl操作es的例子,_cat用于查看,_update用于更新,_bulk用于批量操作,_search用于查询。
具体的就不一一解释了。可参见官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
##To check the cluster health
curl 'localhost:9200/_cat/health?v'
##get a list of nodes in our cluster
curl 'localhost:9200/_cat/nodes?v'
##take a peek at our indices
curl 'localhost:9200/_cat/indices?v'
##create an index named "customer"
curl -XPUT 'localhost:9200/customer?pretty'
##index a simple customer document into the customer index,
"external" type, with an ID of 1
curl -XPUT 'localhost:9200/customer/external/1?pretty'-d
' { "name": "John Doe" }'
常用的插件head,bigdesk,essql 请先下载插件
安装命令如下:
bin/plugin --url file:///path/to/plugin --install plugin-name
3.搭建开发环境
<properties>
<log4j.version>2.7</log4j.version>
</properties>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.1.1</version>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
Java代码:
package com.example.demo;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.LocalTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.BulkIndexByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryAction;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.net.InetAddress;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@RunWith(SpringRunner.class)
//@SpringBootTest
public class DemoApplicationTests {
/**
* 获取客户端
* @return
* @throws Exception
*/
public TransportClient getClient() throws Exception{
//设置集群名称
Settings settings = Settings.builder().put("cluster.name", "elasticsearch")
.put("client.transport.sniff", true).build();// 集群名
//创建client
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
/**
* 创建索引
* @throws Exception
*/
@Test
public void addIndex() throws Exception{
TransportClient client = getClient();
for(int i=22;i<24;i++) {
String user ="user";//索引名称
String message = "message";//类型
String id =i+"";// id
IndexResponse response = client.prepareIndex(user, message, id)
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("user", "kimchy"+i)
.field("postDate", new Date())
.field("message", "trying out Elasticsearch"+i)
.endObject()
)
.get();
System.out.println(response);
}
System.out.println("===");
client.close();
//输出结果
// IndexResponse[index=user22,type=message22,id=22,version=1,result=created,shards={"_shards":{"total":2,"successful":1,"failed":0}}]
// IndexResponse[index=user23,type=message23,id=23,version=1,result=created,shards={"_shards":{"total":2,"successful":1,"failed":0}}]
}
/**
* 获取索引
* @throws Exception
*/
@Test
public void getIndex() throws Exception{
TransportClient client = getClient();
GetResponse response = client.prepareGet("user22","message22","22").get();
System.out.println(response.toString());
System.out.println("end:"+response.getSourceAsString());
client.close();
//输出结果
// {"_index":"user22","_type":"message22","_id":"22","_version":1,"found":true,"_source":{"user":"kimchy22","postDate":"2017-12-28T08:40:12.628Z","message":"trying out Elasticsearch22"}}
// end:{"user":"kimchy22","postDate":"2017-12-28T08:40:12.628Z","message":"trying out Elasticsearch22"}
}
/**
* 多条件获得多索引
* @throws Exception
*/
@Test
public void mutilGetIndex() throws Exception{
TransportClient client = getClient();
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("user1", "message1", "1")
.add("user2", "message2", "2","3")
.add("user3", "message3", "3")
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
GetResponse response = itemResponse.getResponse();
String result ="begin";
if (response.isExists()) {
String json = response.getSourceAsString();
result = result +json+";end";
}
System.out.println(result);
}
}
/**
* 按照id,类型,索引 删除索引
* @throws Exception
*/
@Test
public void deleteIndex() throws Exception{
TransportClient client = getClient();
DeleteResponse response = client.prepareDelete("user3","message3","3").get();
System.out.println(response.toString());
System.out.println("end:"+response.status());
client.close();
}
/**
* 按照查询条件删除索引
* @throws Exception
*/
@Test
public void deletebyQueryIndex() throws Exception{
TransportClient client = getClient();
BulkIndexByScrollResponse response =
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("user", "kimchy")) //对应soure中的内容
.source("user")//索引名称
.get();
long deleted = response.getDeleted();
System.out.println("end::"+deleted);
client.close();
}
/**
* 按照条件查询获取索引
* @throws Exception
*/
@Test
public void searchIndex() throws Exception{
TransportClient client = getClient();
SearchResponse response = client.prepareSearch("user1", "user2")
.setTypes("message1", "message2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("user", "kimchy1")) // Query
//.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18)) // Filter
.setFrom(0).setSize(60).setExplain(true)
.get();
System.out.println("response::"+response.toString());
SearchHit[] searchHit = response.getHits().getHits();
if(null !=searchHit && searchHit.length >0){
int len = searchHit.length;
for(int j=0;j<len;j++) {
SearchHit hit = searchHit[j];
System.out.println("id:"+hit.id()+";;type:"+hit.type()
+";source:"+hit.getSourceAsString());
}
}
System.out.println(response.getHits().getHits());
System.out.println("end==");
}
}
解压文件,进入bin目录 单击“elasticsearch.bat”启动。
2.启动后,在浏览器输入如下命令
1:查看是否部署成功
http://localhost:9200/
如下说明成功:
{
"name" : "l5YPTqU",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "WMcmRohDSqSYPOtvF8Nb-A",
"version" : {
"number" : "5.1.1",
"build_hash" : "5395e21",
"build_date" : "2016-12-06T12:36:15.409Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}
2:查看健康情况
http://localhost:9200/_cat/health?v
如下:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1514450156 16:35:56 elasticsearch yellow 1 1 255 255 0 0 255 0 - 50.0%
下面是一些通过curl操作es的例子,_cat用于查看,_update用于更新,_bulk用于批量操作,_search用于查询。
具体的就不一一解释了。可参见官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
##To check the cluster health
curl 'localhost:9200/_cat/health?v'
##get a list of nodes in our cluster
curl 'localhost:9200/_cat/nodes?v'
##take a peek at our indices
curl 'localhost:9200/_cat/indices?v'
##create an index named "customer"
curl -XPUT 'localhost:9200/customer?pretty'
##index a simple customer document into the customer index,
"external" type, with an ID of 1
curl -XPUT 'localhost:9200/customer/external/1?pretty'-d
' { "name": "John Doe" }'
常用的插件head,bigdesk,essql 请先下载插件
安装命令如下:
bin/plugin --url file:///path/to/plugin --install plugin-name
3.搭建开发环境
<properties>
<log4j.version>2.7</log4j.version>
</properties>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.1.1</version>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
Java代码:
package com.example.demo;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.LocalTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.BulkIndexByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryAction;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.net.InetAddress;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@RunWith(SpringRunner.class)
//@SpringBootTest
public class DemoApplicationTests {
/**
* 获取客户端
* @return
* @throws Exception
*/
public TransportClient getClient() throws Exception{
//设置集群名称
Settings settings = Settings.builder().put("cluster.name", "elasticsearch")
.put("client.transport.sniff", true).build();// 集群名
//创建client
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
/**
* 创建索引
* @throws Exception
*/
@Test
public void addIndex() throws Exception{
TransportClient client = getClient();
for(int i=22;i<24;i++) {
String user ="user";//索引名称
String message = "message";//类型
String id =i+"";// id
IndexResponse response = client.prepareIndex(user, message, id)
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field("user", "kimchy"+i)
.field("postDate", new Date())
.field("message", "trying out Elasticsearch"+i)
.endObject()
)
.get();
System.out.println(response);
}
System.out.println("===");
client.close();
//输出结果
// IndexResponse[index=user22,type=message22,id=22,version=1,result=created,shards={"_shards":{"total":2,"successful":1,"failed":0}}]
// IndexResponse[index=user23,type=message23,id=23,version=1,result=created,shards={"_shards":{"total":2,"successful":1,"failed":0}}]
}
/**
* 获取索引
* @throws Exception
*/
@Test
public void getIndex() throws Exception{
TransportClient client = getClient();
GetResponse response = client.prepareGet("user22","message22","22").get();
System.out.println(response.toString());
System.out.println("end:"+response.getSourceAsString());
client.close();
//输出结果
// {"_index":"user22","_type":"message22","_id":"22","_version":1,"found":true,"_source":{"user":"kimchy22","postDate":"2017-12-28T08:40:12.628Z","message":"trying out Elasticsearch22"}}
// end:{"user":"kimchy22","postDate":"2017-12-28T08:40:12.628Z","message":"trying out Elasticsearch22"}
}
/**
* 多条件获得多索引
* @throws Exception
*/
@Test
public void mutilGetIndex() throws Exception{
TransportClient client = getClient();
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("user1", "message1", "1")
.add("user2", "message2", "2","3")
.add("user3", "message3", "3")
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
GetResponse response = itemResponse.getResponse();
String result ="begin";
if (response.isExists()) {
String json = response.getSourceAsString();
result = result +json+";end";
}
System.out.println(result);
}
}
/**
* 按照id,类型,索引 删除索引
* @throws Exception
*/
@Test
public void deleteIndex() throws Exception{
TransportClient client = getClient();
DeleteResponse response = client.prepareDelete("user3","message3","3").get();
System.out.println(response.toString());
System.out.println("end:"+response.status());
client.close();
}
/**
* 按照查询条件删除索引
* @throws Exception
*/
@Test
public void deletebyQueryIndex() throws Exception{
TransportClient client = getClient();
BulkIndexByScrollResponse response =
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("user", "kimchy")) //对应soure中的内容
.source("user")//索引名称
.get();
long deleted = response.getDeleted();
System.out.println("end::"+deleted);
client.close();
}
/**
* 按照条件查询获取索引
* @throws Exception
*/
@Test
public void searchIndex() throws Exception{
TransportClient client = getClient();
SearchResponse response = client.prepareSearch("user1", "user2")
.setTypes("message1", "message2")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("user", "kimchy1")) // Query
//.setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18)) // Filter
.setFrom(0).setSize(60).setExplain(true)
.get();
System.out.println("response::"+response.toString());
SearchHit[] searchHit = response.getHits().getHits();
if(null !=searchHit && searchHit.length >0){
int len = searchHit.length;
for(int j=0;j<len;j++) {
SearchHit hit = searchHit[j];
System.out.println("id:"+hit.id()+";;type:"+hit.type()
+";source:"+hit.getSourceAsString());
}
}
System.out.println(response.getHits().getHits());
System.out.println("end==");
}
}
发表评论
-
solr 5.0 集群搭建
2018-01-13 14:55 603一,搭建zookeeper集群 1.下载zookeeper解压 ... -
solr 5.0搭建 和使用 ik分词
2017-12-19 15:14 4901.将下载来的solr-5.0.0.zip解压。 创建D:\ ... -
eureka 服务搭建
2017-11-07 16:59 6681.新建一个springboot的项目。 2.添加pom.xm ... -
修改dubbox支持sping4
2017-09-12 09:03 4801.通过修改依赖jar包和修改部分代码,使dubbox可以在s ... -
solr 4.9 学习
2017-09-05 11:04 4841.下载solr 4.9.0 下载地址 ... -
jenkins自动构建发布程序
2017-08-31 10:28 16181.首先到 https://jenkins.io/ 下载win ... -
FastDFS分布式文件系统使用
2017-08-30 10:28 647安装参照: http://blog.csdn.net/hard ... -
RocketMQ 3.2.6 web监控程序
2017-08-04 14:09 6161.针对 rocketmq3.2.6监控代码在附件中 2. ... -
RocketMQ 3.2.6安装以及测试
2017-08-02 16:34 1697下载 alibaba-rocketmq-3.2.6.tar.g ... -
roketmq3.2.6
2017-04-20 15:30 438roketmq3.2.6 设置 #设置rocketmq的地址 ... -
uncode-schedule 学习
2017-04-11 16:34 578在多台机器都存在定时任务时,通过zookeeper 实现定 ... -
分布式锁 zookeeper
2017-04-06 11:27 407package zk.lock; import ja ... -
分布式锁实现两种方式
2017-03-16 17:13 572package org.gjp; import ja ... -
disconf使用
2017-03-07 10:33 705disconf 已经搭建成功(http://gjp014. ... -
disconf安装过程
2017-03-06 15:49 7281.首先下载 https://github.com/kn ... -
curator 实现分布式锁
2017-02-08 16:20 555package org.gjp; import j ...
相关推荐
这种设计使得Elasticsearch易于使用,并且可以与任何支持HTTP和JSON的编程语言配合。为了在Java项目中使用Elasticsearch,官方推荐使用JavaHighLevelRESTClient。该客户端提供了简单易用的API进行文档的索引、搜索和...
### Elasticsearch与ES-RestAPI技术概述 #### 一、Elasticsearch简介 Elasticsearch是一款高性能的分布式搜索和分析引擎,适用于实时数据处理场景。它基于Lucene构建,提供了强大的分布式多用户全文检索功能,通过...
总之,Elasticsearch 7.7 版本结合一键安装脚本 `installES.sh`,使得用户能快速搭建和使用这个强大的全文搜索引擎,无论是对大规模数据的快速检索,还是对实时分析的需求,都能提供优秀的解决方案。
2. 修改 `config/elasticsearch.yml` 和 `jvm.options` 文件以适应环境需求。 3. 双击 `bin/elasticsearch.bat` 启动服务,或在命令行使用 `elasticsearch-service.bat manager` 进行服务管理。 **集群搭建与扩展**...
Elasticsearch 5.6.3 是一个高度可扩展、高性能的开源全文搜索引擎,由Apache许可协议发布。...如果你遇到无法访问网站的问题,下载并安装这个版本的Elasticsearch,将有助于本地搭建搜索环境,进行数据管理和分析。
此外,Elasticsearch的RESTful API使其可以与各种编程语言无缝对接,这大大增加了其通用性和易用性。 总之,这个压缩包为用户提供了全面的Elasticsearch生态环境,包括核心引擎、中文处理、管理和可视化的工具,是...
5. **API驱动**:Elasticsearch主要通过HTTP RESTful API进行交互,这使得它易于集成到各种开发环境中,支持多种编程语言。 6. **安全性**:6.5.0版本增强了安全功能,包括用户认证、授权和加密通信,确保数据的...
Elasticsearch是一个...总之,Elasticsearch-7.6.2是Java平台上的一个强大搜索和分析引擎,适合在Windows x86_64系统上搭建,提供灵活的部署、易用的API、高效的搜索和强大的聚合分析能力,是大数据时代的重要工具。
在Windows环境下部署和使用Elasticsearch 8.5.3需要理解上述知识点,结合具体业务需求进行适当的配置和优化,以充分发挥其功能和性能优势。同时,持续关注官方更新,确保系统的稳定性和安全性。
这个版本的压缩包文件“elasticsearch-5.6.3.tar.gz”包含了完整的Elasticsearch服务,用户可以通过解压和配置来搭建自己的搜索服务。 首先,Elasticsearch基于Apache Lucene构建,它优化了全文索引和搜索性能,使...
Elasticsearch采用了RESTful API,使得与各种编程语言的集成变得简单,包括Python。 2. Django:Django是一个高级的Python Web框架,遵循“DRY”(Don't Repeat Yourself)原则,用于快速开发安全、可维护的网站。...
3. **连接Elasticsearch**:在Coprocessor中,使用Elasticsearch的Java API建立与ES集群的连接,创建索引和映射,然后将HBase中的数据写入相应的Elasticsearch索引。 4. **处理数据**:根据业务需求,可能需要对...
`elasticsearch-6.1.0.tar.gz` 是一个包含 Elasticsearch 6.1.0 版本源代码的压缩包,是搭建 ELKF 日志分析环境的重要组成部分。ELKF(Elasticsearch, Logstash, Kibana, and Filebeat)是一套强大的开源日志分析...
这个版本可能包含了Elasticsearch服务器的可执行文件、配置文件、JAR包等,用于搭建和运行Elasticsearch服务。在使用前,需要根据官方文档配置环境变量、设置集群名称、分配内存等参数,然后启动服务。 在实际应用...
**Elasticsearch-RHLC Master** 是一...通过学习和实践Elasticsearch-RHLC Master项目,你可以掌握如何在SpringBoot环境中高效地利用Elasticsearch处理数据,这对于构建现代、高性能的搜索引擎或数据分析应用至关重要。
以上知识点涵盖了 Elasticsearch 作为一个搜索引擎的核心功能,以及 IK 分词器和 Head 插件在中文处理和集群监控方面的应用,这些都是在搭建和使用 Elasticsearch 系统时需要了解和掌握的关键概念。
在Linux环境下搭建Android应用开发环境,首先需要安装JDK,它是编写和编译Java代码的基础。然后安装Android SDK,其中包含了Android开发所需的工具、API库以及模拟器。使用SDK Manager可以下载不同版本的Android SDK...
《OpenGL ES编程指南》英文版是一本详细介绍OpenGL ES编程的书籍,由Aaftab Munshi、Dan Ginsburg和Dave Shreiner三位作者撰写。这本书内容全面,示例丰富,涵盖了OpenGL ES 2.0的相关知识。本书不仅为初学者提供了...
7. **Spring Cloud Sleuth**:日志追踪工具,整合 Zipkin 或 ELK(Elasticsearch, Logstash, Kibana)等,用于收集微服务间的调用链信息,帮助分析性能瓶颈和问题定位。 8. **Spring Cloud Stream**:消息驱动的...