结合场景谈服务发现和配置中我们讲述了 Nacos 配置中心的三个典型的应用场景,包括如何在 Spring Boot 中使用 Nacos 配置中心将数据库连接信息管控起来,而在“原生”的 Spring 中可以怎么使用 Nacos 配置中心呢?很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid 是一个黄金组合,在此基础上融入 Nacos 配置中心,将会发生什么特别的变化呢?

本文将通过一个用户信息查询示例,演示在 Spring Web 项目中如何将数据库连接池的配置存放到 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 项目,项目结构如下:

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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://nacos.io/schema/nacos
http://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.xsd
http://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 插上“飞翔”的翅膀。

作为 Nacos 配置中心的阿里云免费产品 ACM:https://www.aliyun.com/product/acm,已经提供了上面所有的功能,如果您不想自己部署运维 Nacos Server 或者想使用“推送轨迹”、“细粒度权限控制”、“ECS 实例 RAM 角色”等高级特性,不妨尝试下免费的 ACM。

完整示例代码:

微服务配置中心实战:Spring + MyBatis + Druid + Nacos的更多相关文章

  1. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  2. 微服务配置中心 Apollo 源码解析——Admin 发送发布消息

    内容参考:https://www.toutiao.com/a6643383570985386509/ 摘要: 原创出处http://www.iocoder.cn/Apollo/admin-server ...

  3. 9.Spring Cloud Config统一管理微服务配置

    Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...

  4. 微服务配置内容《网上copy》=========》如何创建一个高可用的服务注册中心

    前言:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心, ...

  5. 如何优化Spring Cloud微服务注册中心架构?

    作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...

  6. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  7. 【SpringCloud构建微服务系列】使用Spring Cloud Config统一管理服务配置

    一.为什么要统一管理微服务配置 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护 ...

  8. 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)

    目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...

  9. 分布式配置中心介绍--Spring Cloud学习第六天(非原创)

    文章大纲 一.分布式配置中心是什么二.配置基本实现三.Spring Cloud Config服务端配置细节(一)四.Spring Cloud Config服务端配置细节(二)五.Spring Clou ...

随机推荐

  1. chrome无法拖拽离线安装CRX格式插件解决方法

    原文:http://chromecj.com/utilities/2018-09/1525.html 摘要 : chrome 67版本后无法拖拽离线安装CRX格式插件的解决方法   有一部分网友反映子 ...

  2. vue App项目 首页

    1. 下载 npm i mint-ui -S 2. 引入 import MintUI from 'mint-ui' import 'mint-ui/lib/style.css' Vue.use(Min ...

  3. 使用Process子类创建进程

    #_author:来童星#date:2019/12/17# 使用Process子类创建进程from multiprocessing import Processimport timeimport os ...

  4. 揭秘!2周实现上云上市,阿里云SaaS上云工具包如何打造新云梯?

    提到“上云”,很多人会理解成上IaaS,比如买一些计算.存储和网络云产品,把自己的应用系统部署上去.这的确是通常意义的上云.但对SaaS而言,需要从产品.商业.服务,三个维度考虑SaaS伙伴和客户的痛 ...

  5. 17 win7 sp1 x64/VS2015下配置creo4.0二次开发环境——调用了众多开源库(ceres-solver,PCL1.8.0,office 2016COM接口,MySql数据库等)

    0 引言 本次开发环境的配置是在综合考虑了开源库的版本.VS版本以及CREO4.0的版本,同时针对甲方需求选择了win7 sp1 x64系统. 配置的过程中遇到了形形色色的问题,但是一一解决了.通过这 ...

  6. Delphi里面弹出对话框的方法

    1.procedure   ShowMessage(const   Msg:   string); 单元:Dialogsor   QDialogs 例子:showmessage( 'hello '); ...

  7. NX二次开发-UFUN获取显示在NX交互界面的对象UF_OBJ_is_displayable

    NX9+VS2012 #include <uf.h> #include <uf_disp.h> #include <uf_obj.h> #include <u ...

  8. NX二次开发-UFUN获取当前导出CGM选项设置UF_CGM_ask_session_export_options

    文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...

  9. 让nginx支持patchinfo,(支持codeigniter,thinkphp,ZF等框架)

    nginx 的config配置: server { listen ; server_name xxx; ....if (!-e $request_filename) { rewrite ^/(.*)$ ...

  10. Java io简单总结

    IO 字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的 字符流在操作时使用了缓冲区,通过缓冲区再操作文件 缓冲:一段特殊的内存.如果一个程序频繁地操作一个资源(如文件或数据库),则性能会 ...