随着我国加快推进信息网络等新型基础设施建设、网络主权概念的逐步明确,信息技术应用创新产业已经成为当前信息化部署的关键词。我国正在大力推动政府、国防、金融、交通等关键领域的信息化产品尽快实现国产化替代,并发布了多个重要政策来保障国产化的实施,加速实现信息核心技术的自主可控。
在适配了一批国产化操作系统、Web服务器、应用服务器和数据库后,在此分享适配的一些经验。
操作系统适配
我的系统架构采用前后端分离模式开发,前端是Vue2+Html,后端是Java,因此只要Web容器和应用服务器能在该操作系统中运行,理论上任意操作系统都能适配。
Web容器适配
前端工程打包后,需在Web容器中运行,默认是采用Nginx部署此程序。在国产化环境中,厂家也有提供类似Nginx的Web容器,使用方式也与Ngnix并无区别。
应用服务器适配
后端采用微服务的方式构建,应用在打成jar包后,需在应用服务器中运行,默认采用开源tomcat embed方式。在国产化环境中,厂家提供类似微服务版(有些厂家称呼敏捷版),因此采用国产化环境运行服务,首先需要把厂家提供的sdk包在编译时一起打包到jar包中。
考虑到不同的要求下打包的sdk不一样,采用了maven的profile特性提供国产化sdk的打包。以下以东方通的适配做具体举例:
1、去掉tomcat依赖,增加tongweb依赖
<profile>
<id>tongweb</id>
<dependencyManagement>
<dependencies>
<!-- 东方通 starter -->
<dependency>
<groupId>com.tongweb</groupId>
<artifactId>tongweb-embed-dependencies</artifactId>
<version>${tongweb-embed-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.tongweb.springboot</groupId>
<artifactId>tongweb-spring-boot-starter-2.x</artifactId>
</dependency>
<dependency>
<groupId>com.tongweb.springboot</groupId>
<artifactId>tongweb-spring-boot-websocket-2.x</artifactId>
</dependency>
</dependencies>
</profile>
2、将东方通的sdk包推送到研发云上自己的maven仓库
3、使用mvn命令打包
mvn clean -Ptongweb package
4、程序运行前,增加tongweb的license配置
server:
tongweb:
license:
path: /data/license.dat
以上配置可配置在nacos中,如项目没有nacos,可在程序启动参数中传入,例如 java -jar foo.jar -Dserver.tongweb.license.path=/data/license.dat
数据库适配
我的工程ORM组件采用了Mybatis-Plus,并且在写业务查询代码过程中采用了QueryWrapper或者LambdaQueryWrapper,并没有在Mapper.xml中编写sql脚本,因此数据库适配过程可完全采用Mybatis-Plus支持的数据库适配方案。以下以达梦的适配做具体举例:
1、增加达梦的数据库驱动依赖
<profile>
<!-- 达梦数据库-->
<id>dm</id>
<dependencies>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
</dependency>
</dependencies>
</profile>
2、编写项目在达梦数据库的初始化sql(此步骤忽略)
3、配置数据库连接
spring:
datasource:
# 数据库驱动
driver-class-name: dm.jdbc.driver.DmDriver
# mybatis-plus根据url自动识别数据库类型
url: jdbc:dm://192.168.1.100:6001?SCHEMA=admin_center
username: test
password: test
#最大连接数
maxActive: 100
hikari:
auto-commit: true
connection-test-query: SELECT 1
connection-timeout: 30000
idle-timeout: 300000
leak-detection-threshold: 1000
max-lifetime: 1800000
maximum-pool-size: 50
minimum-idle: 5
pool-name: HikariDataSource
validation-timeout: 5000
4、xml适配
我的代码工程没有手动编写sql,因此不需要此步骤,如项目有手动编写sql,需要在xml中做多数据库类型的适配,可增加以下方式适配:
a、增加DatabaseIdProvider
/**
* 自动识别使用的数据库类型
* 在mapper.xml中databaseId的值就是跟这里对应,
* 如果没有databaseId选择则说明该sql适用所有数据库
* */
@Bean
public DatabaseIdProvider getDatabaseIdProvider(){
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("Oracle","oracle");
properties.setProperty("MySQL","mysql");
properties.setProperty("DB2","db2");
properties.setProperty("Derby","derby");
properties.setProperty("H2","h2");
properties.setProperty("HSQL","hsql");
properties.setProperty("Informix","informix");
properties.setProperty("MS-SQL","ms-sql");
properties.setProperty("PostgreSQL","postgresql");
properties.setProperty("Sybase","sybase");
properties.setProperty("Hana","hana");
properties.setProperty("DM DBMS","dm");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
b、改写所有*Mapper.xml,增加databaseId, databaseId要与DatabaseIdProvider中配置的保持一致
<select id="isExist" resultType="Boolean" databaseId="mysql">
SELECT EXISTS(SELECT 1 FROM test_table WHERE table_id=#{tableId} LIMIT 1)
</select>
<select id="isExist" resultType="Boolean" databaseId="dm">
SELECT COUNT(*) FROM admin_center."test_table " WHERE "table_id"=#{tableId}
</select>
<select id="isExist" resultType="Boolean" databaseId="oracle">
SELECT COUNT(*) FROM admin_center."test_table " WHERE "table_id"=#{tableId}
</select>
5、使用mvn命令打包
mvn clean -Pdm package
多种环境打包
如项目采用了多种国产化组件,可采用多profile方式打包,以下为示例:
mvn clean -Ptongweb -Pdm package