基于 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
2. 引入依赖
3. 配置 application.yml, 配置注册中心
4. 新建 springboot 启动类 RegisterApplication.java
增加 @EnableEurekaServer 使项目启动后成为注册中心
ii. 其二是 Provider,是一个 springboot web 项目
1. 如示例中的 splservice,引入的依赖较多,分为 springboot-parent,spring-cloud,web、tomcat 相关,spring-jdbc/regist ds, 系统 lib 五块,见项目中的 pom.xml
2. 配置 bootstrap.yml, 见 src\main\resources\bootstrap.yml。其中是 web 配置,spring 应用和 datasource 配置,指定注册中心配置。Datasource 设置要改成自己的。
3. 新建 ProviderApplication.java
注意增加 @EnableDiscoveryClient 使其可以注册到中心
4. 项目创建完成,编写其他逻辑,见下文
iii. 其三是 Consumer,是一个 springboot web 项目
1. 如示例中的 consumer,引入依赖,分为 springboot-parent,spring-cloud,consumer/feign,web、tomcat 相关, 系统 lib
2. 配置 bootstrap.yml, 见 src\main\resources\bootstrap.yml。其中是 web 配置,spring 应用配置,指定注册中心配置
3. 新建 ConsumerApplication.java
注意增加 @EnableDiscoveryClient 使其可以注册到中心
4. 项目创建完成,编写其他逻辑,见下文
b) Provider 是服务提供者,在这里会配置数据源、传递给集算器环境、使用集算器
i. ProviderApplication.java
增加扫描 @ComponentScan({”com.scudata.”,”com.test.”})
这行可以在上方截图中找到
ii. Datasource 的创建
新建 com.test.config.MultiDsBeanConfig.java,详见项目中的源码。经过此步项目中才会存在 spring 的 datasource。注意 @Bean 中的字符串,这是 spring 中 datasource 的对象名或者说是 id,接下来要用。示例写了两个数据源。
iii. SpringDBSessionFactory 的产生
新建 com.test.listener.AppInitListener.java。此类得 run 方法项目起动后回调,类似监听,在这里方便操作创建 SpringDBSessionFactory。调用 SpringDBSessionFactory.create(springDatasourcId,type),参数一就是上一步说的 datasource 的 id,type 是产品中定义的 DBType 类型。示例中对两个数据源都建立了 SpringDBSessionFactory。测试者按需编写源码,编写 id 和类型等。
iv. 计算服务
新建 com.test.controller.SplExecuterController.java,详见源码。此类模拟调用集算器脚本文件,连接数据库和输出查询结果。Controller 的方法可以通过 web 路径调用到。示例中编写了两个方法,对应两个数据源的两个脚本,由于是示例,集算器主路径是写死的绝对路径,需要修改成自己的。测试包提供两个脚本,其中书写了 =connect(“spring 中的数据源 id”),和 c.query(sql),测试者按需修改。这里都返回了 byte[],是序列化的自定义查询结果。准备传递给 Consumer。
c) Consumer 是服务消费者,在这里可以远程调用 Provider,并获取计算结果
i. ConsumerApplication.java 增加 @EnableFeignClients
准备使用 Feign 调用微服务
ii. 调用微服务
新建 com.test.consumer.SplFeignClient.java,详见项目中的源码。此接口是调用 Provider 方法的接口,可以看到他在方法上注解出了 Provider 可以访问的 url。返回的内容就是 Provider 计算后的序列化的 Sequence。
iii. Consumer 的使用入口
新建 com.test.consumer.controller.ConsumeController.java,详见项目中的源码。此类是 Consumer 项目的 web 访问入口,这里定义了 url 的路由。通过这些 url 我们就可以访问到这个类中的方法,进而调用远程 Provider 的项目的服务。处理返回的 byte[] 数据,并按需进行下一步。示例中将结果展现到页面。
从 consmer 端调用 spl 脚本测试从 hsql 取数
从 consmer 端调用 spl 脚本测试从 mysql 取数
二、 测试
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 的查询结果
三、 常见问题
应用尚未注册完成,稍等一下再刷新,或检查注册中心,localhost:8761
四、源码测试
[项目源码压缩包下载]20230721
(https://img.raqsoft.com.cn/manual/springcloud-demo.zip)
代码 demo 在哪里呢
感谢回复,demo 整理完后会放上来
大概什么时候可以整理完呢?希望尽快用上
已提供源码下载
已提供源码下载
英文版
测试文件,是否可以提供一下。
代码是否可以放在 gitee 上
没有提供例子的测试文件(spring.splx)。运行的时候,pom 文件中依赖版本没有明确指定,导致可能出现依赖冲突,无法启动。例子,是否可以放在 gitee 上,方便下载。
splservice 启动的时候,出现
Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup
registerservice 启动之后,
http://localhost:8761/eureka/
访问地址出错cosumeservice 启动的时候,出错
The bean ‘splservice.FeignClientSpecification’, defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.