单系统项目微服务化改造

一、业务系统改造(项目组改造)

1. 系统管理源代码迁移

系统管理相关代码迁移到scp_sys微服务工程;
并按照认证中心要求进行改造;(具体改造内容请与架构组沟通)

2. 基础数据源代码迁移(例子)

以基础数据的【用户级数据字典】为例,说明如何迁移源代码到微服务工程:

(一)数据库迁移

数据库迁移

(1)表结构迁移

单系统分布式-表结构迁移1

A). 导出Oracle建表脚本
单系统分布式-表结构迁移2

B) 导入ER模型
单系统分布式-表结构迁移3

单系统分布式-表结构迁移32

C) 从ER模型导出MySql建表脚本
单系统分布式-表结构迁移4

单系统分布式-表结构迁移42

单系统分布式-表结构迁移43

D) 创建视图:V_MD_CODE_DICT和V_SYS_UESER
单系统分布式-表结构迁移5

(2)表数据迁移

A)导数据:md_code_type 、md_code_dict 、ipf_ccm_dict和ipf_ccm_dict_row
单系统分布式-表结构迁移6

单系统分布式-表结构迁移62

(二).后台代码迁移

后台代码迁移

(1) Controller、Mapper、Service迁移到sys_md_business工程对应目录

A)UserMdCodeTypeController.java、UserMdCodeDictController.java文件直接拷贝到sys_md_businesssrc/java /com/gillion/fms/md/web目录;
B)UserMdCodeTypeMapper.java、UserMdCodeDictMapper.java文件直接拷贝到sys_md_business的src/java /com/gillion/fms/md/mapper目录;
C)UserMdCodeTypeServiceImpl.java、UserMdCodeTypeService.java、UserMdCodeDictServiceImpl.java、UserMdCodeDictService.java文件直接拷贝到sys_md_business的src/java/com/gillion/fms/md/service目录;
D)UserMdCodeTypeMapper.xml、UserMdCodeDictMapper.xml文件直接拷贝到sys_md_businesssrc/resources/com/gillion/fms/md/mapper目录;

(2)Example、domain迁移到sys_md_entity工程对应目录

A)UserMdCodeTypeExample.java、UserMdCodeType.java、UserMdCodeDictExample.java、UserMdCodeDict.java文件直接拷贝到sys_md_entity的src/java /com/gillion/fms/md/domain目录;

(3)后台调用系统管理的代码改造为微服务调用方式

A) 改造前:系统管理拆分为独立微服务后,直接调用系统管理相关代码编译会报错。
Office roleOffice = SysUserUtil.getCurrentLoginRoleSysOffice();
String settleOfficeTemp = roleOffice.getSettleOffice().getOfficeCode();

单系统分布式-后台代码迁移1
B)改造后:需要改造为微服务调用方式,系统管理微服务开放对应接口,通过接口调用。(具体改造方法请咨询架构组,这个例子里面只是简单处理跳过这个错误)
单系统分布式-后台代码迁移2

(三).前台代码迁移

前台代码迁移

(1) Js和html文件迁移到scp_www\scp_md_www对应目录

A)entity-UserMdCodeType_Default.js、entity-UserMdCodeDict_Default.js文件直接拷贝到scp_www\scp_md_www\static\app\nls目录;
B)UserMdCodeType_Default.js、UserMdCodeDict_Default.js文件直接拷贝到scp_www\scp_md_www\static\app\validation\generated目录;
C)userMdCodeTypeManage.js、userMdCodeTypeAdd.js、userMdCodeTypeEdit.js、userMdCodeTypeView.js、userMdCodeDictManage.js、userMdCodeDictAdd.js、userMdCodeDictEdit.js、userMdCodeDictView.js文件直接拷贝到scp_www\scp_md_www\static\app\fms\md目录;
D)userMdCodeTypeManage.html、userMdCodeTypeAdd.html、userMdCodeTypeEdit.html、userMdCodeTypeView.html、userMdCodeDictManage.html、userMdCodeDictAdd.html、userMdCodeDictEdit.html、userMdCodeDictView.html文件直接拷贝到scp_www\scp_md_www\html\fms\md目录;

(四).前台代码改造

前台代码改造

(1) Html改造:script中data-main的内容中最前面拼入$md.path,如下图:

注:其中$md是基础数据模块的上下文变量
单系统分布式-后台代码改造1
修改前:
<script src="/bower_components/requirejs/require.js" data-main="/static/app.js" data-bootstrap-modules="['fms/md/userMdCodeTypeManage']"></script>

修改后:
<script src="/static/app/appconfig.js"></script>
<script>
document.write('<script src="/bower_components/requirejs/require.js" data-main="' + $md.path + '/static/app.js" data-bootstrap-modules="[\'fms/md/userMdCodeTypeManage\']"><\/script> ');
</script>

(2) js改造:访问html的地方在前面拼入$config.path,如下图:

单系统分布式-后台代码改造2

修改前:var url = "/html/fms/md/userMdCodeDictEdit.html";
修改后:var url = $config.path+"/html/fms/md/userMdCodeDictEdit.html";

(五).菜单迁移(已迁移)

菜单迁移

(1) 查询菜单数据并导出

A) P/L SQL执行查询sys_resource和sys_resource_rel的语句

select * from sys_resource a where a.bo_name in ('UserMdCodeType','UserMdCodeDict');
select * from sys_resource_rel b where b.sys_resource_id in
(select a.sys_resource_id from sys_resource a where a.bo_name in ('UserMdCodeType','UserMdCodeDict'));

单系统分布式-菜单迁移1

(2) 导入菜单数据

删除Oracle导出菜单权限脚本中Oracle专用的语句,如下图:
单系统分布式-菜单迁移2
在scp_sys数据库执行上图的菜单插入脚本

(3) 更新菜单数据

–/html的权限url前面加上微服务的上下文环境变量/scp_md_www
UPDATE sys_resource SET url = REPLACE(url, '/html', '/scp_md_www/html') where bo_name in ('UserMdCodeType','UserMdCodeDict') and url like '/html%';

3. FMS源代码迁移

FMS源码迁移
参考【基础数据】例子,迁移FMS业务相关源代码到scp_fms微服务工程;
此微服务工程连接Oracle数据库,因此在pom文件中引入Oracle驱动,且.yml配置mq的查询语法用Oracle语法;

4.BMS源代码迁移

BMS源码迁移
参考【基础数据】例子,迁移FMS业务相关源代码到scp_bms微服务工程;
此微服务工程连接Oracle数据库,因此在pom文件中引入Oracle驱动,且.yml配置mq的查询语法用Oracle语法;

二、Nginx配置

NGINX配置
Nginx文件放在svn如下位置:http://172.16.0.35/svn/WYCJ_FMS/02_Source/04_Source/scp_dev/nginx。
1)修改根目录配置

单系统分布式-nginx2

2)微服务配置

单系统分布式-nginx1

三、附录:

附录

1. 微服务项目部署结构

1)微服务项目后台启动多个微服务,每个微服务连接各自的数据库,每个微服务启动后注册到EDS服务器;前端只有一个入口,用户使用起来跟单系统没有区别;后端请求统一发送到Nginx服务器,Nginx服务转发后端请求到EDS服务器,由EDS服务器调度到对应的应用服务器;
2)
单系统分布式-微服务项目部署结构1

用户权限通过独立的微服务管理(认证中心+用户中心),认证中心服务登录验证和权限验证等核心处理逻辑,用户中心负责用户权限数据的变更(添加用户,修改授权等等);

单系统分布式-微服务项目部署结构2

2. 微服务项目代码目录结构

微服务模式环境介绍见gschool文档:http://gschool.glpaas.gillion.com.cn/?page_id=7880,这里简要说明如下:

(一).后端目录结构

A)后端有多个系统,每个系统可独立部署,连接独立的数据库;

单系统分布式-微服务目录结构1

B)每个系统分为API和Business两个工程

单系统分布式-微服务目录结构2

C)系统Business部分对应的工程编译为war包

单系统分布式-微服务目录结构3

(二).前端目录结构

A)hbias_www是前端静态资源主目录(hbias是项目代码),红框内容为前端框架,每个微服务有一个独立的www目录,包括前端html和js目录;

单系统分布式-微服务目录结构4

B)前端控件代码在外层目录static目录的app/framework子目录下;

单系统分布式-微服务目录结构5

3. 搭建独立的系统管理微服务(认证中心+用户中心)

1)认证中心初始源代码(待架构组升级到新版)

单系统分布式-认证中心初始源代码1

2)用户中心初始源代码(待项目组改造)

单系统分布式-认证中心初始源代码2

4. SCP项目微服务工程初始化(任务中心scp_task,状态池scp_status,船代业务scp_sa,驳运业务scp_fcos)

(一).后端文件:

A) 目录名:scp_sa ->scp_task
B) pom.xml:scp_sa ->scp_task
C) .yml:
服务名:scp_sa_business ->scp_task_business
Tomcat端口: port: 8087-> port: 8088
netty端口: port: 10149-> port: 10111
连接串:daili_scp_sa->daili_scp_task
D) SaApplication.java->TaskApplicatioin.java

(二).前端文件:

A) 目录名:scp_sa_www ->scp_task_www
B) app.js:$sa.path -> $task.path
C) config.properties.js:添加$task相关变量,设置当前上下文变量
D) 外层目录appconfig.js:添加$task相关变量

(三).springBoot启动方式:

A)创建启动配置

单系统分布式-springboot1

单系统分布式-springboot12

B)每次选择一个启动配置,点调试按钮启动

注意:必须至少启动认证中心(scp_authentication)和用户中心(scp_sys)才能登录
单系统分布式-springboot2

5. 移植登录页、主页和CSS样式

1.迁移login.html和index.html,以及loginModule.js和indexModule.js
2.迁移resource/css和resource/images

6. SCP项目菜单迁移说明(Oracle->MySql)

(一).同步数据库表结构SYS_OFFICE/SYS_USER/SYS_ROLE,增加SCP项目特有字段;

见sql脚本文件alter_tables.sql

(二).导入权限相关数据(组织、角色、用户、权限)

使用P/L SQL工具连接fmsuser数据库(Oracle)导出系统管理插入脚本

单系统分布式-scp菜单迁移说明1
导出的sql脚本文件如下图

单系统分布式-scp菜单迁移说明2

对导出的脚本sys_resource.sql和sys_resource_rel.sql做去重处理(已处理)
因为Oracle数据库中sys_resource.url这个字段是大小写区分的,导入到MySql时大小写不区分导致有如下重复数据(需要在脚本中删掉一条错误的数据,并在sys_resource_rel中删除对应的行)

单系统分布式-scp菜单迁移说明3

删除Mysql中原有的权限相关数据

单系统分布式-scp菜单迁移说明4

按如下表名的顺序执行插入数据脚本

单系统分布式-scp菜单迁移说明5

更新导入后的Mysql数据
–更新错误的数据
update sys_user set is_active='Y', is_deleted='N' ;
update sys_role set is_deleted='N' ;
update sys_office set is_active='Y', is_deleted='N' ;
update sys_role a set a.sys_office_id='3c5e1b535d034d48acfc304d0df8fbf7' where a.sys_role_id='49c0b3ba939042069c1d40ccc7541b5b';

–更新系统管理相关菜单url的上下文路径
UPDATE sys_resource a SET a.url = REPLACE(url, '/html/platform/', '/scp_sys_www/html/platform/') where a.url like ‘/html/platform/%.html’;
–更新基础数据相关菜单url的上下文路径
UPDATE sys_resource a SET a.url = REPLACE(url, '/html/fms/md/', '/scp_md_www/html/fms/md/') where a.url like '/html/fms/md/%.html';