【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)

文章目录

  • 01. 05.16 周一
    • 1.1)Spring Boot
      • 1.1.1) Spring Boot的组成部分
      • 1.1.2) 了解自动配置的实现原理
    • 1.2)数组降序
  • 02. 05.19 周四
    • 1.1)二叉树
      • 1.1.1)二叉搜索树
    • 1.2) Spring Boot自动配置实现原理
      • 1.2.1) 可以通过module的方式加入java的包依赖
      • 1.2.3) 构造自己的Spring Boot类来实现自动装配
    • 1.3)了解起步依赖及其实现原理
      • 1.3.1)关于Maven依赖的小技巧
  • 03. 05.20 周五
    • 3.1)二叉搜索树
      • 3.1.1) 验证二叉搜索树
    • 3.2) Spring Boot的起步依赖
      • 3.2.1) 定制自己的Start
    • 3.3) 深挖Spring Boot的配置加载机制
    • 3.4)PropertySource
    • 3.5) 认识Spring Boot的各类 Actuator EndPoint
      • 3.5.1) 常见 Actuator
      • 3.5.2) 如何访问 Actuator Endpoint
    • 3.6) 动手制作自己的Health Indicator
    • 3.7) 通过 Micrometer获取运行数据
      • 3.7.1) 认识 Micrometer
      • 3.7.2) 一些核心度量指标
  • 04. 05.21 周六
    • 4.1)通过Spring Boot Admin了解程序的运行状态
      • 4.1.1)目的和主要功能
      • 4.1.2)快速上手
    • 4.2)如何定制web容器的运行参数
      • 4.2.1) Spring Boot的内嵌web容器
      • 4.2.2)修改容器配置
    • 4.3)如何配置容器支持 http/2
      • 4.3.1) 配置https支持
    • 4.4) 二叉树
      • 4.4.1) 最近公共祖先
    • 4.5) 了解可执行Jar背后的秘密
    • 4.6)如何将Spring Boot应用打包成Docker镜像文件
      • 4.6.1)什么是 `Docker` 镜像
      • 4.6.2) Dockerfile命令
  • 05. 05.22 周日
    • 5.1)JVM能支持的最大线程数
    • 5.2) 简单理解微服务
    • 5.3)如何理解云原生(Cloud Native)
      • 5.3.1)云原生应用要求
    • 5.4)12-Factor APP
      • 5.4.1) 了解 12-Factors
        • 5.4.1.1) 一份基准代码,多份部署
        • 5.4.1.2) 显式声明依赖关系
        • 5.4.1.3) 严格分离构建和执行
        • 5.4.1.4) 以一个或多个无状态进程运行应用
        • 5.4.1.5) 快速启动和优雅终止可最大化健壮性
        • 5.4.1.6) 尽可能的保持开发,预发布,线上环境相同
      • 5.5) 认识`Spring Cloud`的组成部分
        • 5.5.1) Spring Cloud的架构图
        • 5.5.2) Spring Cloud的主要功能

01. 05.16 周一

1.1)Spring Boot

1.1.1) Spring Boot的组成部分

  • 01 Spring家族

  • 02 Spring Boot不是什么

  • 03 Spring Boot特性
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第1张图片

  • Spring Boot四大核心
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第2张图片

1.1.2) 了解自动配置的实现原理

  • 01 了解自动配置
  • 02 自动配置的实现原理

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第3张图片

  • 条件注解

spring boot使用的条件注解来实现的自动配置

1.2)数组降序

// 降序排列时,int[]数组必须为 Integer[]数组,升序则不需要这个要求
Integer[] nums = new Integer[]{2, 3, 1};
//int[] nums = new int[]{2, 3, 1};
// 降序排列-01
Arrays.sort(nums, Collections.reverseOrder());

// 降序排列-02
Arrays.sort(nums, new Comparator<Integer>(){
//    @Override
    public int compare(Integer a, Integer b){
        return b - a;
    }
});

// 降序排列 -03
Arrays.sort(nums, (o1, o2)->(o2 - o1));



02. 05.19 周四

1.1)二叉树

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第4张图片

  • 二叉树的代码示例
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第5张图片

1.1.1)二叉搜索树

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第6张图片

1.2) Spring Boot自动配置实现原理

自动配置

  • 基于添加的 JAR依赖自动对Spring Boot应用程序进行配置
  • spring-boot-autoconfiguration

开启自动配置

  • @EnableAutoConfiguration
    • exculde = Class[]
  • @SpringBootAplication 注解已经包含了 @EnableAutoConfiguration了

实现原理

  • @EnableAutoConfiguration注解帮我们 import了一个类 AutoConfigutationImportSelector ,这个类会替我们加载 META-INF/spring.facultories里边的一个特定属性
    autoconfiguration.EnableAutoConfiguration
    这个 spring.facultories中含有很多的 自动配置类

1.2.1) 可以通过module的方式加入java的包依赖

  • 不通过Jar包发布在 maven的形式,直接通过 module的方式在 pom.xml文件中引入即可
  • 可以自定义 失败分析器 FailureAnalysis

问题演示:Spring 3.x是没有 @Conditional帮助我们进行自动加载的,我们怎么解决该问题?

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第7张图片

  • 解决思路:

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第8张图片

1.2.3) 构造自己的Spring Boot类来实现自动装配

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第9张图片

怎么实现的 低版本的Spring中类似自动配置的功能:

  • 通过 BeanFacultyPostProcessor 进行判断,在Bean定义后做后置处理
  • 配置加载:
  • 编写 Java Config 类
    - 通过 compant-scan
    - 通过XML文件 import

1.3)了解起步依赖及其实现原理

1.3.1)关于Maven依赖的小技巧

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第10张图片

  • mvn dependency:tree
  • IDEA Maven Helper插件

排除特定依赖

  • exclusion

统一管理依赖

  • dependencyManagement
  • Bill of Materials - bom

03. 05.20 周五

3.1)二叉搜索树

为了避免二叉搜索树的退化成链表,时间复杂度提升,做的AVL树, Splay Tree(伸展树), KD Tree(K-dimensional树)等。

3.1.1) 验证二叉搜索树

  • 思路: 时刻采用 中序遍历判断数组是升序的,或者使用 递归的办法,递归判读是否是二叉搜索树,或者获取其返回的最大值和最小值,比较得到也可以
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第11张图片

  • Python的中序遍历判断是否 二插搜索树的方式

方法01:中序遍历01
【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第12张图片

方法02:中序遍历02

  • Python使用前序遍历判断
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第13张图片

3.2) Spring Boot的起步依赖

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第14张图片

3.2.1) 定制自己的Start

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第15张图片

3.3) 深挖Spring Boot的配置加载机制

  • 01 外化配置加载顺序
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第16张图片

  • 02 第2优先级的相关顺序
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第17张图片

  • 03 第3优先级:jar包的相关加载顺序
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第18张图片

  • 04 第4优先级: 加了注解 @Configuration 的类
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第19张图片

3.4)PropertySource

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第20张图片

  • Spring Boot中的 @ConfigurationProperties 注解
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第21张图片

  • 定制自己的 PropertySource

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第22张图片

3.5) 认识Spring Boot的各类 Actuator EndPoint

3.5.1) 常见 Actuator

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第23张图片

  • 常见的 Actuator

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第24张图片

  • 续表 Actuator
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第25张图片

3.5.2) 如何访问 Actuator Endpoint

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第26张图片

  • http方式访问 actuator endpoint的示意图
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第27张图片
  • JMX的方式,可以使用 jconsole的方式访问
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第28张图片

3.6) 动手制作自己的Health Indicator

在这里插入图片描述

  • Spring Boot自带的 Health Indicator
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第29张图片

3.7) 通过 Micrometer获取运行数据

3.7.1) 认识 Micrometer

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第30张图片

  • Micrometer 支持多种监控系统
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第31张图片

3.7.2) 一些核心度量指标

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第32张图片

  • Micrometer在 Spring Boot 2.x中的实现
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第33张图片

  • 核心度量项 & 其他度量项
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第34张图片

  • 自定义度量指标
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第35张图片

  • 在 actuator/prometheus 中的展现我们自定义的 micrometer值 order.count (已经自动转成了下划线形式 order_count_total)

04. 05.21 周六

4.1)通过Spring Boot Admin了解程序的运行状态

4.1.1)目的和主要功能

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第36张图片

4.1.2)快速上手

  • 安全控制
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第37张图片

  • 安全控制-客户端配置
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第38张图片

  • 管理界面
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第39张图片

  • 界面展现

实际应用中可以线上生产环境使用一套 监控系统就行,比如 prometheus 等,避免再增加一个 Spring Boot Admin 这样的另一个监控系统

4.2)如何定制web容器的运行参数

https://time.geekbang.org/course/detail/100023501-89594

4.2.1) Spring Boot的内嵌web容器

4.2.2)修改容器配置

  • Tomcat特定配置
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第40张图片

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第41张图片

  • 通过编程的方式配置内嵌web服务器
    -【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第42张图片

  • 配置的代码示例

4.3)如何配置容器支持 http/2

4.3.1) 配置https支持

  • 生成证书文件

  • 客户端https支持
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第43张图片

  • 配置 HTTP/2 支持
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第44张图片

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第45张图片

4.4) 二叉树

4.4.1) 最近公共祖先

  • 思路

  • 二叉树最近公共祖先 代码示例:

  • 二叉搜索树的最近公共祖先

    方法01:

方法02:
【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第46张图片

4.5) 了解可执行Jar背后的秘密

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第47张图片

  • 具体结构
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第48张图片

  • 如何找到程序的入口

  • 可直接运行的Jar

  • 默认脚本中的一些配置项
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第49张图片

4.6)如何将Spring Boot应用打包成Docker镜像文件

4.6.1)什么是 Docker 镜像

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第50张图片

4.6.2) Dockerfile命令

05. 05.22 周日

5.1)JVM能支持的最大线程数

概述
大致能创建 几千个线程,具体跟 JVM设置参数和计算机性能有关系

公式

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Numbers of Threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小

具体例子

结合上面例子我们来对公式说明一下:
MaxProcessMemory 在32位的 windows下是 2G
JVMMemory eclipse默认启动的程序内存是64M
ReservedOsMemory 一般是130M左右
ThreadStackSize 32位 JDK 1.6默认的stacksize 325K左右
公式如下:
(210241024-641024-1301024)/325 = 5841
公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确)

由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

5.2) 简单理解微服务

  • 微服务就是一些协同工作的小而自治的服务
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第51张图片

  • 微服务的优点
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第52张图片

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第53张图片

  • 实施微服务的代价

5.3)如何理解云原生(Cloud Native)

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。

5.3.1)云原生应用要求

  • devops (自动化运维)、 continuous delivery (持续集成/持续交付)、 MicroServices (微服务)、 Containers(容器)
    【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第54张图片

  • CNCFCloud Native Computing Foundation 基金会

5.4)12-Factor APP

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第55张图片

5.4.1) 了解 12-Factors

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第56张图片

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第57张图片

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第58张图片

5.4.1.1) 一份基准代码,多份部署

5.4.1.2) 显式声明依赖关系

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第59张图片

5.4.1.3) 严格分离构建和执行

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第60张图片

5.4.1.4) 以一个或多个无状态进程运行应用

在这里插入图片描述

5.4.1.5) 快速启动和优雅终止可最大化健壮性

5.4.1.6) 尽可能的保持开发,预发布,线上环境相同

【每周Java技术】2022.05.16 周一 ~ 2022.05.22 周日(Srping Boot | 二叉树 | Docker | 微服务/云原生)_第61张图片

5.5) 认识Spring Cloud的组成部分

5.5.1) Spring Cloud的架构图

5.5.2) Spring Cloud的主要功能

  • Spring Cloud的版本号规则

你可能感兴趣的:(Spring,技术日知录,java,spring,boot,spring)