国产化适配分享

        随着我国加快推进信息网络等新型基础设施建设、网络主权概念的逐步明确,信息技术应用创新产业已经成为当前信息化部署的关键词。我国正在大力推动政府、国防、金融、交通等关键领域的信息化产品尽快实现国产化替代,并发布了多个重要政策来保障国产化的实施,加速实现信息核心技术的自主可控。

    在适配了一批国产化操作系统、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值