微服务~原始真解Spring Cloud —— 访问数据库整合Druid数据源
Posted 桃花键神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务~原始真解Spring Cloud —— 访问数据库整合Druid数据源相关的知识,希望对你有一定的参考价值。
🔎这里是【秒懂·云原生】,关注我学习云原生不迷路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️
👀专栏介绍
【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。
👀本期介绍
主要介绍Spring Cloud —— 访问数据库整合Druid数据源
文章目录
Spring Boot JDBC访问数据库
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 都默认采用整合 Spring Data 的方式进行统一处理,通过大量自动配置,来简化我们对数据访问层的操作,我们只需要进行简单的设置即可实现对书层的访问。
引入JDBC启动器
<!--导入JDBC的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
配置数据源
这里填自己数据库的信息
#数据源连接信息
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/db
driver-class-name: com.mysql.cj.jdbc.Driver
测试
Spring Boot 提供了一个名为 JdbcTemplate 的轻量级数据访问工具,它是对 JDBC 的封装。Spring Boot 对 JdbcTemplate 提供了默认自动配置,我们可以直接使用 @Autowired 或构造函数将它注入到 bean 中使用。
Spring Boot整合Druid数据源
Druid 是阿里巴巴推出的一款开源的高性能数据源产品,Druid 支持所有JDBC 兼容的数据库,包括 Oracle、MySQL、SQL Server 和 H2 等等。Druid 不仅结合了 C3P0、DBCP 和 PROXOOL 等数据源产品的优点,同时还加入了强大的监控功能。通过 Druid 的监控功能,可以实时观察数据库连接池和 SQL 的运行情况,帮助用户及时排查出系统中存在的问题。使用 Druid Spring Boot Starter 将 Druid 与 Spring Boot 整合
引入 Druid Spring Boot Starter 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.9</version>
</dependency>
配置属性
#数据库连接信息配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/db
pools:
initial-size: 10 # 初始化时建立物理连接的个数。初始化发生 在显示调用init方法,或者第一次getConnection时
min-idle: 10 # 最小连接池数量 最小空闲数量
maxActive: 200 # 最大连接池数量 最大活跃连接数
maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了 maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置
timeBetweenEvictionRunsMillis: 60000 # 检查空闲连接的 频率.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis则关闭物理连接。
minEvictableIdleTimeMillis: 300000 # 连接的最小生存时 间.连接保持空闲而不被驱逐的最小时间
validationQuery: SELECT 1 # 验证数据库服务可用性的 sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写 成 SELECT 1 FROM DUAL
testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时 间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请 连接的时候检测,如果空闲时间大于timeBetweenEvictionRun
testOnBorrow: false # 申请连接时直接检测连接是否有效.申 请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性 能。testOnReturn: false # 归还连接时检测连接是否有效.归还连 接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
poolPreparedStatements: true # 开启PSCache
maxPoolPreparedStatementPerConnectionSize: 20 #设置 PSCache值
connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接 三次
breakAfterAcquireFailure: true # 数据库服务宕机自动重 连机制
timeBetweenConnectErrorMillis: 300000 # 连接出错后重 试时间间隔asyncInit: true # 异步初始化策略
remove-abandoned: true # 是否自动回收超时连接
remove-abandoned-timeout: 1800 # 超时时间(以秒数为单 位) 超过此值后,druid将强制回收该连接
transaction-query-timeout: 6000 # 事务超时时间
filters: stat,wall,log4j2
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
stat-view-servlet:
enabled: true #是否开启内置监控页面,默认值 为 false
url-pattern: "/druid/*" #StatViewServlet 的映射 路径,即内置监控页面的访问地址
allow: 127.0.0.1 #白名单
deny: #黑名单
reset-enable: false #是否启用重置按钮
login-username: admin #内置监控页面的登录页用户名 username
login-password: admin #内置监控页面的登录页密码 password
web-stat-filter: enabled: true #是否开启内置监控中的 Web- jdbc 关联监控的数据
url-pattern: "/*" #匹配路径
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*" #排除 路径
session-stat-enable: true #是否监控session
配置类
DruidDataSourceConfig.java
package com.example.demo;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* @author yeqv
* @program demo
* @Classname DruidDataConfig
* @Date 2022/4/29 16:35
* @Email w16638771062@163.com
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
@Data
public class DruidDataSourceConfig
@Autowired
DruidStatProperties druidStatProperties;
@Autowired
StatFilter statFilter;
private String url;
private String username;
private String password;
private String driverClasName;
@Bean
public DataSource dataSource(DruidPools druidPools) throws SQLException
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(getUrl());
dataSource.setUsername(getUsername());
dataSource.setPassword(getPassword());
dataSource.setDriverClassName(getDriverClasName());
dataSource.setInitialSize(druidPools.getInitialSize());
dataSource.setMinIdle(druidPools.getMinIdle());
dataSource.setMaxActive(druidPools.getMaxActive());
dataSource.setMaxWait(druidPools.getMaxWait());
dataSource.setTimeBetweenEvictionRunsMillis(druidPools.getTimeBetweenEvictionRunsMillis());
dataSource.setMinEvictableIdleTimeMillis(druidPools.getMinEvictableIdleTimeMillis());
dataSource.setValidationQuery(druidPools.getValidationQuery());
dataSource.setTestWhileIdle(druidPools.testWhileIdle);
dataSource.setTestOnBorrow(druidPools.testOnBorrow);
dataSource.setTestOnReturn(druidPools.testOnReturn);
dataSource.setPoolPreparedStatements(druidPools.poolPreparedStatements);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(druidPools.maxPoolPreparedStatementPerConnectionSize);
dataSource.setConnectionErrorRetryAttempts(druidPools.connectionErrorRetryAttempts);
dataSource.setBreakAfterAcquireFailure(druidPools.breakAfterAcquireFailure);
dataSource.setTimeBetweenConnectErrorMillis(druidPools.timeBetweenConnectErrorMillis);
dataSource.setAsyncInit(druidPools.asyncInit);
dataSource.setRemoveAbandoned(druidPools.removeAbandoned);
dataSource.setRemoveAbandoned(druidPools.removeAbandoned);
dataSource.setTransactionQueryTimeout(druidPools.transactionQueryTimeout);
dataSource.setFilters(druidPools.filters);
dataSource.setConnectProperties(druidPools.connectionProperties);
return dataSource;
@Bean
public ServletRegistrationBean druidServlet(StatConfig statConfig)
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); // 现在要进行druid监控的配置处理操作
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings(druidStatProperties.getStatViewServlet().getUrlPattern());
servletRegistrationBean.addInitParameter("allow", statConfig.getAllow()); // 白名单
servletRegistrationBean.addInitParameter("deny", statConfig.getDeny()); // 黑名单
servletRegistrationBean.addInitParameter("loginUsername", statConfig.getLoginUsername()); // 用户名
servletRegistrationBean.addInitParameter("loginPassword", statConfig.getLoginPassword()); // 密码
servletRegistrationBean.addInitParameter("resetEnable", statConfig.getResetEnable()); // 是否可以重置数据源
return servletRegistrationBean;
@Bean
public FilterRegistrationBean filterRegistrationBean(StatFilter statFilter)
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns(statFilter.urlPattern); // 所有请求进行监控处理
filterRegistrationBean.addInitParameter("exclusions", statFilter.exclusions);
filterRegistrationBean.setEnabled(statFilter.enabled);
return filterRegistrationBean;
StatFilter.java
package com.example.demo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author yeqv
* @program demo
* @Classname StatFilter
* @Date 2022/4/29 16:51
* @Email w16638771062@163.com
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.web-stat-filter")
@Data
public class StatFilter
boolean enabled;
String urlPattern;
String exclusions;
StatConfig.java
package com.example.demo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author yeqv
* @program demo
* @Classname StatConfig
* @Date 2022/4/29 16:48
* @Email w16638771062@163.com
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.stat-view-servlet")
@Data
public class StatConfig
String urlPattern;
String allow;
String deny;
String resetEnable;
String loginUsername;
String loginPassword;
DruidPools.java
package com.example.demo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
/**
* @author yeqv
* @program demo
* @Classname DruidPools
* @Date 2022/4/29 16:45
* @Email w16638771062@163.com
*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.pools")
@Data
public class DruidPools
int initialSize;
int minIdle;
int maxActive;
int maxWait;
long timeBetweenEvictionRunsMillis;
long minEvictableIdleTimeMillis;
String validationQuery;
boolean testWhileIdle;
boolean testOnBorrow;
boolean testOnReturn;
boolean poolPreparedStatements;
int maxPoolPreparedStatementPerConnectionSize;
int connectionErrorRetryAttempts;
boolean breakAfterAcquireFailure;
long timeBetweenConnectErrorMillis;
boolean asyncInit;
boolean removeAbandoned;
long removeAbandonedTimeout;
int transactionQueryTimeout;
String filters;
Properties connectionProperties;
结束语🏆🏆🏆
🔥推荐一款模拟面试、刷题神器网站
点击注册即可
牛客刷题网
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
3、大厂笔试真题:字节跳动、美团、百度、腾讯…
Spring Cloud:构建微服务 - Spring Boot
微服务的特点及构建遵循的原则
约束:微服务遵循UNIX理念,即应用程序是服务的集合,每个服务只做一件事,并做好一件事。
松耦合:基于微服务的应用程序是小型服务的集合,服务之间使用HTTP和REST通过非特定实现的接口彼此交互。只要服务接口未改变,微服务内部可以更加自由地被修改。
抽象:微服务完全拥有自己的数据结构和数据源,微服务所拥有的数据只能由该服务修改。
独立:每个微服务可以独立地编译和部署。
服务粒度
开始的时候可以让微服务涉及的范围更广一些,然后将其重构到更小的服务。
重点关注服务如何相互交互。
随着对问题域的理解不断增长,服务的职责将随着时间的推移而改变。
服务粒度过粗, 则会表现为:服务承担了过多的职责, 会餐跨大量表来管理数据, 测试用例将变得过多。
服务粒度过细, 则会表现为:微服务像兔子一样繁殖, 服务彼此严重依赖, 成为简单CRUD服务的集合。
微服务构建的最佳实践
代码库:每个微服务及服务器信息都应该处于版本控制中, 并且有自己独立的代码存储库。
依赖:通过构建工具(e.g. Maven)明确声明依赖项。
配置:将应用程序配置(特别是特定于环境的配置)与代码分开存储。
后端服务:通过网络与数据库或消息系统进行通信。
构建,发布和运行:保持应用程序构建,发布和运行完全分开,已构建的服务是不可改变的。
进程:微服务应该始终是无状态的,它们可以在任何超时时被杀死和替换,而不用担心一个服务实例的丢失而导致数据丢失。
端口绑定:可运行的微服务要包含一个运行时引擎(不需要单独的web服务器),服务应该在命令行上自行启动,并通过公开的HTTP端口立即访问。
并发:在需求量增大时,要启动更多的微服务实例水平伸缩。
可任意处置:可以根据需要任意启动和停止。
开发环境与生产环境等同:最小化服务运行的所有环境之间的差距。
日志:使用工具记录日志,直观查看日志。
管理进程:使用通用脚本对服务执行管理任务。
构建一个Hello World微服务
本例使用Spring-Boot-Web构建,并使用Maven Docker插件,更方便的创建镜像。
https://github.com/lyz170/spring-cloud-demo/tree/master/spring-cloud-service-helloworld
以上是关于微服务~原始真解Spring Cloud —— 访问数据库整合Druid数据源的主要内容,如果未能解决你的问题,请参考以下文章
微服务~原始真解Spring Cloud —— 访问数据库整合Druid数据源
[转帖]微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务
基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka