DanZ's Blog

a normal developer daily blog

0%

MySQL 主从复制

BasicIn: MySQL 8.0.15 看过 Redis 的主从复制,其实 MySQL 的原理也差不多。都是通过一个中间文件(记录操作)进行传播,达到数据相同的结果。 开启主从复制有以下几个好处:

  1. 提高吞吐量,启动 MySQL 主从复制以后,写操作一般将是发生在主数据库(当然要求实时性特别高的读操作也会发生在主数据库上),而读操作一般会发生在从数据库;
  2. 数据安全性,数据多了几个地方存储了,自然提高了数据丢失的安全性;
  3. 提升数据分析性能,数据分析一般都是占用较大的资源,我们可以把数据分析步骤放在其中一个或者多个从数据库上进行;
  4. 长距离的数据拷贝,无需与主数据库进行长连接的复制远程数据库的数据

    主从复制方式

MySQL 经历了这么多的版本迭代以来,已经支持多种方式进行主从数据复制了。 MySQL 支持以下方式进行:

  1. 同步复制:即主数据库数据发生变化的时候,需要所有的从数据库表示已经写入才返回,效率低
  2. 半同步复制:即主数据库数据发生变化的时候,至少一个从数据库表示已经写入才返回,效率较高,数据安全性也适中;
  3. 全异步复制:主库写入完成即返回,不关心从数据库是否成功。
    阅读全文 »

一.简述

项目开发完成,就需要上线部署了,不然开发了那么久的代码也没什么存在的意义。 说到上线部署,那么以往的部署方式都是使用 servlet 项目,整合一些中间件使用,配置好配置文件。当需要上线部署的时候,就打包成 war 格式的压缩包,放在一个 web 容器中,然后启动容器,让容器去启动我们的项目。 但是在现在的 springboot 时代,官方已经很贴心的给我们提供一个内置的 tomcat 容器了,当然如果我们需要更换成其他的内置容器也完全可行。这样子能够让部署显得更加简单便捷,也不需要像以前一样,当需要多个微服务项目的时候,我们又不想一个 tomcat 运行多个项目让他互相影响,然而开启了很多 tomcat 容器,造成了资源的浪费。springboot 内置的容器咧,也经过官方修改让他更加吻合我们的项目了,我们完全可以在项目的配置文件中配置允许 tomcat 使用的资源信息。

二.打包的两种方式

(一)直接打包成jar包进行运行

直接打包 jar 包的方式就很简单了,我们可以使用命令行或者 IDE 去到我们项目的 pom 所在的目录。 运行 mvn package。稍等片刻,如果没有遇到错误,那么 mvn 会帮助我们在 target 文件夹生成一个 .jar 结尾的压缩包,这个就是我们项目的所有信息了。 我们只需要通过 FTP 或者其他的方式将这个项目包放在一个地方,然后使用 java -jar xxx.jar 的形式进行运行就可以启动项目了。过程还是十分轻量级的。 当然以上那种方式,运行完成以后,如果退出了,那么项目也就退出了,这并不是我们想看到的。所以在 Linux 下,我们可以使用 nohup 命令进行启动,将启动打印出来的日志定位到一个文件里面去,例如 nohup java -jar xxx.jar >xxx.out 2>&1 & 这样子,项目运行过程中的情况,会跟我们使用 IDE 一样把日志写到指定的文件里面去,当然如果不想要这个文件毕竟自己一般都实现了日志了的。那么可以使用这个命令,将日志导入到一个黑洞里面去:nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 &

(二)打包成war包放入web容器运行

将项目打成 jar 包容易,毕竟是标配了,但是如果因为业务需要需要放进一个 tomcat 里面去运行的话,那么久需要反其道而行把一些配置给去掉。 pom.xml 需要加入一些配置:

阅读全文 »

一. 简述

针对基于 SpringBoot 构建的微服务项目(当然也可以是普通项目),我们可以通过 SpringBoot 官方提供的 spring-boot-starter-actuator 套件进行监控。但是这个套件有个问题,就是只有 HTTP 接口可以调用,如果我们需要可视化的监控界面,则需要配置 ELK 或者其他的后台管理系统调用这个接口获取系统的信息。 当然,还有一种解决方案就是使用 spring-boot-admin 这个项目来监控我们的微服务系统,这是一个开源的项目,用起来还是蛮舒服的,所以在这里推荐大家可以用一用。 spring-boot-admin 有两种方式可以集成到系统中,一种是使用 spring-cloud 的服务发现,另外一种是直接配置监控的服务地址,这样 admin 服务即可接收到我们配置的系统的一些信息和快照了。 由于这里还不涉及 spring-cloud 所以这里先使用我们自己的服务集成 admin-client 的方式来集成系统监控。

二. 开发

(一) spring-boot-admin 服务端的搭建

1.mvn依赖:

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<!-- 注意:admin-server的版本号要和spring-boot的版本号对应起来,不然会出现错误 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
阅读全文 »

一. 简述

测试用例,在日常开发来说,可能刚开始写代码的小厂不会在乎,不过也有很多公司根本就没有测试用例,开发的时候一直写下去。写完一部分,直接启动项目,调用接口进行 debug 调试,然后修改报错的地方。等到了所有功能都实现了以后,就可以合并分支并且发布给测试环境去测试了。 以前刚开始我也是没有写测试用例的习惯,慢慢的接触了 TDD 开发模式,简直被深深吸引住了。测试驱动开发的步骤简单的说就是先写出来你期待的功能,期待的返回值,然后开始启动项目进行运行,由程序自动识别返回的结果是否是错误的。小步开发,一直到功能完成为止。
乍一听好像没什么用处,但是好处还在后面,当部门经理提出来这个功能需要加入新的需求的时候,这时候测试用例就是开发人员的利器了。在开始加入新功能之前,保证测试用例正常通过,然后开始小步加入新的需求,修改新需求结果的用例,知道满足新的需求为止。这个过程开发体验是及其舒服的,测试用例可以保证程序的正常运行,及早发现漏洞和错误。暂时把新加入需求这一项放一边,在后面看到这段代码想要重构的时候,测试用例就是心中的奠基石,修改代码的结果,然后运行测试用例,顺利通过,心情愉悦的提交代码。 ok,说了这么多测试的好处,那就要看看怎么实施了,怎么结合 springboot 来编写运行我们的测试用例。web 的测试来说,应该是要复杂一点,应为涉及到容器的启动以及正确初始化,常规的整合 spring 框架那么自动化注入也是测试中的一部分,所以不妨每次测试用例开始的时候,运行 spring 让其正确的进行运行,再测试我们的业务代码,岂不美哉。 示例代码:spring-boot-test 项目地址:https://github.com/WeidanLi/spring-boot-tutorial/

阅读全文 »

一. 简述

Redis 是现在大部分项目中使用最多的 NOSQL 型数据库,其单线程的模型以及内存级别的读取可以给项目适当加加速。Redis 不仅会被当成缓存数据库使用,还会被作为分布式锁(因为是单线程模型)的工具来使用。 Spring-Boot 项目有两种方式使用 Redis ,接下来就是两种方式的使用方式了。
项目:spring-boot-data-redis 地址:https://github.com/WeidanLi/spring-boot-tutorial

二. 开发

(一)连接 redis 数据库

1. 环境准备

使用 Docker 启动 redis 内存数据库:

1
docker run --restart=always -d -p 6379:6379 --name imopei-redis redis redis-server

2. mvn 依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

</dependencies>
阅读全文 »

一. 简述

MongoDB 是一款新兴的 NO-SQL 数据库,使用的是类 JSON 的数据格式 BSON 进行数据存储。MongoDB 将索引放在内存中,因此查询的时候会大幅度提高速度。在数据库领域中,MongoDB 适合单表的或者说 Column 不需要高度统一的业务处理中,比如:用户娱乐信息表(在商城的用户信息中存储的用户兴趣、用户QQ等等)。MongoDB 对事务支持度不算太高,日常需求需要连表操作的就不要放在 MongoDB 了。 SpringBootMongoDB 提供了 starterJavaer 能够更加简单的操作 MongoDB 数据库的信息。 项目地址:https://github.com/WeidanLi/spring-boot-tutorial 项目演示:spring-boot-data-mongo

二. 开发

(一)MongoDB 环境的准备

1. 使用 Docker 启动 MongoDB 环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.1'

services:
# 启动MongoDB
mongo:
image: mongo
restart: always
ports:
- 27017:27017
# 启动MongoDB管理后台
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
阅读全文 »

一. 简述

MyBatis 是一个简单粗暴的 orm 框架,与 hibernate 相比起来,速度要快一点,封装也要少一点。如果要说封装程度的话,那就是对查询、返回结果的过程进行封装。 SpringBoot 只要简单的使用 MyBatis 官方提供的 starter ,稍微配置下就可以使用了。

二. 开发

(一) 集成 MyBatis

1. mvn依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>

<build>
<resources>
<resource>
<!-- 让 maven 把 mybatis 的 xml 拷贝到 classes -->
<directory>src/main/resources</directory>
<includes>
<include>**.*</include>
<include>**/**.*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
阅读全文 »

SpringBootJpa 与 DDD 开发

一. 简述

DDD 开发,相信开发几年的工程师一般都会知道这个名词了。还原面向对象的本质,用代码诠释业务。由 Eric Evans 提出但是响应起来并不是很简单。 知道 DDD 的都知道,使用集合型 orm 框架来开发会更加觉得顺手,mybatis 就不大合适了。所以 Spring 公司对 jpa 加入了一些支持。 DDD 几句话并不能讲清楚,这里就只是提供简单 Demo 和思路。
GitHub地址:https://github.com/WeidanLi/spring-boot-tutorial 示例代码:spring-boot-data-jpa-with-ddd

二. 开发

1. 设定情景

首先假定一个订单只能下单一个产品。(如果需要多产品的,需要设计订单主体信息和订单详情信息) 首先设定要开发一个下单的接口,我们下单的时候,订单都会存储一些产品的基本信息。 那么这时候一个订单就是一个实体 Entity (与 jpa 的注解不谋而合),产品信息就是一个 ValueObjectValueObject 一般没有无参构造器,也没有 setter,修改信息都需要进行整体替换) ,订单一旦生成就不能修改产品的基本信息,所以订单实体不能有产品信息的 setter。 OK,业务需求出来了,那么设计订单的时候一般在数据库的表现是订单和产品信息放在一起。

阅读全文 »

SpringBoot 与 jpa 的简单使用

一. 简述

jpa 全称 javax.persistence.annotation ,刚开始是由 hibernate 作者开发,后面被 java 公司收入到规范之中。spring-boot-data-jpa 就是在这套规范上面建立起来的。所以开发的时候默认的 orm 框架就是 hibernate 。 在刚开始接触编程的时候,万事以快为主,但其实现在我感觉开发体验更加重要。mybatis 是个封装比较少的框架,速度会略胜一筹,但 hibernate 开发数据库的时候会显得更加面向对象。当然两者都可以在不同的业务需求中体现其重要性。 简单的开发区别就是,把 hibernate 框架的 repository 当成一个集合来使用,使用起来就更加的得心应手。mybatis 则更加的面向过程,自主控制 SQL 的运行。
GitHub地址:https://github.com/WeidanLi/spring-boot-tutorial 演示项目:spring-boot-data-jpa

二. 开发

我们就通过一个简单用户系统来开发

阅读全文 »

spring-boot 使用 aop

一. 简述

AOP 是一种热门的编程模式,用途十分广泛,可以作为日志的记录、事件订阅。 主要的方式是通过 Aspect 框架,将与项目无太大关联的但是每个方法又都需要做的事情给抽取到一个类里面。然后使用 IOC 容器调用方法之前之后或者抛异常以后,跳入指定的方法执行 Aspect 框架定义了很多种切入模式,基本涵盖编程需求,有跳入方法之前之后执行的,环绕方法执行的,抛异常执行的等。
GitHub地址:https://github.com/WeidanLi/spring-boot-tutorial 项目示例:spring-boot-aop

二. 开发

1. 引入 aop 依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

阅读全文 »