HZERO PaaS平台组装笔记(五)后端应用服务部署
本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。
需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。
本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。
实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04
五、后端应用服务部署
配置hosts:这一步前面已经完成
vim /etc/hosts
127.0.0.1 db.hzero.com.cn # 配置数据库所在服务器地址
127.0.0.1 dev.hzero.com.cn # 配置后端服务所在服务器地址
127.0.0.1 redis.hzero.com.cn # 配置redis服务所在服务器地址
修改服务配置文件
修改每个服务模块的application.yml,主要涉及到数据库、Redis、注册中心、配置中心等地址等通用信息修改,另外一些服务特殊配置也需要注意。
问题:\target\classes\application.yml, \src\main\resource\sapplication.yml 该哪个?
答:\src\main\resource\sapplication.yml ;因为后面的每个模块的服务启动脚本run.sh,会把target 删除,然后把resource里面的文件覆盖过去。
需要更改的内容:
- 每个模块的application.yml中的Jdbc链接都要加&allowPublicKeyRetrieval=true
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
- 在 \ps-lite\target\classes\application-custom.yaml(这个文件被ps-lite的application.yml导入,所以是其配置的一部分)我们看到:
它用到了好几个域名:
dev.hzero.org
document.hzero.org
redis.hzero.org
这几个也得加到hosts文件中去:
vim /etc/hosts
127.0.0.1 dev.hzero.org # oauth基础地址hzero-oauth可访问的网关地址
127.0.0.1 document.hzero.org # hzero-file 用到的地址
127.0.0.1 redis.hzero.org #分布式锁用到的配置地址
备注:hosts文件是wsl自动生成的,每天第一次重启会自动生成,从而覆盖你修改的配置,要组织自动生成需要在wsl.conf中添加如下配置
/etc/wsl.conf:
[network]
generateHosts = false
3、ps-gateway的application.yml配置中,原来是
cloud:
gateway:
filter:
secure-headers:
frame-options: ${SECURE_HEADERS_FRAME_OPTIONS:allow-from http://hzeronf.saas.hand-china.com}
把http://hzeronf.saas.hand-china.com改成 http://dev.hzero.com.cn
豆包说要改,把实际文件的扩展名改成yml(resoure里面要改,会拷贝覆盖到target)
编写服务启动脚本
编写后端服务启动脚本,这里给出ps-lite服务的启动脚本创建流程,对于其它后端服务来说只需要将该脚本的 端口号调整为对应后端服务的 端口号,再将其复制到对应 后端服务根目录即可。由于iam,oauth等服务都合共到lite了,所以我们就把iam的默认端口8030给他了: 另外标准的内存分配是2G,但我们个人学习用,这个lite合并服务合并了多个服务,我们分配给他1G;其他注册中心、网关、平台治理、接口平台 都各分配500M就可以了。飞搭比较耗资源,我们给他两个服务各1G;
cd ps-lite
vim run.sh
SERVICE_NAME=${PWD##*/}
JAR=$SERVICE_NAME.jar
MPORT=8030
echo “>>> mvn clean package -Dmaven.javadoc.skip=true”
mvn clean package -Dmaven.javadoc.skip=true -Dmaven.test.skip=true
echo “>>> cd target”
cd target
mv app.jar $JAR
echo “>>> kill -9 $(lsof -t -sTCP:LISTEN -i:$MPORT)”
kill -9 $(lsof -t -sTCP:LISTEN -i:$MPORT)
JAVA_OPTS=”-Xms1024m -Xmx1024m -Dspring.profiles.active=dev”
echo “>>> nohup java -jar $JAVA_OPTS $JAR >app.log 2>&1 &”
BUILD_ID=dontKillMe nohup java -jar $JAVA_OPTS $JAR >app.log 2>&1 &
保存后,更改执行权限:
chmod +x run.sh
启动后端服务
在每个服务目录下面执行run.sh脚本即可,建议按照如下顺序进行启动,注意监控注册中心,确保每个服务都启动成功。(含各服务建议分配端口)
| 服务 | 简码 | 默认端口 | 描述 | 是否必须 | 备注 |
| hzero-register | HREG | 8000 | 注册中心 | 是 | _ |
| hzero-config | HCFG | 8010 | 配置服务 | 否 | 不安装各服务则需要关闭配置中心的配置 |
| hzero-iam | HIAM | 8030 | IAM服务 | 是 | 1.10.0之后的版本需要先部署hzero-license并配置产品授权,具体请参考产品授权,在《其他》章节中有一些简单的说明 |
| hzero-admin | HADM | 8060 | 平台治理服务 | 是 | _ |
| hzero-platform | HPFM | 8100 | 平台服务 | 是 | – |
| hzero-gateway | HGWY | 8080 | 网关服务 | 是 | – |
| hzero-oauth | HOTH | 8020 | 认证服务 | 是 | – |
| hzero-swagger | HSWG | 8050 | Swagger测试服务 | 否 | 开发环境可装 |
| hzero-report | HRPT | 8210 | 报表服务 | 否 | |
| hzero-scheduler | HSDR | 8130 | 调度服务 | 否 | |
| hzero-message | HMSG | 8120 | 消息服务 | 否 | |
| hzero-file | HFLE | 8110 | 文件服务 | 否 | |
| hzero-import | HIMP | 8140 | 导入服务 | 否 |
第一个ps-register 服务
在ps-register目录下运行 ./run.sh
root@desktop-jacksen:/d02/hzero/project/ps-register# ./run.sh
看app.log中不断增加的日至可以确定服务已经在运行
- Eureka 服务端地址,本例默认向 http://dev.hzero.com.cn:8000/eureka。
验证可用:
到注册中心的日志中可以找到生成的密码,用户名默认是user,登录后看到的信息如下:
有疑问的是ip地址怎么会是 10.255.255.254?
这个问题:解决方案如下:在bootstrap.yml配置文件中添加:
spring:
cloud:
inetutils:
# 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册
# 指定忽略的网卡
ignored-interfaces[0]: lo
# 选择注册的网段
preferred-networks[0]: 172.18.14.48
添加这个配置后,重启,网址就使用我们指定的正常网址了(所有服务的bootstrap.yml文件中都要加这个配置,否则IP地址都会错误,因为我们用的是虚拟机,有多个网址);
第二个ps-lite 服务,在目录下运行 ./run.sh
因为:hzero-lite 合并了 HZERO 微服务中的如下服务,基本涵盖了单体应用必备的功能。
- hzero-oauth:登录认证服务
- hzero-iam:身份管理服务
- hzero-platform:平台服务
- hzero-swagger:Swagger文档测试服务
- hzero-message:消息服务
- hzero-file:文件服务
- hzero-scheduler:调度服务
- hzero-import:导入服务
- hzero-report:报表服务
- hzero-gateway-helper:用户鉴权组件
- platform-mdm:主数据插件
- platform-hr:HR组织架构插件
- platform-org:组织信息插件
- platform-search:检索插件
- platform-dsr:数据源路由管理插件
- platform-cusz:个性化插件
- platform-gantt:甘特图插件
看日志,不成功,错误信息:
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[ps-lite.jar:1.12.0.RELEASE]
Caused by: java.io.FileNotFoundException: JAR entry org/hzero/lite/config/ not found in /d02/hzero/project/ps-lite/target/ps-lite.jar!/BOOT-INF/classes
at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:175) ~[ps-lite.jar:1.12.0.RELEASE]
解决方案(豆包):
解决方案
创建配置类目录及基础配置类
在 src/main/java/org/hzero/lite/ 下新建 config 包(即创建 src/main/java/org/hzero/lite/config/ 目录),并添加一个基础配置类 AppConfig.java,示例:
package org.hzero.lite.config;
import org.springframework.context.annotation.Configuration;
// 标记为 Spring 配置类,让扫描机制识别@Configurationpublic class AppConfig {
// 可在此添加 Bean 定义、导入其他配置等}
重新打包验证
执行 mvn clean package -Dmaven.test.skip=true 重新构建项目,然后检查 JAR 包中是否包含 org/hzero/lite/config/AppConfig.class:
jar -tf target/app.jar | grep “org/hzero/lite/config/”
这次有了.
再次运行 ./run.sh
刚才那个问题没有了,但又提示缺少另一个core入口:
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[ps-lite.jar:1.12.0.RELEASE]
Caused by: java.io.FileNotFoundException: JAR entry org/hzero/lite/core/ not found in /d02/hzero/project/ps-lite/target/ps-lite.jar!/BOOT-INF/classes
at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:175) ~[ps-lite.jar:1.12.0.RELEASE]
这个lite 看起来是卡住了,产品组说,启动脚本中要加license agent , 因为lite合并了iam服务,iam服务要用到license; 所以ps-lite的启动命令中要添加license的agent:
由于license控制策略一直在与时俱进,有关Hzero 各版本和license各版本的对应关系,请参考:汉得焱牛开放平台,中间试过好几个license agent文件,都出现不兼容问题,最后换的那个解决了不兼容问题。
重新启动ps-lite服务,发现还是有其他错误:提示什么类没有找到。 按照产品组建议,把POM文件中的部分插件依赖去掉就好了:
还有个问题就是提示数据库链接错误,那是因为在原始选配出来得yml文件中链接的mysql数据库是hzero_lite, 数据初始化的时候用的是hzero_platform,所以链接串中要改成hzero_platform
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
还有就是因为Lite服务合并了多个服务,只给1G内存的话,服务启动非常慢,半小时过去了,状态还是starting启动过程中。
把内存加到2G再重启服务,发现一晚上过去了还是starting状态,看日志,出现了两个错误:
一个是访问iam服务失败,应该是访问路径问题:产品组说这个没有关键影响,可以忽略;
另外一个是插入iam_permission 表失败,原因是数据重复,主键冲突;
按照产品组建议,把原表里面内容清空掉了:
产品组认为服务没有完成启动,成为up状态,可能还是内存不够,于是我们把内存加到4G ,再次重启服务;
过了半小时,还是没有UP状态,查看日志,发现有错误:
编辑 run.sh 把上述启动选项加上,再重启:这个错误没了,不过在注册中心的状态还是starting,没有UP (UP是所有依赖的服务启动没有错误spring系统自己设置的标记) ,没有UP标记就是表明服务没有启动成功;
产品组分析发现,lite启动的时候去调用license服务检查,但license服务又需要调用iam服务获取在线用户数,但因为iam服务合并到了lite 服务,这个时候iam服务还没有UP就是就掉不成功,这就使得lite 和 license相互调用不成功,陷入死循环。
解决方案:把application-custom.yml中HZERO_LICENSE_TYPE:从空改成lite,意思是让lite服务不要去调用license服务验证是否授权,而是从 .lic license授权文件中解密读取读取模块授权信息,从而避免跟license服务相互调用死锁。
直接去开放平台 下载授权文件(文件名随意,只要扩展名是.lic就行)放到resource 目录下,再次运行./run.sh 会把文件拷贝到target目录。
看日志,发现lic文件读取失败,但命中了redis缓存,但没用,潇葳说缓存中内容也是加密的,开放平台现在默认下载的1.0.3版本的lic文件,但lite服务目前依赖的license start只能解密1.0.0版本的lic文件,于是重新申请了1.0.0版本的lic文件,再次重启lite服务,这次能正确读取.lic文件中的授权信息了。
但是。。 注册中心中的状态依然是starting ,没有UP
产品组认为之前的合并的lite服务,本想用于单体和微服务两种场景,现在看起来是不合适了,于是他又另外打包了一个lite合并服务微服务版(区别于lite合并服务单体版),并且他还发现了另外几处问题,一并修改了。
后面选配lite服务,就要选新的lite合共服务微服务版。
现在简单起见,我们直接在现有的lite服务的POM中把依赖改一下:
把依赖改成 hzero-lite-cloud :
这个hzero-lite-cloud在启动的时候将不再调用license服务去检查授权情况,只在被调用的时候给license服务拦截,去检查license服务。这样就避免了启动时跟license服务相互死锁;
既然已经避免了相互死锁,我们在yml文件中,把HZERO_LICENSE_TYPE:改成空
另外hzero-lite-cloud的启动类,也改了,选配平台上的模板要改,原来的模板时错误的,注解中还用了chroden, 要改成下面这样:
再次重启 ./run.sh
这次 终于成功了:
登录验证:
发现验证错误,说用户名/密码不对, 检查iam_user表发现没有默认用户,说明原来导入数据有问题,进一步检查发现在hzero-menu-user-role-lable.xlsx的 sheet页 《菜单标签数据》有两行引用内容存在,出现#REF,这个问题导致这个Excel中的相当一部分数据导入不成功,其中包括iam_user表的内容。
解决方案:把出现 #REF的两行数据删除掉,再次重新导入hzer_platform模块的数据。
导入完成后,检查数据库发现有数据了,表示导入成功:
再次重启./run.sh,验证登录:
第三个:ps-license服务(依然是要先启动注册中心服务):
文档说1.10版本之后,hzero-iam组件(这个组件也被合并到了lite组件)需要购买授权后方能正常使用,因此 hzero-lite 服务也需要相关授权。
License处理主要有两种模式,这里用第一种模式:
- 部署 hzero-license 服务进行统一管理
该模式的优势在于,可以集中管理,如平台使用了多个受License控制的服务组件时,这种模式更加便捷。如采用此种模式,可在选配部署组件时追加选配 hzero-license 组件
因为前面没选配hzero-license 服务,我们再单独选配下这个服务:
下载后的resoure package里面没啥内容,不需要安装数据库表?有个 平台许可证管理.zip , 改名成ps-license.zip 上传服务器的project 目录下,pom.xml中MySQL依赖部分改一下:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
另外把lite依赖也加一下,自注册配置也加一下。然后启动(注册中心先启动):
另外:hzero 1.12 需要的license服务是1.0.3版本,所以POM文件中需要给更改如下:
进入ps-license目录,重新build一下:
root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…
另外,还需要一个license Agent的jar文件,这个需要向潇威申请,不同版本对应的agent文件不一样。本例需要的是license-agent103.jar ,把它放到新建的目录licenseAgent目录下
启动服务命令中把agent加上:
运行./run.sh
日志报错:
chatgpt分析:
按照这个方法修改POM文件后再重新Builder:
进入ps-license目录,重新build一下:
root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…
builder之后再起服务依然报错!
后来问了潇威,说父组件依赖不对,因为我们的父组件依赖的是ps-demo-parent 0.0.1实际依赖的是hzero1.12.0 , 这个license服务不能依赖hzero1.12.0 ;
要改成依赖依赖license的父组件:
<parent>
<groupId>org.hzero.license</groupId>
<artifactId>hzero-license-parent</artifactId>
<version>1.0.3.RELEASE</version>
</parent>
再次改POM文件:
进入ps-license目录,重新build一下:
root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…
build报错,说mysql 问题,POM中还是要恢复到原始的SQL配置:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
改了之后再次builder就成功了;可以打开license 服务页面了:
看日志:刚才那个报错没有了,剩下就是向注册中心注册失败,原因也是验证问题(向注册中心注册需要验证,通过web页面访问也需要验证)。但各服务的yml配置文件中都默认不使用用户验证机制)
后来按产品组建议,在注册中心POM 中去掉对lite的依赖,再重新构建,启动后注册中心就不需要验证了。
测试license服务:向开放平台申请license, 审批通过后,用上面界面上的“激活链接”按钮获取激活验证码,复制后在填入验证:提示激活成功;
以一个已经购买产品的租户下的用户角色进入开放平台,进入 应用市场->我购买的产品
点【申请license授权】
填入 申请信息,包括申请授权的产品列表,license版本(当前只有1.0.3及以上版本这一个选项)、申请环境类型、环境名称,然后点【提交申请】
提交申请,等待审核员审批,审批通过后可以查看【license授权记录】
点【查看激活详情】,可以看到具体激活情况:
要激活刚刚安装的服务器授权,打开license服务的访问界面,点击【激活链接】
系统会直接链接远程的开放平台,打开开放平台页面,显示激活码:
复制激活码,到本地界面进行验证:
验证显示:激活成功。 则表示license 收取激活的动作全部完成。
对ps-license服务监控一段时间后发现会自动从注册中心消失,看日志是因为发生某种错误,导致心跳发送失败:
豆包分析可能是版本不兼容问题:
考虑到之前注册中心服务,因为增加了对lite的依赖导致,spring Sercurity的配置被非预期的覆盖,导致需要验证(期望不需要验证);后来问了产品组,说h0 1.12用的Erueka是<version>4.2.0</version>, 我直接在license服务中把Erueka的版本指定到相同版本再重启,能坚持4小时,4小时后心跳又失败了。 再后来是潇葳新发了一个license服务的版本1.1.2.RELEASE(原来是1.0.3), 那么ps-license服务的POM文件中parent和依赖全部改成这个新版本重新Builde解决问题,改了之后再重新执行./run.sh
按照产品组建议,那个对lite 的依赖 在 hzero-lite、hzero-admin、hzero-register、hzero-gateway、hzero-license 这几个服务不需要加 ,除了这几个服务之外的服务才需要加,比如飞搭低代码的服务就需要加:
再打开注册中心页面,可以看到license 服务已经注册上来了:
第三个 ps-admin 平台治理服务
root@desktop-jacksen:/d02/hzero/project/ps-admin# ./run.sh
日志里面没啥错误,应该是OK的。
第四个 ps-gateway 网关服务
日志中有些路由找不到,这个需要更改application.yml文件中关于spring cloud 路由的配置,因为很多服务合并到hzero-lite了,哪些合并掉的服务路由的入口要改成hzero-lite , 比如原来hzero-iam, hzero-imp 等都要改成hzero-lite 。
另外我们发现注册中心gateway 中网关服务没有显示端口,需要在yml文件中server节点下面添加端口配置:
添加后重新启动就好了:
第五个 ps-interface 网关服务
关于作者:
| 昵称:Jack.shang 档案信息:jack.shang 程序员->项目经理->技术总监->项目总监->部门总监->事业部总经理->子公司总经理->集团产品运营支持 联系方式:你可以通过syfvb@hotmail.com联系作者 点击查看Jack.shang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/4431 |
对本文的评价:
