java 后端开发 工程师

技术架构

  • 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
    8
    mvn 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 编写(一种脚本语言)
    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'
    }
    也可以直接把 Gradle 本地仓库 配置成 Mavne 本地仓库,合二为一。具体做法是新建环境变量 GRADLE_USER_HOME 为 Mavne本地仓库目录,这样 Gradle工程会从 Mavne本地仓库目录寻找 jar包。

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
    8
    spring:
    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
      @Configuration
      public class RedisConfig {
      @Bean
      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
      // 生产者(主动调用)
      @Autowired
      private KafkaTemplate kafkaTemplate;
      kafkaTemplate.send(topic, data);
      // 消费者(被动调用)
      @KafkaListener(topics = {"test"})
      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
      8
      C:\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查询条件
  • 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
      @PostConstruct
      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 操作
      @Repository
      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
      @Autowired
      private DiscussPostRepository discussRepository;
      @Autowired
      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() {
      @Override
      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
    @RunWith(SpringRunner.class)  // 此注解用于指定运行测试的运行器,通常与JUnit一起使用。`SpringRunner`是Spring提供的一个JUnit运行器,用于在测试中启用Spring支持。
    @SpringBootTest // 这个注解告诉Spring Boot测试框架要加载整个Spring应用程序上下文,包括所有的bean。它是一个高级版本的`@ContextConfiguration`,它会尝试自动配置Spring应用程序上下文,通常用于集成测试。
    @ContextConfiguration(classes = CommunityApplication.class) // 这个注解用于指定要加载的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 是 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