分布式基本原理-CAP
什么是CAPconsistency(C 一致性)表示更新操作成功后,所有节点在同一时间的数据完全一致 availability(A 可用性)用户访问时,结果是否符合预期 partitions(P 分区容错性)可以理解为容灾,在某节点下线的时候,是否依旧能提共满足CA的服务 这是一个简单的分布式系统 图1 分布式系统结构 三选二指的是CAP理论中是没有办法达到三者共存的状态的。当我们选择其中两种特性的时候,便绝对没有办法保证另一种属性 CP状态即要保证一致性和分区容错性。在图一中表现为订单系统要阻塞等待库存系统的结果返回后,才能返回。 AP订单创建后,不等待库存减少后就返回结果。那库存数据怎么办?(异步处理后通知订单系统,若异步处理失败,有补偿机制(重新发请求,补录,校对程序)保证数据一致)。(类似淘宝) AC不拆分数据库系统,在一个数据库的一个事务中完成操作,即单体应用。下单,减库存在一个事务。缺点:不能做分区, 分区涉及网络,进而涉及分区容错性,进而选CP,AP
DDIA第一部分
什么是数据库原始数据库最基本的功能:将数据存入库 和 将数据从库里取出 数据结构的处理由此引出了我们存入库和取出库时对于数据结构的处理 分为了静态与动态处理 静态:如mysql 存进去的时候就已经限定好了一个是一个二维的对象 动态:如文档型数据库 里边的内容拿出来的时候要自定义解析的情况 如何存储世界上最简单的数据库#!/bin/bashdb_set () { echo "$1,$2" >> database}db_get () { grep "^$1," database | sed -e "s/^$1,//" | tail -n...
手写一个简单spirng框架 实现MVC
完成前边的内容之后,距离完整的spring框架就只剩下一个WebMVC了对于spring的WebMvc来说,提供了以下的组件和API支持: 一个DispatcherServlet作为核心处理组件,接收所有URL请求,然后按MVC规则转发; 基于@Controller注解的URL控制器,由应用程序提供,Spring负责解析规则; 提供ViewResolver,将应用程序的Controller处理后的结果进行渲染,给浏览器返回页面; 基于@RestController注解的REST处理机制,由应用程序提供,Spring负责将输入输出变为JSON格式; 多种拦截器和异常处理器等。 但是对于我们的简单WebMvc来说,只需要支持核心内容就好 DispatcherServlet @Controller注解 @RestController注解 ViewResolver 首先,Java...
手写一个spring框架——实现JDBC和事务
支持 JDBCTemple 声明式事务 支持REQUIRED传播模式 首先配置DataSource因为我们先前已经实现了读取xml和yaml文件的方法,所以,对于JDBC的配置,我们只需要从properties中拿东西就好了 在我们的配置文件中配置文件内容 # application.propertiessummer.datasource.url=jdbc:mysql://localhost:3306/summer_jdbc?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCsummer.datasource.username=rootsummer.datasource.password=your_passwordsummer.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 然后实现一个由HikariCP连接池库支持的DataSource @Configurationpublic class JdbcConfiguration...
手写一个简单的spring框架 AOP
思路我们使用@Aroud,@Before,@After来确定是在这个类的方法的什么时候进行处理属于是类级别的注释,使用其他的注解(方法级别)来定义要做的事 即如下的样子 @Component@Around("aroundInvocationHandler") //指定什么时候调用AOPpublic class OriginBean { @Value("${customer.name}") public String name; @Polite //指定AOP要干的事 public String hello() { return "Hello, " + name + "."; } public String morning() { return "Morning, " + name + "."; ...
手写一个简单的spring框架(二、IOC)
初始化bean思路在上一节我们实现了bean的强依赖注入,接下来我们要实现的便是弱依赖的注入,也就是字段和setter方法的注入。我们首先进行注入,但是不进行init的使用 // 在当前类及父类进行字段和方法注入:void injectProperties(BeanDefinition def, Class<?> clazz, Object bean) { // 在当前类查找Field和Method并注入: for (Field f : clazz.getDeclaredFields()) { tryInjectProperties(def, clazz, bean, f); } for (Method m : clazz.getDeclaredMethods()) { tryInjectProperties(def, clazz, bean, m); } // 在父类查找Field和Method并注入: Class<?>...
手写一个简单spirng框架(一、IOC)
简介学习的是廖雪峰老师的Summer Framework项目,在这个项目中我们手写实现了一个简单的spring框架。在这个框架中,我们会实现 context模块:实现ApplicationContext容器与Bean的管理 aop模块:实现AOP功能; jdbc模块:实现JdbcTemplate,以及声明式事务管理; web模块:实现Web MVC和REST API; boot模块:实现一个简化版的“Spring Boot”,用于打包运行; 实现ResourceResolverspring使用容器来管理bean,但是显而易见,容器是不可能自己感知到bean是在哪里存在的,所以我们需要对整个项目的Class进行一个扫描。java的ClassLoader机制可以获取到指定的Class,但是,给出一个包名,它并不能获取到该包下的所有Class,也不能获取子包。 所以我们需要自己动手实现一个文件扫描的功能 首先创建一个文件类型 public class Resource { String path; String name; public...
git微进阶
git微进阶技巧作为程序员git属于是我们工作生活中的一个必备技能,但是看过网上的大部分教程后,基本上还是只会git pull和git push...
github实现CD
如何使用GitHub Actions实现Spring Boot程序的持续部署(CD)由于学习上的需要,我需要不断对GitHub上的分支进行合并与持续向远端推送。虽然手动操作并不难,但次数较多时,自动化部署功能显得尤为必要。本文将介绍如何利用GitHub Actions实现Spring Boot程序的持续部署。 Actions基本使用方法基本概念 workflow:GitHub的配置文件,存放在.github/workflow文件夹中。 job:一个workflow由多个job构成。 step:每个job分为多个步骤。 action:每个步骤执行的具体动作。 字段解释runs-on选择执行环境,目前支持的环境包括: ubuntu-latest windows-latest macos-latest uses调用GitHub市场中的预定义脚本。例如: uses: actions/checkout@v4 使用Actions将Java程序部署到远程服务器上使用Maven打包 进入GitHub Actions管理界面,创建新workflow。 选择Java with...