基于 spring-cloud 搭建 SPL 微服务

基于 spring-cloud 搭建 SPL 微服务

——集算器新增支持添加 spring 数据源

简介:

  集算器有丰富的数据源配置,可以满足绝大多数配置需求。但当我们要把基于自己系统创建的数据源应用到集算器时,缺少入口。
  对此我们增加了 spring 数据源工厂
  com.scudata.common.SpringDBSessionFactory.java,
  通用数据源工厂
  com.scudata.common.DataSourceSessionFactory.java。
  它们实现了 ISessionFactory 接口。通过调用他们独有的静态 create 方法,可产生 ISessionFactory 并传递给集算器运行环境。本篇主要介绍 com.scudata.common.SpringDBSessionFactory.java 在 spring-cloud 微服务中的使用。
  另提一下通用数据源工厂 com.scudata.common.DataSourceSessionFactory.java,与 spring 无关,但也能起到把数据源工厂增加到集算器环境中得作用,见通用数据源工厂 com.scudata.common.DataSourceSessionFactory - 乾学院 (raqsoft.com.cn)
  同时,报表也增加了对 spring 数据源的支持,见在润乾报表中添加 spring 定义的数据源 - 乾学院 (raqsoft.com.cn)
  熟悉 spring-cloud 得同学也可以直接看 一 /b)/iii

一、 测试项目说明

a) 创建 spring-cloud 微服务

 i. 需要新建三个 maven 项目,其一是微服务注册中心,例如 eureka 注册中心

  1. 如示例中的 register-server

  01png
  2. 引入依赖
  02png
  3. 配置 application.yml, 配置注册中心
  03png
  4. 新建 springboot 启动类 RegisterApplication.java
 增加 @EnableEurekaServer 使项目启动后成为注册中心

04png
 ii. 其二是 Provider,是一个 springboot web 项目

  1. 如示例中的 splservice,引入的依赖较多,分为 springboot-parent,spring-cloud,web、tomcat 相关,spring-jdbc/regist ds, 系统 lib 五块,见项目中的 pom.xml
05png
  2. 配置 bootstrap.yml, 见 src\main\resources\bootstrap.yml。其中是 web 配置,spring 应用和 datasource 配置,指定注册中心配置。Datasource 设置要改成自己的。
06png
  3. 新建 ProviderApplication.java
  注意增加 @EnableDiscoveryClient 使其可以注册到中心
07png
  4. 项目创建完成,编写其他逻辑,见下文

 iii. 其三是 Consumer,是一个 springboot web 项目

  1. 如示例中的 consumer,引入依赖,分为 springboot-parent,spring-cloud,consumer/feign,web、tomcat 相关, 系统 lib
  08png
  2. 配置 bootstrap.yml, 见 src\main\resources\bootstrap.yml。其中是 web 配置,spring 应用配置,指定注册中心配置
  09png
  3. 新建 ConsumerApplication.java
  注意增加 @EnableDiscoveryClient 使其可以注册到中心
  10png
  4. 项目创建完成,编写其他逻辑,见下文
b) Provider 是服务提供者,在这里会配置数据源、传递给集算器环境、使用集算器
 i. ProviderApplication.java
 增加扫描 @ComponentScan({”com.scudata.”,”com.test.”})
 这行可以在上方截图中找到

 ii. Datasource 的创建
 新建 com.test.config.MultiDsBeanConfig.java,详见项目中的源码。经过此步项目中才会存在 spring 的 datasource。注意 @Bean 中的字符串,这是 spring 中 datasource 的对象名或者说是 id,接下来要用。示例写了两个数据源。
11png
 iii. SpringDBSessionFactory 的产生
 新建 com.test.listener.AppInitListener.java。此类得 run 方法项目起动后回调,类似监听,在这里方便操作创建 SpringDBSessionFactory。调用 SpringDBSessionFactory.create(springDatasourcId,type),参数一就是上一步说的 datasource 的 id,type 是产品中定义的 DBType 类型。示例中对两个数据源都建立了 SpringDBSessionFactory。测试者按需编写源码,编写 id 和类型等。
12png
 iv. 计算服务
 新建 com.test.controller.SplExecuterController.java,详见源码。此类模拟调用集算器脚本文件,连接数据库和输出查询结果。Controller 的方法可以通过 web 路径调用到。示例中编写了两个方法,对应两个数据源的两个脚本,由于是示例,集算器主路径是写死的绝对路径,需要修改成自己的。测试包提供两个脚本,其中书写了 =connect(“spring 中的数据源 id”),和 c.query(sql),测试者按需修改。这里都返回了 byte[],是序列化的自定义查询结果。准备传递给 Consumer。

imagepng

imagepng

imagepng

c) Consumer 是服务消费者,在这里可以远程调用 Provider,并获取计算结果
 i. ConsumerApplication.java 增加 @EnableFeignClients
  准备使用 Feign 调用微服务
 ii. 调用微服务
  新建 com.test.consumer.SplFeignClient.java,详见项目中的源码。此接口是调用 Provider 方法的接口,可以看到他在方法上注解出了 Provider 可以访问的 url。返回的内容就是 Provider 计算后的序列化的 Sequence。
14png
 iii. Consumer 的使用入口
 新建 com.test.consumer.controller.ConsumeController.java,详见项目中的源码。此类是 Consumer 项目的 web 访问入口,这里定义了 url 的路由。通过这些 url 我们就可以访问到这个类中的方法,进而调用远程 Provider 的项目的服务。处理返回的 byte[] 数据,并按需进行下一步。示例中将结果展现到页面。

从 consmer 端调用 spl 脚本测试从 hsql 取数

imagepng

从 consmer 端调用 spl 脚本测试从 mysql 取数

imagepng

二、 测试

a) 测试需要 java 和 maven 环境

b) 三个项目都属于 web 服务,本地测试 host 为 localhost,要占用端口示例中占用了 8761,8090,8091,有其他进程冲突就要进行配置文件修改。

c) Provider 的数据源配置要改成自己的。

d) 示例中是 hsql 和 mysql 数据库作为数据源,如果测试换了数据库,应当修改源码,Provider 中的 com.test.listener.AppInitListener.java,改变其对应类型。

e) 首先要启动 register-server。

f) 启动 Provider 和 Consumer,这两者没有顺序要求。

g) 访问 localhost:8091/consumer/page/result/hsql,查看脚本 spring.splx 的查询结果

h) 访问 localhost:8091/consumer/page/result/mysql,查看脚本 spring2.splx 的查询结果

三、 常见问题
17png

应用尚未注册完成,稍等一下再刷新,或检查注册中心,localhost:8761
18png

四、源码测试

[项目源码压缩包下载]20230721
(https://img.raqsoft.com.cn/manual/springcloud-demo.zip)