0%

springboot注解

springboot中取消了大部分的xml配置,以及进行了很多的默认配置,取而代之的就是注解,所以在一个springboot项目中需要大量的使用注解

@SpringBootApplication注解

这个注解如果没见过,那么可能是没用过springboot的朋友,这个注解是用来标注springboot项目的,是一个组合注解,由三个注解组成

1
2
3
@SpringBootConfiguration // 这个注解就是个套了层壳子的@Configuration
@EnableAutoConfiguration// 开启自动配置的注解,使用该注解之后,springboot就会根据当前类路径下的包或者类来配置springbean,扫描各个xxxAutoConfiguration类
@ComponentScan // 组件扫描,这个在spring中就已经有了
阅读全文 »

tomcat配置项目位置

tomcat映射配置任意目录的项目
在conf下新建catalina文件夹,新建localhost文件夹,
在其中新建一个xml文件,文件名是url根路径
path当前没用 docBase为项目路径(编译之后的项目)

1
<Context path="" docBase="" reloadable="true">

Mycat简介

Mycat是一款数据库中间件,一端连数据库,一端连java应用,用于解决以下问题

  • java与数据库紧耦合
  • 高访问量、高并发对数据库压力
  • 读写请求数据不一致

可以用来做 读写分离数据分片多数据源整合

Mycat拦截用户发送的SQL语句,对SQL语句做特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL语句发送到真实数据库,并将返回的结果做适当的处理,最终再返回给用户

阅读全文 »

spring配置双数据源

前段时间有个需求,需要将将数据存到两个数据库中,一个库中存放主信息,一个库中存放特殊信息,看来是要使用双数据源了,来搞起来吧

既然是双数据源,先不管怎么切换,配置得先搞起来

数据源配置

阅读全文 »

springCloudConfig获取远程配置

springCloudConfig核心其实在于实现了一个PropertySourceLocator接口来进行获取远程配置的

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
@Order(0)
public class ConfigServicePropertySourceLocator implements PropertySourceLocator {

@Override
@Retryable(interceptor = "configServerRetryInterceptor")
public org.springframework.core.env.PropertySource<?> locate(
org.springframework.core.env.Environment environment) {
ConfigClientProperties properties = this.defaultProperties.override(environment);
CompositePropertySource composite = new OriginTrackedCompositePropertySource(
"configService");
RestTemplate restTemplate = this.restTemplate == null
? getSecureRestTemplate(properties) : this.restTemplate;
Exception error = null;
String errorBody = null;
try {
String[] labels = new String[] { "" };
if (StringUtils.hasText(properties.getLabel())) {
labels = StringUtils
.commaDelimitedListToStringArray(properties.getLabel());
}
String state = ConfigClientStateHolder.getState();
// Try all the labels until one works
for (String label : labels) {
// 获取远程配置
Environment result = getRemoteEnvironment(restTemplate, properties,
label.trim(), state);
if (result != null) {
log(result);

// result.getPropertySources() can be null if using xml
if (result.getPropertySources() != null) {
for (PropertySource source : result.getPropertySources()) {
@SuppressWarnings("unchecked")
Map<String, Object> map = translateOrigins(source.getName(),
(Map<String, Object>) source.getSource());
composite.addPropertySource(
new OriginTrackedMapPropertySource(source.getName(),
map));
}
}

if (StringUtils.hasText(result.getState())
|| StringUtils.hasText(result.getVersion())) {
HashMap<String, Object> map = new HashMap<>();
putValue(map, "config.client.state", result.getState());
putValue(map, "config.client.version", result.getVersion());
composite.addFirstPropertySource(
new MapPropertySource("configClient", map));
}
return composite;
}
}
errorBody = String.format("None of labels %s found", Arrays.toString(labels));
}
catch (HttpServerErrorException e) {
error = e;
if (MediaType.APPLICATION_JSON
.includes(e.getResponseHeaders().getContentType())) {
errorBody = e.getResponseBodyAsString();
}
}
catch (Exception e) {
error = e;
}
if (properties.isFailFast()) {
throw new IllegalStateException(
"Could not locate PropertySource and the fail fast property is set, failing"
+ (errorBody == null ? "" : ": " + errorBody),
error);
}
logger.warn("Could not locate PropertySource: "
+ (error != null ? error.getMessage() : errorBody));
return null;

}

}

那么PropertySourceLocator接口是何时被调用的呢?

阅读全文 »

ShardingSphere-JDBC水平分库分表

ShardingSphere-JDBC水平分库分表非常简单,只需要添加ShardingSphere-JDBC依赖并进行配置即可

1
2
3
4
5
6
<!-- sharding-jdbc 分库分表 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
阅读全文 »

maven环境配置

在正常项目中一般都会有多个环境,而不同的环境一些配置和流程是不一样的,可以使用maven来进行环境的区分,来取不同的配置,不过spring也是支持环境区分的,我一般还是习惯于用spring boot的环境配置

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
30
31
32
33
34
35
36
37
38
39
40
<!--MAVEN打包选择运行环境-->
<!-- local(默认) 本地 dev:开发环境 test:测试环境 pro:生产环境-->
<profiles>
<profile>
<id>local</id>
<properties>
<profileActive>local</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>

mybatis构成

mybatis可以抽象为三层:基础支持层(框架支撑层)、数据处理层和接口层

  • 基础支持层包括:数据源、事务管理、日志、类型转换、缓存、Bind、解析器等
  • 核心处理层包括:配置解析、配置映射、SQL解析、SQL执行、结果集映射、插件等
  • 接口层主要提供JAVA API
mybatis架构

ShardingSphere简介

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景

连接增量可插拔是 Apache ShardingSphere 的核心概念。

  • 连接:通过对数据库协议、SQL 方言以及数据库存储的灵活适配,快速的连接应用与多模式的异构数据库
  • 增量:获取数据库的访问流量,并提供流量重定向(数据分片、读写分离、影子库)、流量变形(数据加密、数据脱敏)、流量鉴权(安全、审计、权限)、流量治理(熔断、限流)以及流量分析(服务质量分析、可观察性)等透明化增量功能
  • 可插拔:项目采用微内核 + 3 层可插拔模型,使内核、功能组件以及生态对接完全能够灵活的方式进行插拔式扩展,开发者能够像使用积木一样定制属于自己的独特系统
shardingSphere

分库分表

为了解决单库单表数据量太大,导致的数据库压力过大,所以需要进行分库分表

分库分表有两种方式,分为垂直拆分和水平拆分

垂直拆分

垂直分表和垂直分库

  • 垂直分表 把一张大表中的字段拆分为两张表
  • 垂直分库 由于垂直分表之后,两个表还是存储在同一个数据库中,而如果数据库中表过多,数据库的压力过大,所以按照业务来对数据库进行拆分
阅读全文 »