springboot第54集:思维导图后端知识点微服务分布式架构周刊

BigDecimal num1 = new BigDecimal('0.1');
BigDecimal num2 = new BigDecimal('0.2');
BigDecimal sum = num1.add(num2);
BigDecimal product = num1.multiply(num2);

mysql: innodb和myisam有什么区别?

InnoDB和Myisam是MySQL数据库中两种非常流行的存储引擎,主要存在四大区别:

  1. 事务支持能力不同:InnoDB支持ACID事务。所以可以处理高级别的数据完整性和可靠性。而MyISAM不支持事务,所以MyISAM在处理需要高度数据完整性的操作时不如InnoDB可靠。

  2. 锁定机制不同:InnoDB使用行级别锁定,所以在并发读写操作时性能更好,尤其是对于在线事务处理类型的应用,比如并发量大的实时系统。而MyISAM使用表级锁定。这可能在高并发的情况下导致性能问题,因为当一条记录被修改时,整个表都会被锁定。

  3. 数据完整性和恢复能力不同:InnoDB提供了外键约束来维护数据完整性,支持崩溃后的自动恢复。但是MyISAM不支持外键,并且在系统崩溃后恢复数据也更加困难。

  4. 存储结构,InnoDB是把数据存储在表空间中的,所以可以更好地处理大型数据库。而MyISAM是把数据存储在独立的文件里,每个表一个文件,适合读密集型的应用。

总的来说,InnoDB是一个更优秀的存储引擎,提供了事务支持,行级锁定和数据完整性,非常适合需要高并发和高可靠性的系统。

mysql什么是索引,底层原理是什么?

索引是数据库重要的概念之一,用于快速定位和访问数据表中的数据。它类似于书籍的目录,可以加速数据的检索过程,不需要扫描整个数据表,索引基于一个或多个列构建,能提高查询数据的效率。

对于业务系统的查询效率提升有非常大的帮助:

-- customers 表的 customer_id 和 orders 表的 customer_id 都有索引
SELECT customers.customer_id, orders.order_date
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.customer_id = 101;

对于业务系统的查询效率提升有非常大的帮助,复杂的查询,比如带有JOIN或WHERE子句的查询,索引可以显著提高查询速度。可以优化UPDATE和DELETE的操作。

UPDATE customers
SET address = '新地址'
WHERE customer_id = 123;

因为这些增删改操作都需要先查找目标数据再进行操作。

如何实现索引:有两种重要的实现方式。B树和B+树。B树是一个平衡的多路搜索树,它的所有叶节点都在同一层。每个节点包含多个键(key),和指向子节点的指针,B树保证了每个节点的键和子节点树,在预定范围内,B+树是B树的变种,所有的数据记录都存储在叶子节点,内部节点仅存储键值,也就是非叶子节点不存储实际数据。仅存储键值。这些键值作为分隔值,指导搜索操作向下走向正确的分支,而叶节点之间以指针相连,形成一个链表。相比于B树,B+树的查询效率更加稳定,因为所有的查询都要到达叶子节点,由于叶子节点形成链表,B+树也特别适合于顺序遍历操作。

事务的四大特性是什么

MySQL事务的四大特性指的就是:原子性,一致性,隔离性,持久性。

原子性:指的就是事务被视为不可分割的最小单元,一个事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作。

隔离性指的就是一个事务所做的修改在最终提交一起,对其它事务是不可见的。

一致性指的就是数据库的数据在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

系统发生崩溃可以用重做日志进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。

事务的ACID特性,不是很好理解:原子性,一致性,隔离性,持久性。

只有满足一致性,事务的执行结果才是正确的。在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。事务满足持久化是为了能应对系统崩溃的情况。

什么是面向对象

面向对象是一种思想,世间万物都可以看做一个对象,Java是一个支持并发、基于类和面向对象的计算机高级编程语言。面向对象软件开发具有的优点有:1. 代码开发模块化,更易维护和修改;2. 代码复用性强;3. 增加代码的可读性。

面向对象有三大特征:封装,继承,多态。

封装就是给对象提供了隐藏内部特性和行为的能力;对象提供一些能被其他对象访问的方法,来改变它内部的数据;在Java当中有4种修饰符:default,public,private,protected。每一种修饰符给其他的位于同一个包或者不同包下面对象,赋予了不同的访问权限。

default: 同包中;public:都可以;protected:不同包,不是继承子类;private:同类中成员

继承就是给对象提供了以基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。

多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作,可以应用到其他类型的值上面。

多态中,父类作为形参的方法和子类作为形参的方法都是一样的。形参父类类型可以接收子类对象。这是多态的特性。

DDD到底是什么

三层架构:模型,视图,控制器

  1. 业务接口层:Module API

  2. 业务逻辑层:VO,Service

  3. 数据访问层:PO,MapperXML,Dao

DDD四层架构:(全称:领域驱动设计,所谓的领域就是特定业务领域的问题和逻辑,驱动指的就是以业务领域的复杂性为核心进行软件设计和开发,和它对比的就是传统的MVC架构),拆分为四层就是表示层,应用层,领域层和基础设施层。

表示层负责与用户交互(处理用户请求)

// 表示层
// Web 控制器:处理HTTP请求
@RestController
public class ArticleController {
 private ArticleApplicationService articleApplicationService;

 @PostMapping('/articles')
 public Article createArticle(@RequestBody ArticleDto articleDto) {
  return articleApplicationService.createArticle(articleDto.getTitle(), articleDto.getContent());
 }
}

应用层负责业务逻辑的执行,但它不包含业务规则或知识,只协调我们接下来的领域层来实现业务用例

// 领域实体:文章
public class Article {
 private Long id; // 值对象
 private String title;
 private String content;

 // 构造函数,getter和setter省略
}

// 领域服务:文章服务
public class ArticleService {
 public Article createArticle(String title, String content) {
  // 领域事件:创建文章的业务逻辑
  return new Article(title, content);
 }
}

而领域层就包含业务逻辑的核心部分,是DDD的关键所在。包括实体(Entity)、值对象(Value Object)、领域服务(Domain Service)、领域事件(Domain Event)等。这一层封装了业务逻辑,定义了业务规则和业务行为。

基础设施层:主要用来连接数据库和各种中间件

// 数据访问接口:文章仓储
public interface ArticleRepository {
 Article save(Article article);
 Article findById(Long id);
}

// 数据访问实现:基于某种数据库的文章仓储实现
public class SqlArticleRepository implements ArticleRepository {
 // 实现数据库操作的细节
}

DDD的特点是强调业务逻辑的重要性,也就是领域层逻辑,更加专注业务,减少沟通成本

  1. 用户接口层:API,DTO

  2. 应用层: Application Service

  3. 领域层:MapperXM Repository Aggregate(Domain Service Entity ValueObject)

  4. 基础层:Repository AOP (缓存 总线 网关 第三方工具 文件 其它)

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第1张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第2张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第3张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第4张图片 image.png

Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控制等功能。

  1. termQuery("cName.keyword", xxxBO.getCName()):

  • 这是一个精确查询(Term Query),用于匹配 cName.keyword 字段与 depotInfoBO.getCName() 的值相等的文档。

matchPhraseQuery("mobile", xxxBO.getMobile()):

  • 这是一个短语匹配查询(Match Phrase Query),用于匹配 mobile 字段包含与 xxxBO.getMobile() 相等的短语的文档。

termsQuery("xxxId.keyword", xxxBO.getDepotIds()):

  • 这是一个多值查询(Terms Query),用于匹配 xxxId.keyword 字段包含在 xxxBO.getDepotIds() 列表中的文档。

boolQueryBuilder.must(QueryBuilders
            .wildcardQuery("cName.keyword", "*" + depotInfoBO.getCName() + "*"));

Netty是一个用于构建网络应用程序的Java框架。Netty提供了一个抽象的Channel接口,它表示一个可以进行I/O操作的通道,例如网络套接字。

Netty的Channel接口是一个抽象的概念,它提供了统一的API,使得可以在不同的传输协议(如TCP、UDP等)上进行操作。在Netty中,你可以通过不同的Channel实现来处理不同类型的网络通信。

在Netty中,常见的一些Channel实现包括:

  1. NioSocketChannel: 基于Java NIO的Socket通道。

  2. NioServerSocketChannel: 基于Java NIO的ServerSocket通道。

  3. OioSocketChannel: 基于传统的阻塞I/O的Socket通道。

  4. OioServerSocketChannel: 基于传统的阻塞I/O的ServerSocket通道。

连接鉴权

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第5张图片 image.png

连接的客户端信息在Zookeeper创建的临时节点

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第6张图片 image.png

自定义发送心跳包的内容.

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第7张图片 image.png

自定义Netty的channel

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第8张图片 image.png

客户端连接的clientId和channelId的信息在Redis存储的

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第9张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第10张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第11张图片 image.png

客户端请求Netty服务器地址

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第12张图片 image.png

定义的Kafka的topic

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第13张图片 image.png

基于Netty的websocket消息推送服务器

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第14张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第15张图片 image.png

发送心跳间隔以及服务超时剔除

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第16张图片 image.png

消息服务系统架构图

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第17张图片 image.png

Zookeeper注册的Netty服务器的临时节点

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第18张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第19张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第20张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第21张图片 image.png springboot第54集:思维导图后端知识点微服务分布式架构周刊_第22张图片 image.png
sender.addCallback(// 发送成功的回调
        result -> log.info("Send success:offset({}),partition({}),topic({})",// 打印成功消息 发送成功:偏移量({}), 分区({}), 主题({})
                result.getRecordMetadata().offset(),
                result.getRecordMetadata().partition(),
                result.getRecordMetadata().topic()),
        ex -> log.error("Send fail:{}", ex.getMessage()));// 发送失败的回调

Pipeline 是 Netty 中用于处理和拦截事件的容器。在 Netty 中,所有的处理逻辑被组织成一个由多个 ChannelHandler 组成的 ChannelPipelinePipeline 是对这些 ChannelHandler 进行组织和管理的容器。

当数据通过 Channel 时,会经过 ChannelPipeline 中的一系列 ChannelHandler 处理。每个 ChannelHandler 负责处理或者传递事件,这样可以将整个处理逻辑划分为多个小的、可复用的组件。

所以,ChannelPipeline 就是一个处理数据的通道,ChannelHandler 就是处理逻辑的组件。 Netty 的事件模型基于这个概念,通过 ChannelPipeline 将处理逻辑拆分成一系列的 ChannelHandler,方便扩展和管理。

docker pull mrvautin/adminmongo

Installation

  1. Navigate to folder & install adminMongo: git clone https://github.com/mrvautin/adminMongo.git && cd adminMongo

  2. Install dependencies: npm install

  3. Start application: npm start or node app

  4. Visit http://127.0.0.1:1234 in your browser

Note: Node.js version 4.x or above is required

Electron App

adminMongo can also be used as a cross platform Electron application. Due to the size of Electron it will need to be built manually.

To build for Mac:

$ npm run-script packageOsx

To build for Windows:

$ npm run-script packageWin32

To build for Linux:

$ npm run-script packageLinux

Once built, the executable will be in the /releases folder.

springboot第54集:思维导图后端知识点微服务分布式架构周刊_第23张图片 image.png
public enum HttpStatus {
    CONTINUE(100, "继续"),
    SWITCHING_PROTOCOLS(101, "切换协议"),
    PROCESSING(102, "处理中"),
    CHECKPOINT(103, "检查点"),
    OK(200, "请求成功"),
    CREATED(201, "已创建"),
    ACCEPTED(202, "已接受"),
    NON_AUTHORITATIVE_INFORMATION(203, "非权威信息"),
    NO_CONTENT(204, "无内容"),
    RESET_CONTENT(205, "重置内容"),
    PARTIAL_CONTENT(206, "部分内容"),
    MULTI_STATUS(207, "多状态"),
    ALREADY_REPORTED(208, "已报告"),
    IM_USED(226, "IM Used"),
    MULTIPLE_CHOICES(300, "多种选择"),
    MOVED_PERMANENTLY(301, "永久移动"),
    FOUND(302, "找到"),
    /** @deprecated */
    @Deprecated
    MOVED_TEMPORARILY(302, "临时移动"),
    SEE_OTHER(303, "查看其他"),
    NOT_MODIFIED(304, "未修改"),
    /** @deprecated */
    @Deprecated
    USE_PROXY(305, "使用代理"),
    TEMPORARY_REDIRECT(307, "临时重定向"),
    PERMANENT_REDIRECT(308, "永久重定向"),
    BAD_REQUEST(400, "错误的请求"),
    UNAUTHORIZED(401, "未经授权"),
    PAYMENT_REQUIRED(402, "需要付款"),
    FORBIDDEN(403, "禁止访问"),
    NOT_FOUND(404, "未找到"),
    METHOD_NOT_ALLOWED(405, "不允许使用该方法"),
    NOT_ACCEPTABLE(406, "不可接受"),
    PROXY_AUTHENTICATION_REQUIRED(407, "需要代理身份验证"),
    REQUEST_TIMEOUT(408, "请求超时"),
    CONFLICT(409, "请求冲突"),
    GONE(410, "资源不可用"),
    LENGTH_REQUIRED(411, "需要内容长度"),
    PRECONDITION_FAILED(412, "先决条件失败"),
    PAYLOAD_TOO_LARGE(413, "请求实体过大"),
    /** @deprecated */
    @Deprecated
    REQUEST_ENTITY_TOO_LARGE(413, "请求实体过大"),
    URI_TOO_LONG(414, "请求URI过长"),
    /** @deprecated */
    @Deprecated
    REQUEST_URI_TOO_LONG(414, "请求URI过长"),
    UNSUPPORTED_MEDIA_TYPE(415, "不支持的媒体类型"),
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "请求范围不符合要求"),
    EXPECTATION_FAILED(417, "期望失败"),
    I_AM_A_TEAPOT(418, "我是一个茶壶"),
    /** @deprecated */
    @Deprecated
    INSUFFICIENT_SPACE_ON_RESOURCE(419, "资源空间不足"),
    /** @deprecated */
    @Deprecated
    METHOD_FAILURE(420, "方法失败"),
    /** @deprecated */
    @Deprecated
    DESTINATION_LOCKED(421, "目标被锁定"),
    UNPROCESSABLE_ENTITY(422, "不可处理的实体"),
    LOCKED(423, "已锁定"),
    FAILED_DEPENDENCY(424, "请求的依赖关系失败"),
    TOO_EARLY(425, "操作过早"),
    UPGRADE_REQUIRED(426, "需要升级"),
    PRECONDITION_REQUIRED(428, "要求先决条件"),
    TOO_MANY_REQUESTS(429, "请求过多"),
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "请求头字段太大"),
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "因法律原因不可用"),
    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
    NOT_IMPLEMENTED(501, "未实现"),
    BAD_GATEWAY(502, "网关错误"),
    SERVICE_UNAVAILABLE(503, "服务不可用"),
    GATEWAY_TIMEOUT(504, "网关超时"),
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP版本不支持"),
    VARIANT_ALSO_NEGOTIATES(506, "变体协商"),
    INSUFFICIENT_STORAGE(507, "存储空间不足"),
    LOOP_DETECTED(508, "检测到循环"),
    BANDWIDTH_LIMIT_EXCEEDED(509, "超出
String amount = "10.50";
String amountInCents = new BigDecimal(amount)
                            .multiply(new BigDecimal("100"))
                            .toBigInteger()
                            .toString();

System.out.println(amountInCents);  // 输出:1050


new BigDecimal(amount)  // 将金额(假设为字符串格式)转换为 BigDecimal 类型
    .multiply(new BigDecimal("100"))  // 乘以 100,将金额转换为以分为单位的 BigDecimal 类型
    .toBigInteger()  // 将结果转换为 BigInteger 类型
    .toString();  // 将 BigInteger 转换为字符串

Maven项目的POM文件(Project Object Model,项目对象模型)的一部分。元素指定了项目所遵循的POM模式的版本。

  • :指定项目的唯一标识符。:指定项目的版本号。:指定项目的组织或公司ID,:指定项目的打包类型。: 指定项目的名称。: 提供对项目的简要描述。

  • : 指定项目源代码的编码格式为UTF-8。

  • : 指定项目报告输出的编码格式为UTF-8。

  • : 指定项目使用的Java版本为1.8。

  • : 指定项目使用的Hutool库的版本为5.3.0。

  • : 指定父项目的组织或公司ID,这里是 org.springframework.boot

  • : 指定父项目的唯一标识符,这里是 spring-boot-starter-parent

  • : 指定父项目的版本号,这里是 2.3.2.RELEASE


    
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            Hoxton.SR9
            pom
            import
        

        
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            2.2.6.RELEASE
            pom
            import
        
    

    
    
        org.springframework.boot
        spring-boot
    

    
    
        org.springframework.boot
        spring-boot-starter-web
    

    
    
        org.springframework.kafka
        spring-kafka
    

    
    
        org.springframework.boot
        spring-boot-starter-data-redis
    

    
    
        org.springframework.boot
        spring-boot-starter-aop
    

    
    
        org.springframework.boot
        spring-boot-starter-logging
    

    
    
        org.springframework.cloud
        spring-cloud-starter-openfeign
    

    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-ribbon
    

    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-discovery
        
            
            
                com.alibaba.nacos
                nacos-client
            
        
    

    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-config
    

    
    
        com.alibaba
        easyexcel
        3.1.1
    

    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    

    
    
        org.springframework.cloud
        spring-cloud-starter-openfeign
    

    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-hystrix
    

    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-hystrix-dashboard
    

    
    
        org.springframework.cloud
        spring-cloud-starter-zipkin
    

    
    
        org.springframework.cloud
        spring-cloud-starter-sleuth
    

    
    
        de.codecentric
        spring-boot-admin-starter-client
        2.1.0
    

    
    
        io.projectreactor
        reactor-core
        3.2.10.RELEASE
    

    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        2.1.0
    

    
    
        com.github.pagehelper
        pagehelper
        5.1.3
    

    
    
        tk.mybatis
        mapper
        3.4.6
    

    
    
        com.alibaba
        druid
        1.1.12
    

    
    
        redis.clients
        jedis
    

    
    
        io.springfox
        springfox-swagger2
        2.7.0
    

    
    
        io.springfox
        springfox-swagger-ui
        2.7.0
    

    
    
        com.github.xiaoymin
        knife4j-spring-boot-starter
        2.0.4
    

    
    
        mysql
        mysql-connector-java
        5.1.48
    

    
    
        org.apache.httpcomponents
        httpclient
        4.5.12
    

    
    
        org.apache.httpcomponents
        httpmime
        4.5.12
    

    
    
        com.google.code.gson
        gson
        2.8.5
    

    
    
        org.projectlombok
        lombok
        1.18.8
    

    
    
        org.apache.commons
        commons-lang3
        3.9
    

    
    
        com.datastax.cassandra
        cassandra-driver-core
        3.1.2
    

    
    
        com.codahale.metrics
        metrics-core
        3.0.2
    

    
    
        com.google.guava
        guava
        18.0
    

    
    
        org.elasticsearch.client
        transport
        7.11.2
        
            
                commons-logging
                commons-logging
            
        
    

    
    
        org.apache.commons
        commons-lang3
        3.9
    

    
    
        commons-collections
        commons-collections
        3.2.1
    

    
    
        com.alibaba.nacos
        nacos-client
    

    
    
        org.elasticsearch
        elasticsearch
        7.11.2
    

    
    
        org.elasticsearch.plugin
        transport-netty4-client
        7.11.2
    

    
    
        org.elasticsearch.client
        elasticsearch-rest-client
        7.11.2
    

    
    
        ru.yandex.clickhouse
        clickhouse-jdbc
        0.2.4
    

    
    
        org.elasticsearch.client
        elasticsearch-rest-high-level-client
        7.11.2
    

    
    
        org.mongodb
        mongo-java-driver
        3.12.5
    

    
    
        com.alibaba
        fastjson
        1.2.75
        compile
    

    
    
        cn.hutool
        hutool-all
        ${hutool.version}
    

    
    
        cn.hutool
        hutool-core
        5.6.3
        compile
    

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

你可能感兴趣的:(架构,spring,boot,微服务,分布式,后端)