Appearance
技术中台应用开发指南
1. 微服务应用开发流程
基于技术中台的微服务应用开发流程概述
2. 开通账号
DevOps
- 联系Pass组,填写《技术中台平台账号申请》开通账号申请
容器云
- 联系Pass组,填写《技术中台平台账号申请》开通账号申请
微服务治理平台
- 联系Pass组,填写《技术中台平台账号申请》开通账号申请
低代码平台
- 联系微服务组,填写《低代码平台用户需求申请表》开通账号申请
流程管理平台
- 联系微服务组,填写《流程管理平台用户需求申请表》开通账号申请
3. 低代码平台自助搭建项目工程
平台配置
- 本地hosts文件添加配置:
javascript
192.101.65.88 teamcode.com
平台访问地址
模板版本
- 选择前端主应用模板:CPVF-POOLS:2.4.2-1版本;前端子应用模板:CPVF-POOLS:2.4.2-2版本; 后端模版:CPBF-java模版:2.1.4-1
4. 微服务框架配置
Maven全局配置(setting.xml文件)
xml
<profile>
<id>maven-public</id>
<repositories>
<repository>
<id>maven-public</id>
<name>maven-public</name>
<url>http://192.102.20.230:8081/repository/maven-public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
Maven仓库使用
UPMS配置
xml
<!-- UPMS依赖-->
<dependency>
<groupId>com.chinapost.upms</groupId>
<artifactId>cpit-upms</artifactId>
<version>${upms-version}</version>
</dependency>
UAAC配置
- pom配置
xml
<!-- UAAC依赖-->
<dependency>
<groupId>com.cpit.csc</groupId>
<artifactId>uaac-spring-boot-starter</artifactId>
<version>${uaac-version}</version>
</dependency>
<dependency>
<groupId>com.cpit.csc</groupId>
<artifactId>uaac-spring-aop</artifactId>
<version>${uaac-version}</version>
</dependency>
<dependency>
<groupId>com.cpit.csc</groupId>
<artifactId>uaac-dao-redis-jackson</artifactId>
<version>${uaac-version}</version>
</dependency>
- yaml配置
yaml
uaac:
# jwt秘钥
jwt-secret-key: ruqwjsndcnmyergfweuyurcqnhrqapi
# token名称 (同时也是cookie名称)
token-name: Authorization
timeout: 600
token-prefix: Bearer
is-read-cookie: false
5 前端框架配置
- 前端运行
- 升级 node 版本 16.13.x(如需使用 nvm 进行包管理,联系管理员)
- 云桌面设置 registry:`npm config set registry http://192.102.20.230:8081/repository/npm-public/`
- 在.npmrc 中添加 源(该源在 Devops 流水线中同样适用) `registry=http://192.102.20.230:8081/repository/npm-public/`
- 全局安装 pnpm `npm i -g pnpm`(请勿在项目内安装 pnpm,可能会遇到问题)
- 1. 安装依赖 `pnpm install`
- 2. 运行 `pnpm dev`
- 3. 打包 `pnpm build`
微前端配置
Upms-系统管理-打开微应用管理
输入微应用名称(推荐中文方便记忆,可刷入全称)
微应用简称(英文,且不能与已有名称重复!)
主应用页面路由:无特殊情况无需修改
微应用地址:子应用具体地址
如果没有微前端管理页面
平台管理-菜单管理-新增顶级菜单
资源名称:微应用管理
路由:/upms/micro-app
点击保存-角色管理-给当前登录角色授予页面权限(微应用管理)重新登录即可
新增微应用菜单
平台管理-菜单管理-新增顶级菜单
资源类型:选择微应用,在下拉框中选择刚才新建的微应用
微应用路由:就是想打开微应用后,默认进入的路由,从微应用中拷贝,可选择子应用。首页,也可填写‘/’,但是不能随意填写
点击保存-角色管理-给当前登录角色授予页面权限(微应用管理)
启动子应用后,在主应用中点击创建的微应用菜单,即可访问微应用。
6. 移动开发框架配置
全局配置
工程运行调试
7. 微服务治理平台
平台配置
- 本地hosts文件添加配置:
javascript
192.102.21.193 console.sgp-pre.chinapost.com.cn
192.102.21.193 sm-api-plane.sgp-pre.chinapost.com.cn
192.102.21.193 skiff-downloads.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-platform.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-nsf.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-nms.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-ncs.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-logagent.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-istio.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-grafana.console.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-apm.sgp-pre.chinapost.com.cn
192.102.21.193 prometheus-apigw.sgp-pre.chinapost.com.cn
192.102.21.193 platform-user-auth.sgp-pre.chinapost.com.cn
192.102.21.193 platform-service-auth.sgp-pre.chinapost.com.cn
192.102.21.193 platform-audit.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-turbine.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-turbine-1.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-turbine-0.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-tunnel-server.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-tunnel-server-1.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-tunnel-server-0.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-server.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-registry.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-registry-1.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-registry-0.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-meta.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-config-service.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-config-portal.sgp-pre.chinapost.com.cn
192.102.21.193 nsf-config-admin.sgp-pre.chinapost.com.cn
192.102.21.193 ncs-webconsole.sgp-pre.chinapost.com.cn
192.102.21.193 ncs.sgp-pre.chinapost.com.cn
192.102.21.193 logseer.sgp-pre.chinapost.com.cn
192.102.21.193 gtxs-server.sgp-pre.chinapost.com.cn
192.102.21.193 console.sgp-pre.chinapost.com.cn
192.102.21.193 apm-webserver.sgp-pre.chinapost.com.cn
192.102.21.193 apm-otel-collector.sgp-pre.chinapost.com.cn
192.102.21.193 apm-collector.sgp-pre.chinapost.com.cn
192.102.21.193 api-plane.sgp-pre.chinapost.com.cn
192.102.21.193 apigw-gportal.sgp-pre.chinapost.com.cn
平台访问地址
- 登录运营管理平台(host配置:inte-platform.chinapost.com.cn 192.101.65.88),点击产品,选择服务治理下微服务治理平台。
创建知识库
- 微服务治理平台-NSF-知识库,点击创建服务,编辑服务信息,创建服务。
nsf.yml文件配置
接入微服务治理(本地开发配置方法):工程中创建nsf.yml文件,配置如下:
yamlnsf: type: http version: '2.0' nsfServer: 'http://nsf-server.sgp-pre.chinapost.com.cn' application: name: standard-product-polymerize version: 0.0.1 projectCode: yysys envCode: prod mark: '' zone: default group: default tags: [] manager: patterns: - className: "" authority: accessKey: f66e84db109c4890b422be7cc32edd81 secretKey: b8cfb432496b46c9acc352246a97dfe3y
nsf.yml文件在工程中的位置,参考下图所示:
- 在微服务治理平台的服务管理界面中可看到该服务,服务启动前无运行的实例
应用部署运行
- 返回流水线界面,执行流水线,执行成功后如图所示。
- 返回微服务治理平台,能够看到相应的服务实例,微服务治理平台接入成功。
8. DevOps流水线
平台配置
- 本地hosts文件添加配置:
javascript
192.101.65.87 paas.chinapost-test.com.cn
192.101.65.88 inte-project.chinapost.com.cn
192.101.65.88 inte-measure.chinapost.com.cn
192.101.65.88 inte-devops.chinapost.com.cn
192.101.65.88 inte-platform.chinapost.com.cn
创建Dockerfile
- 创建Dockerfile到工程目录下
dockerfile
FROM 192.101.10.113/nsf/openjdk:nsf-skywalking-openjdk8
RUN In -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
RUN mkdir -p /standard-price-atom
WORKDIR /standard-price-atom
EXPOSE 9004
ADD ./standard-price-atom-business/target/standard-price-atom-business-1.0.0.jar
ENV JAVA_OPTS="" SW_AGENT_NAME="standard-price-atom" SW_AGENT_AUTHENTICATION="MzEtdGVzdA==" SW_AGENT_COLLECTOR_BACKEND_SERVICES="apm-otel-collector.sgp-pre.chinapost.com.cn:11800"
ENTRYPOINT exec java -javaagent:/nsf/nsf-boot.jar=standard-price-atom -javaagent:/skywalking/skywalking-napm-bin-8.5.0-latest/agent/skywalking-agent.jar -Dskywalking_config=/skywalking/skywalking-napm-bin-8.5.0-latest/agent/config/agent.config $JAVA_OPTS -jar standard-price-atom-business-1.0.0.jar
创建凭证
凭证管理-代码库凭证-创建凭证
创建代码源
持续交付-代码源-创建GitLab代码源-关联
创建流水线-后端
- 创建流水线,选择Java+Maven+Docker全流程,编辑流水线信息,点击确定创建流水线。
- 流水线列表中点击编辑,详细配置如下:
执行流水线-执行成功
创建流水线-前端
创建Dockerfile到工程目录下
FROM 192.101.10.113/public/nginx:1.18 ADD ./dist/ /usr/share/nginx/html/ COPY nginx.conf /etc/nginx EXPOSE 80 EXPOSE 443
容器云配置
yamlapiVersion: v1 kind: ConfigMap metadata: creationTimestamp: '2023-02-14T10:10:55Z' lables: system: cpdsp managedFields: - apiVersion: V1 fieldsType: 'f:data': .: {} 'f:default.conf': {} 'f:metadata': 'f:labels': .: {} 'f:system': {} manager: okhttp operation: Update time: '2023-02-14T10:10:55Z' name: productui namespace: sgp-prd-demo resourceVersion: '149831809' selfLink: /api/v1/namespaces/sgp-prd-demo/configmaps/productui uid: 09dc2455-635c-4dbb-a2dc-d1accd577eb0 data: default.conf: |- server { listen 80: server_name localhost: location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers *; add_header Access-Control-Allow-Methods *; root /usr/share/nginx/html; index index.html index.htm; try_files $url/ /index.html =404; } }
微前端跨域配置
方案一:主应用域名下配置子应用二级路径
通过nginx代理成微应用的访问地址。例如主应用域名为 dev.pruduction.com.cn,微应用访问地址为dev.pruduction.com.cn/mychild
.env.development 配置
javascript# 请求前缀 VITE_APP_BASE_URL_PREFIX='/fontapi' # 静态资源地址 VITE_APP_STATIC_URL=/child/images/guide # 构建资源公共路径 VITE_PUBLIC_PATH=/child/images/guide/
vite.config.ts : build 添加outDir,base修改如下
javascriptbuild: { outDir: `dist${loadEnv(mode, process.cwd()).VITE_PUBLIC_PATH}`, } base: loadEnv(mode, process.cwd()).VITE_PUBLIC_PATH,
src\views\upms\common\http\index.ts和src\views\dashboard\common\http\index.ts的代码替换为:新模块已更改
javascriptimport { createAxios } from '/@/utils/axios'; import { warpperEnv } from '@build/index'; const { VITE_APP_BASE_URL_PREFIX } = warpperEnv(); export const sysPreFix = VITE_APP_BASE_URL_PREFIX + '/sys'; export const sysHttp = createAxios({ requestOptions: { urlPrefix: sysPreFix, }, });
在登录页验证码位置,添加请求前缀src\views\sys\login\index.vue:代码123行
vue<el-image:style="{ width: verifyCodeImageWidth + 'px', height: '100%' }" :src="`${VITE_APP_BASE_URL_PREFIX}/sys/image/code?randomStr=${randomStr}`"> 264行 const { VITE_APP_TITLE, VITE_APP_BASE_URL_PREFIX } = warpperEnv();
子应用nginx配置
javascriptlocation /fontapi/sys { add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Headers' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PATCH, PUT'; add_header 'Content-Type' 'application/json; charset=utf-8'; if ($request_method = 'OPTIONS') { return 204; } # 请求转发 proxy_pass http://100.5.6.64:9090/sys/; }
主应用nginx配置
mychild就是在主域名下指定的,访问微应用的二级路径,通过nginx代理到真正的微应用服务器。如果在流水线中,localhost:8084要替换成相应的,容器内地址配置菜单时:微应用管理-新增微应用-微应用地址:主应用域名/mychild
child/images/guide 是微应用代码所在的真实位置,跟微应用打包时,输出的目标名称需要一致(outDir)
fontapi 微应用添加的统一请求前缀,避免微应用请求被主应用nginx拦截。
方案二:主应用域名下配置子应用二级路径
在主应用中,通过微应用自己的域名访问。例如主应用域名为 dev.pruduction.com.cn,微应用访问地址为dev.price.com.cn
配置菜单时:微应用管理-新增微应用-微应用地址:dev.price.com.cn
微应用代码无需修改
微应用nginx
主应该nginx
创建流水线,选择前端代码+Docker全流程,编辑流水线信息,点击确定创建流水线。
详细配置如下:
创建成功后即可启动流水线
容器云平台配置-后端
容器平台-服务管理-无状态服务界面中看到该服务创建成功
容器平台-网络管理-网络Service管理-创建Service
容器平台-网络管理-网络Ingress-创建Ingress
hosts配置
javascript
192.102.21.193 dev.standard-price-atom.com.cn
浏览器访问
至此,后端服务已部署运行成功。
容器云平台配置-前端
容器平台-无状态服务中找到前端服务
容器平台-网络管理-网络Service管理-创建Service
容器平台-网络管理-网络Ingress管理-创建Ingress,可在此页面配置调用的后端服务,配置示例:
至此,前端服务已部署运行成功。
9. 流程平台
平台配置
本地hosts文件添加配置:
javascript192.102.20.54 bpm-test.chinapost.com.cn 192.102.20.54 cpit-admin.bpm-test.chinapost.com.cn 192.102.20.54 cpit-form.bpm-test.chinapost.com.cn 192.102.20.54 cpit-engine.bpm-test.chinapost.com.cn
SDK功能清单
业务流程设计
决策模型设计
我发起的流程
我的待办
我的已办
表单管理
引用示例:
javascript
import BpmnList from '@cpitibpm/bpmnlist'; // 流程设计列表
import BpmnRender from '@cpitibpm/bpmrender'; // 查看流程渲染图
import AllHisprocess from '@cpitibpm/allhisprocess'; // 所有历史流程实例
import AllRunprocess from '@cpitibpm/allrunprocess'; // 所有正在运行的流程
import AllHistasks from '@cpitibpm/allhistasks'; // 所有历史任务
import DmnList from '@cpitibpm/dmnlist'; // 决策模型列表
import TodoList from '@cpitibpm/todolist'; // 待办列表
import FinishedList from '@cpitibpm/finishedlist'; // 已办列表
import MineProcess from '@cpitibpm/mineprocess'; // 我的流程
// 配套样式文件
import '@cpitibpm/dmnlist/dist/DmnList.style.css'; //DmnList
import '@cpitibpm/bpmnlist/dist/BpmnList.style.css'; //BpmnList
import '@cpitibpm/allhisprocess/dist/AllHisprocess.style.css'; //AllHisprocess
import '@cpitibpm/allrunprocess/dist/AllRunprocess.style.css'; //AllRunprocess
import '@cpitibpm/allhistasks/dist/AllHistasks.style.css'; //AllHistasks
import '@cpitibpm/bpmrender/dist/bpm/style.css'; //bpmrender
import '@cpitibpm/todolist/dist/todolist.style.css'; //todolist
import '@cpitibpm/finishedlist/dist/finishedlist.style.css'; // finishedlist
import '@cpitibpm/mineprocess/dist/mineprocess.style.css'; // mineprocess
前端配置
- 在
main.js/main.ts
文件中引入
javascript
import VXETable from 'vxe-table';
import 'vxe-table/lib/style.css';
import TodoList from '@cpit-ibpm/todolist'
import '@cpit-ibpm/todolist/dist/todolist.style.css'; //todolist
app.use(TodoList) // 注册待办组件
app.use(VXETable); //依赖VXETable
- 页面组件引用
vue
<template>
<div>
<TodoList>
</TodoList>
</div>
</template>
服务端配置
- jar依赖
xml
<dependency>
<groupId>com.cpit.bpm</groupId>
<artifactId>cpit-bpm-sdk</artifactId>
<version>2.3.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</exclusion>
<exclusion>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</exclusion>
<exclusion>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</exclusion>
</exclusions>
</dependency>
- yml配置
yaml
cpit:
engine:
url: cpit-admin.bpm-test.chinapost.com.cn #流程引擎服务地址
system:
url: cpit-engine.bpm-test.chinapost.com.cn # 流程管理平台地址
username: admin # 流程管理平台账号
password: uMPHiSrKym5IJm8peSLOqQ== # 流程管理平台账号密码
bpm:
token:
sdk:
header: X-Access-Token #流程引擎token头
bussiness:
header: X-Access-Upms-Token #业务平台token头
cpit:
engine:
url: cpit-engine.bpm-test.chinapost.com.cn #流程引擎地址
form:
url: cpit-form.bpm-test.chinapost.com.cn #流程管理表单服务地址
admin:
url: cpit-admin.bpm-test.chinapost.com.cn #流程管理平台地址
username: xxxx
password: xxxx==
bpm:
token:
sdk:
header: X-Access-Token #流程引擎token头
bussiness:
header: X-Access-Upms-Token #业务平台token
- 自定义流程功能:实现SDK中BpmSystemService中相应的接口,实现流程功能。
10. 本地联调
编写接口的
@FeignClient
注解,配置调用服务的URL地址- java
package com.chinapost.logistics.service.business.feign; import com.chinapost.logistics.service.api.constants.GlobalConstants; import com.chinapost.logistics.service.api.feign.StandardProductApi; import com.chinapost.logistics.service.business.handler.FeignRequestIterceptor; import com.springframework.cloud.openfeign.FeignClient; @FeignClient(value = GlobalConstants.STANDARDPRODUCTPOLYMERIZE_MODULE_NAME,url = "http://192.102.3.5:9001",fallback = StandardProductClientImpl.class,configuration = FeignRequestIterceptor.class ) public interface StandardProductClient extends StandardProductApi{ }
11. 远程服务联调
微服务治理平台探针配置
yamlnsf: type: http version: '2.0' nsfServer: 'http://nsf-server.sgp-pre.chinapost.com.cn' application: name: standard-product-polymerize version: 0.0.1 projectCode: yysys envCode: prod mark: '' zone: default group: default tags: [] manager: patterns: - className: "" authority: accessKey: f66e84db109c4890b422be7cc32edd81 secretKey: b8cfb432496b46c9acc352246a97dfe3y
探针jar包配置
nsf-boot.jar 包放到项目目录下
调试运行配置
java-javaagent:D:/nsf/nsf-boot.jar=standard-product-polyerize
编写FeignClient接口 ,配置调用服务的URL :调用服务URL地址
java
package com.chinapost.logistics.service.business.feign;
import com.chinapost.logistics.service.api.constants.GlobalConstants;
import com.chinapost.logistics.service.api.feign.StandardProductApi;
import com.chinapost.logistics.service.business.handler.FeignRequestIterceptor;
import com.springframework.cloud.openfeign.FeignClient;
@FeignClient(value = GlobalConstants.STANDARDPRODUCTPOLYMERIZE_MODULE_NAME, fallback = StandardProductClientImpl.class,configuration = FeignRequestIterceptor.class )
public interface StandardProductClient extends StandardProductApi{
}