feat(REQ-1465): 新增发送普通消息发送接口

背景:
  https://jira.axzo.cn/browse/REQ-1465?goToView=1

修改:
  1、新增发送普通消息发送接口

影响:
  无
This commit is contained in:
luofu 2023-10-19 18:53:45 +08:00
parent bd1cb276a0
commit 15d259836f
19 changed files with 732 additions and 14 deletions

View File

@ -110,6 +110,10 @@
<version>1.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.axzo.im.center</groupId>
<artifactId>im-center-api</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,27 @@
package cn.axzo.msg.center.message.controller;
import cn.axzo.msg.center.message.service.GeneralMessageService;
import cn.axzo.msg.center.service.general.client.GeneralMessageClient;
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
import cn.azxo.framework.common.model.CommonResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
/**
* @author cold_blade
* @date 2023/10/19
* @version 1.0
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class GeneralMessageController implements GeneralMessageClient {
private final GeneralMessageService generalMessageService;
@Override
public CommonResponse<String> sendMessage(GeneralMessageSendRequest request) {
return CommonResponse.success(generalMessageService.sendMessage(request));
}
}

View File

@ -0,0 +1,87 @@
package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* @author cold_blade
* @date 2023/10/19
* @version 1.0
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralMessagePushDTO implements Serializable {
private static final long serialVersionUID = -9017550674630922381L;
/**
* 消息的唯一标识
*/
private String identityCode;
/**
* 模板编码
*/
private String templateCode;
/**
* 模板icon地址
*/
private String templateIcon;
/**
* 消息标题
*/
private String title;
/**
* 消息内容
*/
private String content;
/**
* 卡片信息
*/
private String cardContent;
/**
* 消息所属组织类型
*/
private OrganizationTypeEnum orgType;
/**
* 消息所属组织Id
*/
private Long orgId;
/**
* 消息所属组织名称
*/
private String orgName;
/**
* 业务编码
*/
private String bizCode;
/**
* 消息发送时间戳
*/
private Long sendTimestamp;
/**
* 路由信息,可为空
*/
private List<MessageRouterButtonDTO> routers;
/**
* 参数及其对应的值的JSON串
*/
private JSONObject routerParams;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -60,6 +61,14 @@ public class MessageTemplateDTO implements Serializable {
* 模板路由信息
*/
private List<RawMessageRouterDTO> routers;
/**
* 推送终端
*/
private List<PushTerminalEnum> pushTerminals;
/**
* APP最小版本支持可不配
*/
private String minAppVersion;
public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, List<RawMessageRouterDTO> routers) {
return MessageTemplateDTO.builder()
@ -71,6 +80,8 @@ public class MessageTemplateDTO implements Serializable {
.msgCategory(baseTemplate.getMsgCategory())
.icon(baseTemplate.getIcon())
.routers(routers)
.pushTerminals(JSON.parseArray(baseTemplate.getPushTerminal(), PushTerminalEnum.class))
.minAppVersion(baseTemplate.getMinAppVersion())
.build();
}

View File

@ -0,0 +1,19 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
/**
* @author cold_blade
* @date 2023/10/19
* @version 1.0
*/
public interface GeneralMessageService {
/**
* 发送消息
*
* @param request 消息所需参数
* @return 消息的唯一标识
*/
String sendMessage(GeneralMessageSendRequest request);
}

View File

@ -0,0 +1,145 @@
package cn.axzo.msg.center.message.service.impl;
import cn.axzo.im.center.api.feign.MessageApi;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.msg.center.common.exception.ServiceException;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
import cn.axzo.msg.center.dal.GeneralMessageRecordDao;
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
import cn.axzo.msg.center.message.domain.dto.GeneralMessagePushDTO;
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
import cn.axzo.msg.center.message.service.GeneralMessageService;
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
import cn.axzo.msg.center.utils.MessageRouterUtil;
import cn.axzo.msg.center.utils.UUIDUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author cold_blade
* @date 2023/10/19
* @version 1.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class GeneralMessageServiceImpl implements GeneralMessageService {
private final MessageApi messageApi;
private final MessageTemplateNewService messageTemplateNewService;
private final GeneralMessageRecordDao generalMessageRecordDao;
@Override
public String sendMessage(GeneralMessageSendRequest request) {
// 查询模板基础信息
MessageTemplateDTO template = messageTemplateNewService.queryByTemplateCode(request.getTemplateCode())
.orElseThrow(() -> new ServiceException("未查询到对应的模板"));
// 构建消息记录并存储
GeneralMessageRecord messageRecord = buildMessageRecord(request, template);
generalMessageRecordDao.save(messageRecord);
// 推送
pushMessage(messageRecord, template);
return messageRecord.getIdentityCode();
}
private GeneralMessageRecord buildMessageRecord(GeneralMessageSendRequest request, MessageTemplateDTO template) {
return GeneralMessageRecord.builder()
.identityCode(UUIDUtil.uuidString())
.senderId(request.getSenderPersonId())
.senderId(request.getSenderIdentity().getId())
.senderType(request.getSenderIdentity().getType())
.receiverPersonId(request.getReceiverPersonId())
.receiverId(request.getReceiverIdentity().getId())
.receiverType(request.getReceiverIdentity().getType())
.templateCode(template.getCode())
.title(parseString(template.getTitle(), request.getBizExtParams()))
.content(parseString(template.getContent(), request.getBizExtParams()))
.orgType(request.getOrgType())
.orgId(request.getOrgId())
.orgName(request.getOrgName())
.state(GeneralMessageStateEnum.HAS_BEEN_SENT)
.bizCode(request.getBizCode())
.routerParams(request.getRouterParams())
.bizExtParams(request.getBizExtParams())
.build();
}
private void pushMessage(GeneralMessageRecord record, MessageTemplateDTO template) {
if (CollectionUtils.isEmpty(template.getPushTerminals())) {
// 模板未配置任何推送终端
return;
}
List<String> appTypes = template.getPushTerminals().stream()
.map(PushTerminalEnum::getImTerminalFlag).collect(Collectors.toList());
GeneralMessagePushDTO message = convert(record, template);
MessageInfo msgInfo = new MessageInfo();
msgInfo.setAppTypeList(appTypes);
msgInfo.setPersonId(String.valueOf(record.getSenderPersonId()));
msgInfo.setToPersonIdList(Lists.newArrayList(String.valueOf(record.getReceiverPersonId())));
msgInfo.setMsgHeader(record.getTitle());
msgInfo.setMsgContent(record.getContent());
msgInfo.setMsgTemplateId(record.getTemplateCode());
msgInfo.setMsgTemplateContent(JSON.toJSONString(message));
// 扩展信息
Map<String, String> ext = new HashMap<>();
ext.put("minAppVersion", template.getMinAppVersion());
msgInfo.setExtendsInfo(ext);
messageApi.sendMessage(msgInfo);
}
private GeneralMessagePushDTO convert(GeneralMessageRecord record, MessageTemplateDTO template) {
// 对应模板的路由列表
List<RawMessageRouterDTO> rawRouters = template.getRouters();
// 视情况替换原始URL中的参数变量
rawRouters.forEach(e -> MessageRouterUtil.parseRouteUrl(e, record.getRouterParams()));
// 转化成客户端展示的数据模型
List<MessageRouterButtonDTO> routerButtons = rawRouters.stream()
.map(RawMessageRouterDTO::toMessageRouterButton)
.collect(Collectors.toList());
// 获取模板卡片信息
String cardContent = template.getCardContent();
if (StringUtils.isNotBlank(cardContent)) {
cardContent = PlaceholderResolver.getDefaultResolver().resolveByMap(cardContent, record.getBizExtParams());
}
return GeneralMessagePushDTO.builder()
.identityCode(record.getIdentityCode())
.templateCode(template.getCode())
.templateIcon(template.getIcon())
.title(record.getTitle())
.content(record.getContent())
.cardContent(cardContent)
.orgType(record.getOrgType())
.orgId(record.getOrgId())
.orgName(record.getOrgName())
.bizCode(record.getBizCode())
.sendTimestamp(System.currentTimeMillis())
.routers(routerButtons)
.routerParams(record.getRouterParams())
.build();
}
private String parseString(String string, JSONObject params) {
if (Objects.isNull(params)) {
return string;
}
return PlaceholderResolver.getDefaultResolver().resolveByMap(string, params);
}
}

View File

@ -8,6 +8,7 @@ import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
@ -15,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @description
@ -47,6 +49,25 @@ public final class MessageRouterUtil {
.findFirst().orElseGet(() -> rawMessageRouter.getTerminals().get(0));
}
/**
* 根据指定的终端类型选取合适的路由
*
* @param rawMessageRouter 原始的模板路由策略
* @param excludeTerminalType 待排除的终端类型
* @return 合适的路由数据
*/
public static List<MessageRouterTerminalDTO> selectWithout(RawMessageRouterDTO rawMessageRouter,
TerminalTypeEnum excludeTerminalType) {
if (RouterCategoryEnum.ACTION.equals(rawMessageRouter.getCategory())) {
// 如果配置路由是API调用这与终端无关
return rawMessageRouter.getTerminals();
}
return rawMessageRouter.getTerminals().stream()
.filter(e -> !Objects.equals(excludeTerminalType, e.getTerminalType()))
// 若没有匹配的默认选择第一个然后由前端去进行最终判断
.collect(Collectors.toList());
}
/**
* 判断路由参数的合法性
*
@ -74,6 +95,23 @@ public final class MessageRouterUtil {
}
}
/**
* 解析模板上配置的路由地址,并将发送消息时的参数替换上去
*
* @param router 路由信息
* @param routerParam 路由参数
*/
public static void parseRouteUrl(RawMessageRouterDTO router, JSONObject routerParam) {
// 路由参数有效
if (Objects.nonNull(routerParam)) {
router.getTerminals().forEach(e -> {
// 替换原始URL中的参数变量
String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getUrl(), routerParam);
e.setUrl(routerUrl);
});
}
}
/**
* 解析按钮style
*

View File

@ -55,6 +55,8 @@ public class MessageRouterDTO implements Serializable {
private TerminalTypeEnum terminalType;
/**
* 按钮样式配置
* HIGH_LIGHT: 按钮高亮展示
* OVER_CARD: 按钮显示在卡片
*/
private List<ButtonStyleEnum> style;

View File

@ -18,12 +18,13 @@ public enum PushTerminalEnum {
/**
* B-安心筑企业版
*/
B_ENTERPRISE_APP("B-安心筑企业版"),
B_ENTERPRISE_APP("B-安心筑企业版", "ENTERPRISE"),
/**
* C-安心筑工人版
*/
C_WORKER_APP("C-安心筑工人版"),
C_WORKER_APP("C-安心筑工人版", "WORKER"),
;
private final String desc;
private final String imTerminalFlag;
}

View File

@ -16,7 +16,9 @@ import lombok.Getter;
public enum RouterCategoryEnum {
JUMP("直接跳转"),
ACTION("接口调用");
ACTION("接口调用"),
DETAIL("页面详情"),
;
private final String desc;
}

View File

@ -0,0 +1,34 @@
package cn.axzo.msg.center.service.general.client;
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
import cn.axzo.msg.center.service.pending.client.fallback.PendingMessageClientFallback;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
/**
* 普通消息模块
*
* @author cold_blade
* @date 2023/10/18
* @version 1.0
*/
@Component
@FeignClient(value = "msg-center", url = "${server.serviceUrl:http://msg-center:8080}",
fallback = PendingMessageClientFallback.class)
public interface GeneralMessageClient {
/**
* 发送消息
*
* @param request 消息所需参数
* @return 消息的唯一标识
*/
@PostMapping(value = "/general-message/send", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<String> sendMessage(@RequestBody @Valid GeneralMessageSendRequest request);
}

View File

@ -0,0 +1,23 @@
package cn.axzo.msg.center.service.general.client.fallback;
import cn.axzo.msg.center.service.general.client.GeneralMessageClient;
import cn.axzo.msg.center.service.general.request.GeneralMessageSendRequest;
import cn.azxo.framework.common.model.CommonResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author cold_blade
* @date 2023/10/18
* @version 1.0
*/
@Slf4j
@Component
public class GeneralMessageClientFallback implements GeneralMessageClient {
@Override
public CommonResponse<String> sendMessage(GeneralMessageSendRequest request) {
log.error("fall back while sending message. req:{}", request);
return CommonResponse.error("fall back while sending message");
}
}

View File

@ -0,0 +1,89 @@
package cn.axzo.msg.center.service.general.request;
import cn.axzo.msg.center.service.dto.IdentityDTO;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @description
* 发送消息
* @author cold_blade
* @date 2023/10/18
* @version 1.0
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralMessageSendRequest implements Serializable {
private static final long serialVersionUID = -3030926259836918967L;
/**
* 模板编码
*/
@NotBlank(message = "templateCode is required")
private String templateCode;
/**
* 消息发送者自然人id
*/
@NotNull(message = "senderPersonId is required")
private Long senderPersonId;
/**
* 消息发送者身份
*/
@NotNull(message = "senderIdentity is required")
private IdentityDTO senderIdentity;
/**
* 消息接收者自然人id
*/
@NotNull(message = "receiverPersonId is required")
private Long receiverPersonId;
/**
* 消息接收者身份
*/
@NotNull(message = "receiverIdentity is required")
private IdentityDTO receiverIdentity;
/**
* 消息所属组织类型
*/
private OrganizationTypeEnum orgType;
/**
* 消息所属组织Id
*/
private Long orgId;
/**
* 消息所属组织名称
*/
private String orgName;
/**
* 发送消息的业务编码
*/
private String bizCode;
/**
* 路由参数
* 该字段仅存放路由相关的变量及对应的值
*/
private JSONObject routerParams;
/**
* 业务扩展参数
* 标题/内容/以及卡片等的变量及对应的值放到该字段
*/
private JSONObject bizExtParams;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,117 @@
package cn.axzo.msg.center.service.general.response;
import cn.axzo.msg.center.service.dto.IdentityDTO;
import cn.axzo.msg.center.service.dto.MessageRouterDTO;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* @description
* 普通消息记录数模型
* @author cold_blade
* @date 2023/10/18
* @version 1.0
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralMessageResponse implements Serializable {
private static final long serialVersionUID = 5740922087866033787L;
/**
* 消息的唯一标识
*/
private String identityCode;
/**
* 模板编码
*/
private String templateCode;
/**
* 模板icon地址
*/
private String templateIcon;
/**
* 消息标题
*/
private String title;
/**
* 消息内容
*/
private String content;
/**
* 卡片信息
*/
private String cardContent;
/**
* 消息发送者自然人id
*/
private Long senderPersonId;
/**
* 消息发送者身份
*/
private IdentityDTO senderIdentity;
/**
* 消息接收者自然人id
*/
private Long receiverPersonId;
/**
* 消息接收者身份
*/
private IdentityDTO receiverIdentity;
/**
* 消息所属组织类型
*/
private OrganizationTypeEnum orgType;
/**
* 消息所属组织Id
*/
private Long orgId;
/**
* 消息所属组织名称
*/
private String orgName;
/**
* 业务编码
*/
private String bizCode;
/**
* 业务状态描述
*/
private String bizDesc;
/**
* 消息发送时间戳
*/
private Long sendTimestamp;
/**
* 路由信息,可为空
*/
private List<MessageRouterDTO> routers;
/**
* 参数及其对应的值的JSON串
*/
private JSONObject routerParams;
/**
* 发送终端eg
* B_ENTERPRISE_APPB-安心筑企业版
* C_WORKER_APPC-安心筑工人版
*/
private List<PushTerminalEnum> pushTerminals;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,18 @@
package cn.axzo.msg.center.dal;
import cn.axzo.msg.center.dal.mapper.GeneralMessageRecordMapper;
import cn.axzo.msg.center.domain.entity.GeneralMessageRecord;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @description
* @author cold_blade
* @date 2023/10/5
* @version 1.0
*/
@Slf4j
@Component
public class GeneralMessageRecordDao extends ServiceImpl<GeneralMessageRecordMapper, GeneralMessageRecord> {
}

View File

@ -5,8 +5,14 @@ import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum;
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
@ -20,27 +26,42 @@ import java.io.Serializable;
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("general_message_record")
public class GeneralMessageRecord extends BaseEntity<GeneralMessageRecord> implements Serializable {
private static final long serialVersionUID = -1271402884501451185L;
/**
* 发送者ID
* 消息的唯一标识
*/
private String identityCode;
/**
* 发送者自然人 ID
*/
private Long senderPersonId;
/**
* 发送者身份ID
*/
private Long senderId;
/**
* 接收者ID
* 发送者身份类型
*/
private IdentityTypeEnum senderType;
/**
* 接收者自然人 ID
*/
private Long receiverPersonId;
/**
* 接收者身份ID
*/
private Long receiverId;
/**
* 接收者类型
* 接收者身份类型
*/
private IdentityTypeEnum receiverType;
/**
* 自然人 ID
*/
private Long personId;
/**
* 模板编码
*/
@ -76,13 +97,19 @@ public class GeneralMessageRecord extends BaseEntity<GeneralMessageRecord> imple
/**
* 路由参数留存
*/
private String routerParams;
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject routerParams;
/**
* 重试次数
* 业务扩展参数
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject bizExtParams;
/**
* 推送重试次数
*/
private Integer retryCount;
/**
* 最终失败原因
* 推送最终失败原因
*/
private String failCause;

View File

@ -62,6 +62,10 @@ public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> impleme
* 推送终端配置 JSON字串
*/
private String pushTerminal;
/**
* APP最小版本支持可不配
*/
private String minAppVersion;
/**
* 创建者自然人id
*/

View File

@ -0,0 +1,66 @@
package cn.axzo.msg.center;
import cn.hutool.core.util.ReflectUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Target;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Objects;
/**
* @author cold_blade
* @date 2023/10/19
* @version 1.0
*/
@Slf4j
@Component
@Profile({"dev", "test", "local"})
public class FeignConfig implements RequestInterceptor, EnvironmentAware {
private Environment environment;
@Value("${imCenterEngineEnvUrl:http://dev-app.axzo.cn/msg-center}")
private String imCenter;
private static String POD_NAMESPACE;
static {
Map<String, String> env = System.getenv();
if (env != null) {
POD_NAMESPACE = env.get("MY_POD_NAMESPACE");
}
log.info("init FeignConfig, POD_NAMESPACE value is {}", POD_NAMESPACE);
}
@SneakyThrows
@Override
public void apply(RequestTemplate requestTemplate) {
if (POD_NAMESPACE == null) {
Target.HardCodedTarget target = (Target.HardCodedTarget) requestTemplate.feignTarget();
String url = requestTemplate.feignTarget().url();
// 如需修改微服务地址,建议通过外部化参数来调整
url = url.replace("http://im-center:8080", imCenter);
String profile = environment.getProperty("spring.profiles.active");
if (Objects.equals(profile, "test") && url.contains("dev-app.axzo.cn")) {
url = url.replace("dev-app", "test-api");
}
requestTemplate.target(url);
Field field = ReflectUtil.getField(target.getClass(), "url");
field.setAccessible(true);
field.set(target, url);
}
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}

View File

@ -3,6 +3,8 @@ package cn.axzo.msg.center;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
import static cn.axzo.msg.center.MsgCenterConfig.IM_CENTER;
/**
* @author cn
* @version 1.0
@ -10,6 +12,8 @@ import org.springframework.context.annotation.Configuration;
* @date 2023/5/30 11:33
*/
@Configuration
@EnableFeignClients
@EnableFeignClients(basePackages = {IM_CENTER})
public class MsgCenterConfig {
public static final String IM_CENTER = "cn.axzo.im.center.api.feign";
}