技术架构
- Spring Boot:Java 生态首选框架之一,基于且进一步简化了Spring。
- Spring:轻量级框架,用于构建企业级 Java 应用程序。
Spring MVC: 处理浏览器请求, 三层架构, MVC模式三层 集体解决表现层的问题
MyBatis: 处理访问数据库 - Redis【6379】 操作内存的数据库,Kafka【9092】消息队列服务器,Elasticsearch【9200】搜索引擎
- Spring Cloud: 微服务,project,module??
开发环境
- 构建工具:Apache Maven
- 集成开发工具:IntelliJ IDEA
- 数据库:MySQL、Redis
- 应用服务器:Apache Tomcat【8080】(Spring Boot 默认以jar包集成了 Tomcat 作为内嵌的 Servlet 容器)
- 版本控制工具:Git
- 运维工具:Kubernetes 容器编排平台,FinalShell连接linux服务器
Java
常用 Java8 即 jdk1.8,安装jdk-8u202-windows-x64,配环境:把主目录配到 JAVA_HOME,bin 目录配到 PATH
安装配置好jdk,maven,git,idea后,基本可以开始开发
Apache Maven
- Maven 帮助我们构建项目、管理项目中的jar包;系统环境:安装路径配到 MAVEN_HOME,bin 目录配到 PATH
- 本地仓库 默认位置 ~/.m2/repository,存放从远程仓库获取的 jar 包;本机上的Maven主路径 D:/apache-maven-3.6.1,对应的用户配置文件为 D:\apache-maven-3.6.1\conf\settings.xml(更换为公司的maven配置文件)
- 在 https://mavenrepository.com 查找需要的jar包。配置阿里云镜像仓库
https://maven.aliyun.com/repository/central - 中央仓库:是 Maven 的默认仓库,包含了大量的开源 Java 类库、框架和插件,许多常用的第三方库,供开发者使用。
镜像仓库:中央仓库的镜像,如阿里云、华为云,从中央仓库同步数据,用来加速依赖的下载速度,减轻中央仓库的负担。
私服仓库:在本地或者组织内部搭建的仓库,用于存储内部开发所需的依赖和构建产物。 - 在 IntelliJ IDEA 中配置 maven仓库:”File” > “Settings” > “Build, Execution, Deployment” > “Build Tools” > “Maven”,配置maven主路径、用户设置文件和本地仓库。
- Maven 是一个强大的构建工具,它可以执行各种命令来管理项目的构建、依赖、测试等方面的任务。
以下是一些常用的Maven指令,进入项目根目录命令行终端执行:(当然也可以直接在idea点击按钮执行)1
2
3
4
5
6
7
8mvn clean # 清除项目的目标目录,删除编译生成的文件。
mvn compile # 编译项目中的Java源代码文件,并将编译结果放置在项目的目标目录(通常是target目录)中
mvn test # 运行项目的单元测试。
mvn package # 将项目打包为可执行的JAR或WAR文件,通常用于构建最终的可部署应用程序。
mvn install # 将项目构建输出的JAR或WAR文件安装到本地Maven仓库,以便其他项目可以引用它作为依赖。
mvn deploy # 将项目构建输出的JAR或WAR文件部署到远程仓库,通常用于共享依赖。
mvn clean install # 用于先清除项目目录,然后执行安装操作。(引入pom中新加的dependence)
mvn clean package # 用于先清除项目目录,然后执行打包操作。 - JAR(Java Archive)是Java平台中用于打包和分发Java类和相关资源的文件格式。它是一种压缩格式,通常包含Java类文件(.class文件),资源文件,清单文件(Manifest),以及其他可以用于Java应用程序的元数据。
- WAR(Web Application Archive)文件是一种Java Web应用程序的打包格式,通常用于部署Web应用程序到Java EE应用服务器,如Tomcat、WebSphere、或JBoss等。是一种压缩文件,通常以.war扩展名结尾,它包含了用于部署和运行Web应用程序的各种资源。
Gradle
- Java作为一门世界级主流编程语言,有一款高效易用的项目管理工具是java开发者共同追求的心原和目标。
2012年基于 Ant 和Maven产生的Gradle,弥补了不足,带来了一些更高效的特点。它使用种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。 - 系统环境:安装路径配到 GRADLE_HOME,bin 目录配到 PATH
集成 IDEA:创建项目时,”Build System” 直接使用 Gradle 插件即可,选择本地安装的 Gradle 目录。 - Gradle 目录结构与 Maven 完全一样:src/main/java 放置正式代码目录,src/main/resources 放置正式配置文件,src/test/java 放置单元测试代码,src/test/resources 放置测试配置文件,src/main/webapp 放置页面元素。
- 借助 spring 脚手架创建 Gradle 项目:https://start.spring.io/
- Gradle 配置文件 build.gradle,使用 Groovy 编写(一种脚本语言)也可以直接把 Gradle 本地仓库 配置成 Mavne 本地仓库,合二为一。具体做法是新建环境变量 GRADLE_USER_HOME 为 Mavne本地仓库目录,这样 Gradle工程会从 Mavne本地仓库目录寻找 jar包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14// Gradle会首先搜索本地仓库(默认C:\Users\admin\.gradle)以查找依赖项
repositories {
mavenLocal()
// 如果未在本地仓库找到,Gradle将会去 mavenCentral() 仓库中查找
mavenCentral()
}
// gradle工程所有的jar包在 dependencies 属性中,每一个jar包坐标有三个元素组成:group、name、version
// testCompile 表示该 jar包在测试的时候起作用,该属性为包的作用域
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
// 到 https://mvnrepository.com/ 查到 Spring Context 的 Gradle 依赖
implementation group: 'org.springframework', name: 'spring-context', version: '5.0.2.RELEASE'
}
Spring Boot
- 核心作用:起步依赖、自动配置、端点监控
- 在 https://start.spring.io 创建一个springboot项目
- Spring(Spring Framework)是一个开源的轻量级Java企业应用程序开发框架,旨在简化Java应用程序的开发。Spring本身并不直接管理Maven依赖,而是依赖Maven作为构建工具来管理项目中的依赖关系
- Spring Boot 是 Spring 框架的一个扩展,旨在简化 Spring 应用程序的开发和部署。引入了 Starter 依赖的概念,这些 Starter是预配置的依赖项集合,用于快速启动特定类型的应用程序(例如,spring-boot-starter-web 是用于构建 Web 应用程序的 Starter 依赖,它包含了 Spring MVC、Tomcat 等依赖);可以根据项目需求选择性地引入 Starter 依赖,而不必手动添加一堆依赖项。
1
2
3
4<dependency> // 在 pom.xml 中配置需要的各种 spring-boot-starter 包
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Spring
- Spring全家桶:Spring Framework, Spring Boot, Spring Cloud 微服务, Spring Cloud Data Flow 客户端
- Spring Framework:
Spring Core - IoC, AOP 管理一切
Spring Data Access - Transactions, Spring MyBatis
Web Servlet - Spring MVC
Integration - Email, Scheduling, AMQP, Security - for more -> https://leo710aka.github.io/2021/09/11/Spring/
Spring MVC
- 三层架构:表现层、业务层、数据访问层
- MVC:解决表现层的问题(Model:模型层 - View:视图层 - Controller:控制层)
- HTTP:用于传输HTML等内容的应用层协议,规定了浏览器和服务器(或本地tomcat)之间如何通信以及通信时的数据格式。
- 核心组件 - 前端控制器:DispatcherServlet,控制整个MVC
- Thymeleaf(View层):模板文件 + Model -> 模板引擎(Thymeleaf) -> Html (但现在更多是前后端分离,会使用HTML+AJAX(异步请求),采用前端框架进行渲染会更好的解耦)
在controller中写一个函数,获取数据,用model封装返回给html,在html文件中链接Thymeleaf模板,将数据动态展现。
Mysql
- 社区版 下载zip文件:https://dev.mysql.com/downloads/mysql/
mysql及navicat配置:https://blog.csdn.net/taiyang3285/article/details/130115829
注意管理员运行cmd,然后把bin配到PATH、配置本机 username: root,password: “0xxxxx” - 在application.properties文件配置 java(spring)项目连接 mysql,然后通过 Mybatis这样的持久层框架对数据库操作
1
2
3
4
5
6
7
8spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: "078114"
mybatis-plus: ...
Mybatis
- 在pom.xml中导包后,在application.properties文件配置 mybatis
- SqlSessionFactory: 用于创建SqlSession的工厂类。
- SqlSession:MyBatis的核心组件,用于向数据库执行SQL。
- 主配置文件:XML配置文件,可以对MyBatis的底层行为做出详细的配置
- Mapper接口:就是DAO接口,在MyBatis中习惯性的称之为Mapper。
Mapper映射器: 用于编写SQL,并将SQL和实体类映射的组件。采用XML、注解均可实现。
方法1:在 /java/../dao 下创建xxMapper.java(mapper接口)后,在 /resource/mapper 下创建对应的 xx-mapper.xml(映射器);
方法2:直接在mapper中加@Select等注解里写sql(复杂sql还得方法1)
Mybatis-Plus
- 是在MyBatis基础上的扩展。只做增强不做改变,为简化开发、提高效率而生。
- MyBatisPlus官方提供了starter,其中集成了 Mybatis和 MybatisPlus的所有功能,并且实现了自动装配效果。因此可以用 MybatisPlus的starter直接代替 Mybatis的starter;
1
2
3
4
5<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
Redis
- Redis是一款基于键值对的 NoSQL 数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人。同时,Redis还可以将内存中的数据以快照或日的形式保存到硬盘上,以保证数据的安全性。
- Redis典型的应用场景包括: 缓存、排行榜、计器、社交网络、消息队列等.
- Spring整合Redis:
- 引入依赖:在pom.xml中导包spring-boot-starter-data-redis
- 配置数据库参数:propert中 spring.redis.database=11 spring.redis.host=localhost spring.redis.port=6379
- 编写配置类,构造RedisTemplate(spring本身对redis的配置使其key为object类型,但string用起来更方便
1
2
3
4
5
6
7
8
9
10
11
12
public class RedisConfig {
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(RedisSerializer.string()); // 设置key的序列化方式
template.setValueSerializer(RedisSerializer.json()); // 设置value的序列化方式
template.setHashKeySerializer(RedisSerializer.string()); // 设置hash的key的序列化方式
template.setHashValueSerializer(RedisSerializer.json()); // 设置hash的value的序列化方式
template.afterPropertiesSet();
return template; } } - 访问Redis:redisTemplate.opsForValue(), redisTemplate.opsForHash, redisTemplate.opsForList(),redisTemplate.opsForSet(),redisTemplate.opsForZSet()
- for more -> https://leo710aka.github.io/2022/03/12/Redis/
Kafka
- 阻塞队列(消息系统的底层):
- BlockingQueue:处理并发和线程间的通信,帮助避免竞态条件、死锁等问题,并提高了系统的可维护性和性能。主要用于多线程编程中,以协调多个线程之间的数据传递、任务调度和同步操作。阻塞方法: put、take。
- 生产者消费者模式 - 生产者:产生数据的线程 - 消费者:使用数据的线程。
- 实现类 - ArrayBlockingQueue - LinkedBlockingQueue - PriorityBlockingQueue、SSynchronousQueue、DelayQueue等
- Kafka是一个分布式的流媒体平台应用
- 应用:消息系统(消息队列)、日志收集、用户行为追踪、流式处理
- 特点:高吞吐量、消息持久化(硬盘)、高可靠性(顺序读写)、高扩展性(集群部署)
- 术语:- Broker(服务器)、Zookeeper - Topic(存放空间)、Partition(分区)、Offset(索引)
Leader Replica(主副本)、Follower Replica
- 启动服务
- 配置:在
\config\zookeeper.properties
配置数据存放位置dataDir=d:/work/data/zookeeper
,在server.properties
配置日志存放位置log.dirs=d:/work/data/kafka-logs
- 命令行启动
1
2
3
4
5
6
7
8
9
10# 在根目录 D:\kafka_2.12-2.3.0 打开cmd【1】,启动Apache Kafka的ZooKeeper服务器
D:\kafka_2.12-2.3.0>bin\windows\zookeeper-server-start.bat config\zookeeper.properties
# 在根目录 再打开一个cmd【2】,启动Kafka服务器
D:\kafka_2.12-2.3.0>bin\windows\kafka-server-start.bat config\server.properties
# 在命令目录 D:\kafka_2.12-2.3.0\bin\windows 打开一个cmd【3】
# 创建topic,partition,replication,,, 开启 生产者
D:\kafka_2.12-2.3.0\bin\windows>kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
D:\kafka_2.12-2.3.0\bin\windows>kafka-console-producer.bat --broker-list localhost:9092 --topic test
# 在命令目录 再打开一个cmd【4】,, 开启 消费者
D:\kafka_2.12-2.3.0\bin\windows>kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
- 配置:在
- Spring整合Kafka
- 引入依赖: spring-kafka
- 配置Kafka: spring.kafka.bootstrap-servers=localhost:9092,spring.kafka.consumer.group-id=community-consumer-group,spring.kafka.consumer.enable-auto-commit=true,spring.kafka.consumer.auto-commit-interval=3000
- 通过
KafkaTemplate
进行操作:1
2
3
4
5
6
7// 生产者(主动调用)
private KafkaTemplate kafkaTemplate;
kafkaTemplate.send(topic, data);
// 消费者(被动调用)
public void handleMessage(ConsumerRecord record) {}
- Kafka使用
把kafka发送系统通知的行为当做“事件”,操作不同topic就是处理不同种类的事件。- 触发事件:评论后发布通知,点赞后发布通知,关注后发布通知
- 处理事件:封装事件对象(entity),开发事件的生产者,开发事件的消费者
- 在需要使用消息队列的controller中调用生产者(评论后发通知,点赞后发通知,关注后发通知),消费者(用户收到系统通知)将被动调用;一个消费者可以消费多种事件
Elasticsearch
- Elasticsearch简介 (Es可以看成是一个特殊的数据库,是在这个“数据库”中进行搜索)
- 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索
- 搜索速度快,可以提供实时的搜索服务
- 便于水平扩展,每秒可以处理PB级海量数据
- Elasticsearch术语
- 索引、类型、文档、字段。(相当于MySQL中的数据库、表、行、列)(6.0后类型被废弃,则索引直接对应mysql的表)
- 集群(分布式集群部署)、节点(集群中的一台服务器)、分片(进一步划分索引并发存储)、副本(对分片备份)。
- 配置:目录D:\elasticsearch-6.4.3\config,文件
elasticsearch.yml
,修改 cluster.name: nowcoder、path.data: D:\work\data\elasticsearch-6.4.3\data、path.logs: D:\work\data\elasticsearch-6.4.3\logs;把bin目录配到环境变量- 中文分词插件 elasticsearch-analysis-ik,解压到 D:\elasticsearch-6.4.3\plugin\ik
- 启动:(windows系统)双击 D:\elasticsearch-6.4.3\bin 下的
elasticsearch.bat
批处理文件即可。- 命令行操作(另开一个cmd)
1
2
3
4
5
6
7
8C:\Users\蔡枫>curl -X GET "localhost:9200/_cat/health?v" # 查看集群的健康状态
C:\Users\蔡枫>curl -X GET "localhost:9200/_cat/nodes?v" # 查看节点
C:\Users\蔡枫>curl -X GET "localhost:9200/_cat/indices?v" # 查看索引
C:\Users\蔡枫>curl -X GET "localhost:9200/_cat/indices?v"
C:\Users\蔡枫>curl -X PUT "localhost:9200/test" # 以put创建索引
{"acknowledged":true,"shards_acknowledged":true,"index":"test"}
C:\Users\蔡枫>curl -X DELETE "localhost:9200/test" # 用http协议中的delete,删除索引
{"acknowledged":true} - Postman 操作
- GET,发送指令 localhost:9200/test/_doc/1 的
request
,查询test中的数据 - PUT,发送指令 localhost:9200/test/_doc/2 的
request
,向test中存数据,可以在Body中携带raw类型的json数据 - 搜索,GET,发送指令 localhost:9200/test/_search?q=xx:yy,搜索test索引下xx中带有yy的数据
- 复杂搜索:要在Body中带raw的json查询条件
- GET,发送指令 localhost:9200/test/_doc/1 的
- 命令行操作(另开一个cmd)
- Spring 整合 Es
- 引入依赖: spring-boot-starter-data-elasticsearch
- 配置Es:spring.data.elasticsearch.cluster-name=nowcoder,spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300(9200是http端口,9300是tcp端口)
- elasticsearch和redis同时依赖于netty,运行冲突,需要在
CommunityApplication.java
加上注解1
2
3
public void init() { // 解决netty启动冲突问题
System.setProperty("es.set.netty.runtime.available.processors", "false"); } - 通过
ElasticsearchTemplate
(底层),ElasticsearchRwpository
(简易) 操作 Es
对实体类加注解,与Es索引、类型、文档、字段映射:@Document(indexName = “”, type = “”, shards = , replicas = );
配置实体类中的属性:@Id,@Field(type = FieldType.Text, analyzer = “ik_max_word”, searchAnalyzer = “ik_smart”),,
一种repository对一种实体类做Es操作(区别于@Mapper,mybatis专属的)1
2
3
4
5// DiscussPostRepository 是对 DiscussPost 做 Es 操作
public interface DiscussPostRepository
extends ElasticsearchRepository<DiscussPost, Integer> {
} // 只要继承 ElasticsearchRepository,自带save(),delete()等方法 - 搜索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private DiscussPostRepository discussRepository;
private ElasticsearchTemplate elasticTemplate;
public void saveDiscussPost(DiscussPost post) {
discussRepository.save(post); // 先要把(加了注解的)实体类存入 Es
}
public Page<DiscussPost> searchDiscussPost(String keyword, int current, int limit) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content")) // 搜索规则
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // 排序规则
.withPageable(PageRequest.of(current, limit)) // 分页
.withHighlightFields( // 设置高亮
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
).build();
return elasticTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
// ...
}
return new AggregatedPageImpl(...); } }); }
Postman
账号:1908454905@qq.com
Postman 是一个流行的 API测试工具和开发环境,它为开发人员提供了一种方便的方式来创建、测试、文档化和共享API。
API 测试: Postman 的主要功能之一是允许用户发送 HTTP 请求以测试 API 端点。您可以创建 GET、POST、PUT、DELETE 等不同类型的请求,并附加参数、标头和正文数据以模拟与 API 交互。
集合和环境: Postman 允许您组织测试请求到集合中。集合是一组相关的请求,可以方便地进行批量执行和管理。您还可以使用环境变量来动态地管理请求中的数据,以便在不同环境中轻松切换。
自动化测试: Postman 提供了测试脚本功能,您可以使用 JavaScript 编写测试脚本,以验证 API 响应是否符合预期。这使得您可以创建自动化测试套件,确保 API 的稳定性和正确性。
协作和共享: Postman 允许用户创建工作空间,多个团队成员可以在同一个工作空间中协作。您还可以共享 Postman 集合和环境,以便其他人可以重复您的测试或使用您的 API。
项目调试技巧
- 相应状态码:200 - 成功,302 - 重定向(让浏览器再发一个请求),404 - 找不到路径,500 - 服务器遇到问题(服务端有bug)
- 服务端断点调试:方法中一行代码前打断点,以debug形式启动类。启动服务后,停止在断点处,F8向下执行一步/F7进入方法内部/F9直接执行到下一个断点,观察参数如何变化。
- 客户端断点调试:在浏览器打开开发者工具,对js文件打断点
- 设置日志级别,并将日志输出到不同的终端
trace-debug-log-warn-error,按照级别记录日志,动态地启用级别。可以在application.properties
配置 logger
或在/resource下放置一个名为logback-spring.xml的文件,自动配置logger(日志存放文件大小、日志类型、存放位置、名字…) - 在/test下创建带@Test注解的测试类,直接对某一个mapper/service/..类进行测试。
通过以下注解结合在一起,可以在测试中创建一个与实际应用程序相似的Spring容器,并运行测试。这样可以确保测试能够在实际的Spring环境中运行,并且可以访问和测试应用程序中的各种组件。1
2
3// 此注解用于指定运行测试的运行器,通常与JUnit一起使用。`SpringRunner`是Spring提供的一个JUnit运行器,用于在测试中启用Spring支持。
// 这个注解告诉Spring Boot测试框架要加载整个Spring应用程序上下文,包括所有的bean。它是一个高级版本的`@ContextConfiguration`,它会尝试自动配置Spring应用程序上下文,通常用于集成测试。
// 这个注解用于指定要加载的Spring配置类。在这里,`CommunityApplication.class`是Spring Boot应用程序的主配置类,它包含了应用程序的配置信息。
单元测试
- Spring Boot Testing
- 依赖:spring-boot-starter-test
- 包括:Junit、Spring Test、AssertJ、、、
- Test Case 测试用例
- 要求:保证测试方法的独立性。
- 步骤:初始化数据、执行测试代码、验证测试结果、清理测试数据。
- 常用注解:@BeforeClass、@AfterClass、@Before、@After。
项目监控
- Spring Boot Actuator
- Endpoints:监控应用的入口,Spring Boot内置了很多端点,也支持自定义端点。
- 监控方式:HTTP 或 JMX。
- 访问路径:例如“/actuator/health”
- 注意事项:按需配置暴露的端点,并对所有端点进行权限控制。
性能优化
- 本地缓存
将数据缓存在应用服务器上,性能最好。如热帖、、
常用缓存工具: Ehcache、Guava、Caffeine等 - 分布式缓存
将数据缓存在NoSQL数据库上,跨服务器。如登录信息(不管在哪台服务器上都要查得到)
常用缓存工具: MemCache、Redis等. - 多级缓存
一级缓存(本地缓存) > 二级缓存(分布式缓存) > DB(避免访问数据库),每级缓存的内存大小、存储时间都不一样
服务器受到请求,先查看本地缓存,再查redis(分布式缓存),都没有才查DB,同时同步到本地和分布式缓存上
避免缓存雪崩(缓存失效,大量请求直达DB),提高系统的可用性
Kubernetes
- 节点:K8s中最小的计算硬件单元。它是集群中单个机器的表示。节点可能是物理机器或者虚拟机,理论上可以是任何东西。
- 集群:K8s中节点汇聚资源,形成更强大的机器。将程序部署到集群中时,它将智能地处理将工作分配给各个节点。如果添加或删除了任何节点,集群将根据需要在工作中进行转换。这对程序或程序员来说都不重要,因为机器实际上是在运行代码。
- Namespace(命名空间, 是一个逻辑隔离的环境,用于资源分组和隔离) -> InfluxDB集群,Pod(Kubernetes的基本计算单元) -> InfluxDB集群节点(逻辑上),容器 -> InfluxDB单例(物理上,部署在服务器上)
- Pod 是 Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器。(pod是逻辑概念;容器是物理概念??存在于物理服务器上)
K8s 使用控制器(如 Deployment、StatefulSet、DaemonSet 等)来管理 Pod 的生命周期,根据定义的期望状态(如副本数量、更新策略等)来创建、更新和删除 Pod。通过kubectl
命令可以查看、管理和调试 Pod。 - 容器是运行在 Pod 中的实际应用实例。K8s 使用容器运行时(如 Docker、containerd 等)来管理容器的生命周期。
每个容器运行一个镜像,容器的配置(如环境变量、挂载卷、资源限制等)在 Pod 的定义中指定。 - 镜像是容器的基础,包含了应用程序及其依赖环境。镜像通常存储在镜像仓库(如 Docker Hub、Google Container Registry 等)中。
- Pod 是 Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器。(pod是逻辑概念;容器是物理概念??存在于物理服务器上)
- 虽然 Pod 是 K8s 的基本计算单元,但它们通常不是直接在集群上启动的。相反,Pod 通常由一个抽象层来管理:部署。不必手动处理 Pod,只需声明系统的期望状态,它将自动管理。可以创建一个节点集群,并将Pod部署到集群上。如果需要允许外部通信流进入你的应用程序,与运行在Pod中的服务通信,必须打开一个通信通道,称作入口(ingress)。
- 关于 InfluxDB 集群的部署和通信:
- 部署方式:对于一个命名空间下的几个Pod,这些节点会通过 StatefulSet 或者 Deployment 来进行管理和部署。
- 调度到主机:K8s 的调度器会根据资源需求、节点的可用资源以及调度策略(如反亲和性、亲和性等)来决定 Pod 部署到哪台主机上。你可以使用以下命令查看 Pod 所在的节点信息:
kubectl get pod -n influxdb -o wide
- 通信调度:K8s 中,Pod 之间的通信通常通过 Service 来进行。Service 会为一组 Pod 提供一个稳定的 IP 地址和 DNS 名称。对于 InfluxDB 集群,可能会有一个或多个 Service 来管理数据节点和元数据节点之间的通信。你可以使用以下命令查看 InfluxDB 命名空间中的 Service:
kubectl get svc -n influxdb