微服务配置中心实战:Spring + MyBatis + Druid + Nacos

转载自  微服务配置中心实战:Spring + MyBatis + Druid + Nacos

很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid 是一个黄金组合,在此基础上如果融入一个配置中心,会发生什么特别的变化呢?

本文将通过一个用户信息查询示例,演示在 Spring Web 项目中如何将数据库连接池的配置存放到 Nacos 中,进行统一运维管控,达到配置治理与降低数据泄露风险的目的。

Nacos是今年开源的一款帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS服务三大功能。项目地址:https://github.com/alibaba/nacos

数据表

在测试数据库中新建 user 表,其中包含用户名称等字段,与接下来的 User model 类相对应。

CREATE TABLE `user` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL DEFAULT '' COMMENT '名字',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

添加一行测试数据:

INSERT INTO `user` (`name`, `create_time`, `update_time`) VALUES ('Nacos', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

Spring

该示例是 Spring 常规的 Web 项目,项目结构如下:

 

image.png | left | 301x454

pom.xml

引入 Nacos Spring 的依赖包 nacos-spring-context

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>${latest.version}</version>
</dependency>

笔者在撰写本文时,nacos-spring-context 的最新版本为:0.2.2-RC1

dispatcher-servlet.xml

dispatcher-servlet.xml 为示例中 Spring MVC 的入口配置,在其中通过 import引入了 Nacos、Druid、MyBatis 的配置,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><mvc:annotation-driven/><context:annotation-config/><context:component-scan base-package="com.alibaba.nacos.example.spring"/><import resource="nacos.xml"/><import resource="datasource.xml"/><import resource="spring-config-mybatis.xml"/>
</beans>

nacos.xml

关键看 nacos.xml ,nacos-spring-context 的扩展了 Spring 的 XML Schema 机制,自定义了 <nacos:property-source/> 等元素,详细配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xmlns:nacos="http://nacos.io/schema/nacos"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://nacos.io/schema/nacoshttp://nacos.io/schema/nacos.xsd"><nacos:global-properties server-addr="127.0.0.1:8848" /><nacos:property-source data-id="datasource.properties"/>
</beans>

其中通过 <nacos:global-properties /> 设置 Nacos Server 的连接地址,通过 <nacos:property-source /> 从 Nacos 配置中心加载了 dataId 为 datasource.properties 的配置,nacos-spring-context 会解析获取到的配置内容并添加到 Spring Environment 的 PropertySources 中,使得后续初始化 Druid 连接池的时候能获取到数据库连接地址、账号密码、初始连接池大小等信息。这就是 Nacos 配置中心与 Spring 结合的关键点。

datasource.xml

这是数据库连接池的配置,初始化了 DruidDataSource 的 Spring Bean,并将其通过 DataSourceTransactionManager 设置为 Spring 的数据库连接池。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="url" value="${datasource.url}"/><property name="username" value="${datasource.username}"/><property name="password" value="${datasource.password}"/><property name="initialSize" value="${datasource.initial-size}"/><property name="maxActive" value="${datasource.max-active}"/></bean><bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="txManager"/>
</beans>

从上面的配置内容看一看到,数据库连接池不需要因为引入 Nacos 配置中做任何特殊的改变。

其他

User 的 Model、Service 等也跟不使用 Nacos 配置中心时完全一致,这里就不一一贴出,完整示例代码可以在 nacos-examples 获取:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-config-datasource-example

Nacos

参照 Nacos 官网的快速开始:https://nacos.io/zh-cn/docs/quick-start.html

从 Nacos 的 github 上下载最新稳定版本的 nacos-server:https://github.com/alibaba/nacos/releases

解压后到 Nacos 的 bin 目录下,执行 startup 启动脚本以单机模式启动 Nacos Server, Windows 请使用 cmd startup.cmd ,Linux/Unix/Mac 环境请使用 sh startup.sh -m standalone 。

启动后,浏览器访问:http://localhost:8848/nacos/index.html 就可以来到 Nacos 的控制台,新增 dataId 为 datasource.properties 的配置,对应上面 Spring 的 nacos.xml 中的 dataId。

配置内容则与 Spring 的 datasource.xml 中的连接池属性一一对应,示例如下:

datasource.url=jdbc:mysql://localhost:3306/test
datasource.username=root
datasource.password=root
datasource.initial-size=1
datasource.max-active=20

 

运行

示例中是 UserController#get() 通过 UserServce 调用 Mybatis 的 Mapper 类(UserMapper)从数据库中查询指定 ID 的用户信息,假设该示例是运行在端口为 8080 的 Tomcat 上,访问:http://localhost:8080/users?id=1 地址将返回:

{"id": 1,"name": "Nacos"
}

总结

本文通过一个示例演示在“原生” Spring 中如何使用 Nacos 配置中心,从示例可以看出,对原有的 Spring 项目基本没有任何侵入,只需在 pom.xml 中添加 nacos-spring-context 的依赖,然后再定义并引入 nacos.xml 配置,就可以将数据库连接池信息管控起来,做到统一运维,并降低数据泄露的风险。

试想,如果你有多个项目连接同一个数据库或一个项目部署很多实例,当数据库密码修改时,你不需要去修改每个项目的 datasource.properties 文件,再走一次应用的部署发布流程,而是到 Nacos 的控制台上修改一个配置项,再去重启应用实例即可。当然,如果你是自己管理数据库连接池,则可以做到连“重启应用实例”都不需要了,只需在监听到 Nacos 配置变化时重新初始化数据库连接池即可。

将 Spring 配置放置到 Nacos 配置中,还能用上“动态推送”、“版本管理”、“快速回滚”、“监听查询”,以及后续的 “灰度发布”、“配置加密”、“权限管控”等功能,为 Spring + MyBatis + Druid 插上“飞翔”的翅膀。

完整示例代码:

https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-config-datasource-example

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭晓新版《Windows Sysinternals实战指南》读书积赞活动

参与新版《Windows Sysinternals实战指南》&#xff0c;读书积赞活动的一下三位同学&#xff08;想法构成&#xff0c;我zzz&#xff0c;kergee&#xff09;&#xff0c;请加我微信geffzhang&#xff0c;把姓名&#xff0c;地址和手机号发给我&#xff0c;后续给你们寄书。.NET…

Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

转载自 Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件&#xff1a;Spring Cloud Gateway &#xff0c;相比之前我们使用的 Zuul&#xff08;1.x&#xff09; 它有哪些优势呢&#xff1f;Zuul&#xff08;1.x&…

ASP.NET Core中如何调整HTTP请求大小的几种方式

一、前言 一般的情况下&#xff0c;我们都无需调用HTTP请求的大小&#xff0c;只有在上传一些大文件&#xff0c;或者使用HTTP协议写入较大的值时&#xff08;如调用WebService&#xff09;才可能会调用HTTP最大请求值。 在ASP.NET Core 2.0中&#xff0c;它的两个宿主服务器Ke…

csdn颜色字体的改变

一直想改变一下csdn界面字体的颜色&#xff0c;奈何csdn上没有像Word那样直接改变字体颜色的版面&#xff0c;找半天没找到&#xff0c;后来才知道必须输入代码才能改变字体颜色&#xff0c;这个就很高级了啊 <font face"微软雅黑" color#FF8C00 size2> **一…

ASP.NET Core 2.0 使用支付宝PC网站支付

前言 最近在使用ASP.NET Core来进行开发&#xff0c;刚好有个接入支付宝支付的需求&#xff0c;百度了一下没找到相关的资料&#xff0c;看了官方的SDK以及Demo都还是.NET Framework的&#xff0c;所以就先根据官方SDK的源码&#xff0c;用.NET Standard 2.0 实现了支付宝服务端…

mysql实现查询分组查询最后一次的记录

大家好&#xff0c;我是雄雄。 前言 又好久没有写博客了&#xff0c;为什么呢&#xff1f;因为最近没怎么写代码…说起来也惭愧。 今天在项目上遇到了个需求&#xff0c;是这样的&#xff1a;我们数据库中有一表检测记录表&#xff0c;该表中存储的是所有居民每次的检测记录&…

常用公有云接入——华为

一、介绍 1、什么是弹性云服务器? 弹性云服务器是由CPU、内存、镜像、云硬盘组成的一种可随时获取、弹性可扩展的计算服务器&#xff0c;同时它结合虚拟私有云、虚拟防火墙、数据多副本保存等能力&#xff0c;为您打造一个高效、可靠、安全的计算环境&#xff0c;确保您的服…

jenkins~集群分发功能和职责处理

jenkins的多节点集群 在进行自动化部署时&#xff0c;你可以按着它们的项目类型去进行分别部署&#xff0c;这样即可以达到负载均衡&#xff0c;又可以达到一种职责的明确&#xff0c;比如像java的项目你可以使用linux服务来进行部署&#xff08;拉代码&#xff0c;还原&#x…

nginx中配置https的步骤

大家好&#xff0c;我是雄雄。 想必大家都有过配置https的需求吧&#xff0c;今天我就来整理一下&#xff0c;如何在nginx里面配置https 这里先忽略https申请&#xff0c;一般在你申请域名的那里直接弄就行&#xff0c;下面是nginx中的配置代码&#xff1a; server {listen …

爬取网页图片

前言 这几天又看了下python的视频&#xff0c;突然又对python感兴趣起来。以前只是学了下python的基础&#xff0c;感觉和其他语言没什么大的区别&#xff0c;再加上编程游戏的插件pygame一直没装上&#xff0c;遂放弃了。 最近心血来潮突然又想用python来搞游戏开发&#xff…

sql中索引不会被用到的几种情况

转载自 sql中索引不会被用到的几种情况 1、查询谓词没有使用索引的主要边界,换句话说就是select *&#xff0c;可能会导致不走索引。 比如&#xff0c;你查询的是SELECT * FROM T WHERE YXXX;假如你的T表上有一个包含Y值的组合索引&#xff0c;但是优化器会认为需要一行行的…

asp.net core合并压缩资源文件引发的学习之旅

0. 在asp.net core中使用BuildBundlerMinifier合并压缩资源文件 在asp.net mvc中可以使用Bundle来压缩合并css,js 不知道的见&#xff1a;http://www.cnblogs.com/morang/p/7207176.html 在asp.net core中则可以使用BuildBundlerMinifier来进行css&#xff0c;js的压缩合并 新建…

新服务器中如何安装jdk(一行命令)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天我们看看如何在服务器中安装jdk&#xff0c;这里指的服务器是linux。 服务器版本&#xff1a;centos 7.8 jdk版本&#xff1a;jdk1.8 下面我们来介绍下命令是什么&#xff1a; yum -…

关于腾讯云域名解析

前言 在浏览qq空间的时候看到了腾讯云的广告&#xff0c;只要一块钱即可注册一个.club域名。想起前段时间看的博客&#xff0c;自己早晚要入手网站搭方面的内容&#xff0c;按捺不住心悸&#xff0c;遂买了个域名&#xff0c;起了个叫woyidiankuan的域名&#xff0c;本来想写k…

linux服务器中如何安装mysql数据库(一次性完成,包含远程连接)

大家好。我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天给大家介绍一下&#xff0c;如何在新服务器中安装mysql数据库&#xff0c;总是捣鼓服务器&#xff0c;每次都去网上查&#xff0c;次次都不一样&#xff0c;浪费好多时间&#xff0c;这次自己记录…

Postman高级应用——流程控制、调试、公共函数、外部数据文件

postman客户端下载地址&#xff1a;https://www.getpostman.com/apps 流程控制 流程控制简言之就是设置接口的执行顺序&#xff0c;流程控制只有在collection runner或Newman里才生效 如果需要实现多个接口的一次循环&#xff0c;只需在每个接口的Tests中编写脚本 postman.setN…

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O)

今天早上起来原想着学习python的&#xff0c;想看看mysql&#xff0c;于是陷进去了。 明明没碰啊&#xff0c;怎么突然就启动不了了呢 输入mysql net start mysql 一直显示正在启动&#xff0c;最后蹦出个服务无法启动 网上查了下输入 mysqld --initialize 早上的时候输入的…

如何将base64图像数据以图片的形式上传到云存储obs中

大家好&#xff0c;我是雄雄。欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天分享个方法&#xff0c;如标题所示&#xff1a; 在日常开发中&#xff0c;我们经常会有这样的需求&#xff0c;将前台拿到的base64图像格式的数据&#xff0c;上传到云存储服务器上&#xff0c…

linux上还原自主nuget包需要注意的问题

问题的产生的背景 由于我们使用了jenkins进行部署&#xff08;jenkins~集群分发功能和职责处理&#xff09;&#xff0c;而对于.net core项目来说又是跨平台的&#xff0c;所以对它的项目拉取&#xff0c;包的还原&#xff0c;项目的编译和项目的发布都是在一台linux的jenkins节…

python爬虫进阶(初始)

该内容主要是爬虫爬取图片以及html&#xff0c;属于库的基本内容&#xff0c;以后再在此基础上进阶更智能更全面的python代码 整体框架大致 目标&#xff1a; 下载图片 创建文件夹并在文件夹里加入东西 批量下载图片到文件夹里 筛选数据 批量筛选指定数据到文件夹里 将数据导入…