Skip to content

技术中台应用开发指南

1. 微服务应用开发流程

基于技术中台的微服务应用开发流程概述

img

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仓库使用

image-20230201170424651

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-系统管理-打开微应用管理

      image-20230222102010065

    • 输入微应用名称(推荐中文方便记忆,可刷入全称)

    • 微应用简称(英文,且不能与已有名称重复!)

    • 主应用页面路由:无特殊情况无需修改

    • 微应用地址:子应用具体地址

      image-20230222102601740

  • 如果没有微前端管理页面

    • 平台管理-菜单管理-新增顶级菜单

    • 资源名称:微应用管理

    • 路由:/upms/micro-app

    • 点击保存-角色管理-给当前登录角色授予页面权限(微应用管理)重新登录即可

  • 新增微应用菜单

    • 平台管理-菜单管理-新增顶级菜单

      image-20230222103053831

    • 资源类型:选择微应用,在下拉框中选择刚才新建的微应用

      image-20230222103105431

    • 微应用路由:就是想打开微应用后,默认进入的路由,从微应用中拷贝,可选择子应用。首页,也可填写‘/’,但是不能随意填写

    • 点击保存-角色管理-给当前登录角色授予页面权限(微应用管理)

    • 启动子应用后,在主应用中点击创建的微应用菜单,即可访问微应用。

      image-20230222103115930

      image-20230222103127715

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-知识库,点击创建服务,编辑服务信息,创建服务。

img

img

nsf.yml文件配置

  • 接入微服务治理(本地开发配置方法):工程中创建nsf.yml文件,配置如下:

    yaml
    
    nsf:
    
      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文件在工程中的位置,参考下图所示:

img

  • 在微服务治理平台的服务管理界面中可看到该服务,服务启动前无运行的实例

img

应用部署运行

  • 返回流水线界面,执行流水线,执行成功后如图所示。

img

  • 返回微服务治理平台,能够看到相应的服务实例,微服务治理平台接入成功。

img

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

创建凭证

  • 凭证管理-代码库凭证-创建凭证

    1675650556334

创建代码源

  • 持续交付-代码源-创建GitLab代码源-关联

    1675651706535

创建流水线-后端

  • 创建流水线,选择Java+Maven+Docker全流程,编辑流水线信息,点击确定创建流水线。

img

img

img

  • 流水线列表中点击编辑,详细配置如下:

img

img

img

img

img

img

img

  • 执行流水线-执行成功

    1675654207876

创建流水线-前端

  • 创建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
    
    
  • 容器云配置

    yaml
    
    apiVersion: 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修改如下

        javascript
        
         build: {
        
              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的代码替换为:新模块已更改

        javascript
        
        import { 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配置

        javascript
        
        location /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拦截。

          image-20230222104828683

    • 方案二:主应用域名下配置子应用二级路径

      • 在主应用中,通过微应用自己的域名访问。例如主应用域名为 dev.pruduction.com.cn,微应用访问地址为dev.price.com.cn

      • 配置菜单时:微应用管理-新增微应用-微应用地址:dev.price.com.cn

      • 微应用代码无需修改

      • 微应用nginx

        image-20230222105300843

      • 主应该nginx

        image-20230222105323138

  • 创建流水线,选择前端代码+Docker全流程,编辑流水线信息,点击确定创建流水线。

    img

  • 详细配置如下:

    img

    img

    img

    img

    img

    img

    img

  • 创建成功后即可启动流水线

容器云平台配置-后端

  • 容器平台-服务管理-无状态服务界面中看到该服务创建成功

    1675654417224

  • 容器平台-网络管理-网络Service管理-创建Service

    1675658903029

  • 容器平台-网络管理-网络Ingress-创建Ingress

    1675654732220

    1675658985009

  • hosts配置

javascript

192.102.21.193 dev.standard-price-atom.com.cn

  • 浏览器访问

    16756595919730

  • 至此,后端服务已部署运行成功。

容器云平台配置-前端

  • 容器平台-无状态服务中找到前端服务

  • 容器平台-网络管理-网络Service管理-创建Service

    1675932743410

  • 容器平台-网络管理-网络Ingress管理-创建Ingress,可在此页面配置调用的后端服务,配置示例:

    1675933198567

  • 至此,前端服务已部署运行成功。

9. 流程平台

平台配置

  • 本地hosts文件添加配置:

    javascript
    
    192.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{
    
    }
    
    

feign

11. 远程服务联调

  • 微服务治理平台探针配置

    yaml
    
    nsf:
    
      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 包放到项目目录下

    agent

    调试运行配置

    java
    
    -javaagent:D:/nsf/nsf-boot.jar=standard-product-polyerize
    
    

    vm

    vm配置

    javaagent

  • 编写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{

}

nacos