fyzn12
RSS SITEMAP

Articles

  • 数据库的事务

    1. 数据库的事务 1.1 什么是事务 作为单个逻辑工作单位的一系列操作,要么完全成功,要么完全失败。 1.2 事务的四大特征ACID A Atomic(原子性) 事务中包含的操作被看作一个整体的业务单元,这样业务单元要么完全成功,要么完全失败。最小的单元 C Consistency(一致性) 事务在完成时,必须使所有的数据都保持一致状态,在数据库中所有的修改都基于事务,保证了数据的完整性 I Isolation(隔离性) 下面将会重点讲解隔离 D Durability(持久性) 事务结束后,所有的数据会固化到一个地方,如保存到磁盘中,即使断电后也可以提供给相应程序访问 1.3 事务的隔离级别 1.3.1 读未提交造成的脏读 是最低的隔离级别,其含义是允许一个事务读取另外一个事务没有提交的数据。未提交读是一种危险 的隔离级别,所以一般在我们实际的开发中应用不广,但是它的优点在于并发能力高,适合那些对数据 一致性没有要求而追求高并发的场景,它的最大坏处是出现脏读。让我们看看可能发生的脏读场景, 如表所示。 T3时刻,因为采用未提交读,所以事务2可以读取事务l未提交的库存数据为1,这里当它扣减 库存后则数据为0,然后它提交了事务,库存就变为了。,而事务l在TS时刻回滚事 务,因为第一类丢失更新已经被克服,所以它不会将库存回滚到2,那么最后的结果就变为了 0,这样就出现了错误。脏读一般是比较危险的隔离级别,在我们实际应用中采用得不多。 为了克服脏读的问题,数据库隔离级别还提供了读已提交(readcommited)的级别, 下面我们时论它。 1.3.2 读已提交 读已提交解决了读未提交造成的脏读问题,但读已提交依然造成了另外一个问题–不可重复读 读已提交: 是指一个事务只能读取另外一个事务已经提交的数据,不能读取未提交的数据。 在T3时刻事务2读取库存的时候,因为事务l未提交事务,所以读出的库存为l,于是事务2 认为当前可扣减库存;在T4时刻,事务l己经提交事务,所以在TS时刻,它扣减库存的时候 就发现库存为0,于是就无法扣减库存了。这里的问题在于事务2之前认为可以扣减,而到扣 减那一步却发现已经不可以扣减,于是库存对于事务2而言是一个可变化的值,这样的现象 我们称为不可重复读,这就是读写提交的一个不足。为了克服这个不足,数据库的隔离级别 还提出了可重复读的隔离级别,它能够消除不可重读的问题。 1.3.3 可重复读 可以看到,事务2在T3时刻尝试读取库存,但是此时这个库存己经被事务1事先读取,所以这 个时候数据库就阻塞它的读取,直至事务1提交,事务2才能读取库存的值。此时己经是TS时 刻,而读取到的值为0,这时就已经无法扣减了,显然在读写提交中出现的不可重复读的场 景被消除了。但是这样也会引发新的问题的出现,这就是幻读。 下面演示造成幻读的实战 1.3.4 序列化 (串行化) 串行化(Serializable):是数据库最高的隔离级别,它会要求所有的SQL都会按照顺序执 行,这样就可以克服上述隔离级别出现的各种问题,所以它能够完全保证数据的一致性。 2.
  • SpringBoot优点

    1. SpringBoot简介 1.1 SpringBoot的优点 创建独立的Spring应用程序 嵌入Tomcat、Jetty或者Undertow,无序部署WAR文件 允许通过Maven来根据需要获取starter; 尽可能自动部署Spring; 提供生产就绪功能,如指标、健康检查和外部配置; 绝对没有代码生成,对XMl没有要求配置。 1.2 传统SpringMVC和SpringBoot的对比 1.2.1 SpringMVC的工作原理 1.2.2 两者的对比 在传统的SpringMVC项目开发中,开发一个简易的SpringMVC项目,需要配置DispatcherServlet, 也需要配置SpringIoC的容器。你可以选择使用web.xml的配置来实现,当然,如果你使用的是 Servlet 3.1规范,也可以继承由SpringMVC提供的 AbstractAnnotationConfigDispatcherServletlnitializer来配置SpringMVC项目。
  • 策略模式

    1 OO設計原則 OO設計的五大原則 单一职责原则:就一个类而言,应该仅有一个引起他变化的原因。 开放封闭原则:实现开放封闭的核心思想就是对抽象编程,而不是对具体编程,因为抽象相对稳定。 依赖倒置原则:依赖抽象,不要依赖具体。 里氏代换原则:子类型必须能够替换到他们的父类型。主要着眼于对抽象和多态简历在继承的基础上 接口隔离原则:多个和客户相关的接口要好于一个通用接口 2 设计模式————策略模式 2.1 策略模式原理 分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里放具体设定行为对象。 原则就是:分离变化部分,封装接口,基于接口编程实现各种功能。此模式让行为算法的变化独立于算法的使用者。 2.2 策略模式设计的代码分析————模拟鸭子项目 2.2.1 抽象出鸭子的行为,鸭子具有飞行能力和叫声,抽象出该接口 package com.fyzn12.api; /** * @author ZhangRongJun * @version 1.0 * @date 2020/9/2 10:42 * @description:会飞的鸭子 */ public interface FlyBehavior { void fly(); } package com.fyzn12.api; /** * @author ZhangRongJun * @version 1.0 * @date 2020/9/2 10:43 * @description:叫声 */ public interface QuackBehavior { void quack(); } 2.
  • SpringCloud微服务网关技术Zuul

    1 网关的简介 1.1 网关API(接口) Gateway(网关) 网关的概念:相当于客户端请求统一请求到网关服务器上,再由网关服务器进行转发请求到实际的服务器地址上, 类似于Nginx。 网关的作用:网关可以拦截客户端所有请求,对该请求进行权限控制、负载均衡、日志管理、接口调用监控等 网关和过滤器的区别:过滤器适合于单个tomcat服务器进行拦截请求,网关是拦截整个微服务所有请求。 网关分为内网网关和外网网关 Nginx和Zuul网关的区别: 1. Zuul和Nginx都可以实现负载均衡、反向代理、过滤请求、实现网关效果 2. 不同点 (1)Nginx采用C语言编写,Zuul采用java语言编写,Zuul的负载均衡实现是采用Ribbon + eureka实现本地负载均衡 (2)Nginx负载均衡实现采用服务器端实现负载均衡 (3)Nginx比Zuul功能更加强大,因为Nginx整合一些脚本语言(Nginx + Lua) (4)Nginx适合于服务器端负载均衡 (5)Zuul适合服务中实现网关,而且使用技术是java 最好建议nginx + zuul实现网关 nginx作用实现反向代理 zuul对微服务实现网关拦截 1.2 接口在什么背景下产生的 在面向服务架构和微服务背景下差生,目的是为了解耦。 1.3 接口分类 开放接口—–其他机构合作伙伴进行调用(必须在外网访问),如微信公众号开发,需要通过appid + appsocket 生成accessToken 进行通信。对接支付宝开发、微信开发;目的可以授权,遵循OAuth2.0协议方式 内部接口 一般只能在局域网中进行访问,服务调用之间关系都在同一个微服务系统中 目的:保证安全问题 1.3.1 设计一套项目接口需要考虑的点 接口权限(开放接口|内部接口) 考虑幂等性 安全性(https)防止串改数据(验证签名) 使用网关拦截 接口实现黑名单和白名单、接口使用http协议 + json格式,符合restful风格,目的是为了跨平台。 考虑高并发对接口服务实现保护服务降级、熔断、隔离之类 最后使用统一的API管理平台 2 搭建一个Zuul网关系统 2.1 zuul网关搭建示意图 2.2 创建zuul网关项目,在parent中添加一下依赖 <!-- 导入springcloud整合zuul启动器 --> <dependency> <groupId>org.
  • SpringCloud整合Zookeeper注册中心

    前言 1 使用Zookeeper代替Eureka作为注册中心 1.1 Zookeeper简介 Zookeeper分布式协调工具,可以实现注册中心 Zookeeper节点类型:临时节点 1.3 Zookeeper安装与使用 1.3.1 windows下载Zookeeper 1. 下载与安装 博客详解(别人博客) 2. 修改zkServer.cmd配置文件 3. 下载Zookeeper的图形界面的管理工具ZooInspector工具,解压之后便可使用 4. 进入Zookeeper解压之后的目录,直到bin目录,在该目录输入cmd进入控制台 5. 在控制台运行zkServer.cmd便可开启Zookeeper服务 2 使用Zookeeper作为注册中心步骤 zookeeper作为注册中心与Eureka作为注册中心的区别在于Eureka需要编写一个服务的启动类,但Zookeeper不需要 Zookeeper只需要打开ZooInspector工具,连接服务即可(确保在cmd中运行zkServer.cmd) 2.1 创建会员服务 2.1.1 配置pom文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> </parent> <groupId>com.fyzn12</groupId> <artifactId>springcloud-zk-member</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-zk-member Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!