千里马平台的核心是微服务架构。微服务架构有很多种,我们锁定springCloud。服务注册与发现锁定nacos,网关为spring gateway。选型曾经花了很多时间,做了很多比较,我认为这是目前最优组合。不选用这套架构的同学们可以转学了,大家不是一条道上的。
版本选择也是个头痛问题,有关版本的问题可见版本说明
千里马架构当前选择版本如下:
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
以上摘自qlm-parent的pom文件。对应代码会择机开源。 nacos为1.4.2(友情提醒,早期版本的nacos有漏洞CVE-2021-29441)
jdk用1.8
后续如果有版本变动会在社区发布。记住一个原则,版本不是最新最好。
微服务架构中最核心的部分是前后端接口结构。任何一个平台甚至任何一个前后端分离的系统都需要定义这样一个结构。参考其他架构结合自身经验,千里马平台的接口结构定义为:
package org.qlm.io.vo;
public class RequestInfo implements Serializable {
//1.0
@Schema(description = "请求包版本标识 用于版本兼容")
private String version;
@Schema(description = "请求者")
private String consumer;//请求者 标识发出请求的系统
@Schema(description = "请求流水号")
private String serialNo;//请求流水号
@Schema(description = "请求者语言")
private String language;//请求者 要求使用的语言 zh-cn zh-tw en jp
//分页要求参数
@Schema(description = "页码")
private Integer page;//页码 下标从0开始
@Schema(description = "每页最大数据")
private Integer size;//每页最大数据
//附加参数
@Schema(description = "附加参数 简单的单参数请求可以使用该参数")
private String tag;
@Schema(description = "描述tag的用处")
private String tagDescription;
@Schema(description = "附加参数2 简单的单参数请求可以使用该参数")
private String tag2;
@Schema(description = "描述tag2的用处")
private String tagDescription2;
}
以上代码摘自qlm.io
结构早期还有模板类T data,用于传入业务数据,很多系统也是这样的设计。但是在swagger中不能解析出结构。设计改为,如果需要传入简单1-2个参数,使用tag、tag2,如果需要传入复杂参数,需要自行定义请求类(需继承RequestInfo),如用户管理dto类定义:
@Schema(name="UserRequestDto",description="用户请求信息")
public class UserRequestDto extends RequestInfo {
@Schema(name="userId",description="用户ID")
private String userId;
@Schema(name="loginName",description="登录账号")
private String loginName;
以上代码摘自qlm-dto-auth
前端传入简单参数的写法(根据id删除用户):
export function deleteUser(id) {
const RequestInfo={
version:"1.0",
consumer:store.getters.QLMConfig.application_id,
serialNo:uuid.v1(),
tag:id
}
return request({
url: store.getters.QLMConfig.qlm_gateway_url+'/usermanager/deleteUser',
method: 'post',
data:RequestInfo
})
}
传入复杂参数的写法(查询用户)
export function getUserList(data){
const UserQueryDto={
version:"1.0",
consumer:store.getters.QLMConfig.application_id,
serialNo:uuid.v1(),
page:data.pageNum-1,
size:data.pageSize,
nickName:"",
userName:data.userName,
isuse:data.isuse,
loginName:data.loginName,
infosource:data.infosource,
tag:"",
}
return request({
url:store.getters.QLMConfig.qlm_gateway_url+'/usermanager/getUserListForPage',
method: 'post',
data:UserQueryDto
})
}
以上摘自@/api/qlm_user.js
以上结构完全可以做到全行业统一的,这就是千里马联盟的使命之一。
千里马平台代码会择机发布,希望同道志士共同努力。