diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 083be38..0baa873 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,11 +10,14 @@ - - + + + + + @@ -23,6 +26,9 @@ + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 2014ea6..046d5bc 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -5,6 +5,9 @@ + + + diff --git a/beacon-api/target/classes/bootstrap.yml b/beacon-api/target/classes/bootstrap.yml index 5ac5b35..66a912a 100644 --- a/beacon-api/target/classes/bootstrap.yml +++ b/beacon-api/target/classes/bootstrap.yml @@ -1,7 +1,3 @@ -## 端口号 -#server: -# port: 8080 - # 服务名称 spring: application: @@ -13,17 +9,9 @@ spring: cloud: nacos: discovery: - server-addr: 192.168.1.113:8848 + server-addr: 192.168.43.132:8848 # nacos配置中心地址: config: - server-addr: 192.168.1.113:8848 + server-addr: 192.168.43.132:8848 file-extension: yml # beacon-api-dev.yml - -# # rabbitMQ连接信息 -# rabbitmq: -# host: 192.168.1.113 -# port: 5672 -# username: root -# password: 19970213Dch. -# virtual-host: / diff --git a/beacon-api/target/classes/com/mashibing/ApiStarterApp.class b/beacon-api/target/classes/com/mashibing/ApiStarterApp.class index f2f367e..866e792 100644 Binary files a/beacon-api/target/classes/com/mashibing/ApiStarterApp.class and b/beacon-api/target/classes/com/mashibing/ApiStarterApp.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class b/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class index c550456..8431c2b 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class and b/beacon-api/target/classes/com/mashibing/api/controller/ApiTestController.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class index 497e668..ea43ed3 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class and b/beacon-api/target/classes/com/mashibing/api/controller/SmsController.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class b/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class deleted file mode 100644 index 9488cc7..0000000 Binary files a/beacon-api/target/classes/com/mashibing/api/enums/SmsCodeEnum.class and /dev/null differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class index 339d714..f769bc7 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class index d6d6e0d..5b7566e 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class and b/beacon-api/target/classes/com/mashibing/api/filter/CheckFilterContext.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class index cfcdf74..7ddab60 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/ApiKeyCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class index 8646feb..6624378 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/FeeCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class index 0b5b7ab..3437166 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/IPCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class index 894991d..730e032 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/MobileCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class index 6726798..12de050 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/SignCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class b/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class index 9a79574..aacefb0 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class and b/beacon-api/target/classes/com/mashibing/api/filter/impl/TemplateCheckFilter.class differ diff --git a/beacon-api/target/classes/com/mashibing/api/util/R.class b/beacon-api/target/classes/com/mashibing/api/util/R.class index 300bbe2..fa7f958 100644 Binary files a/beacon-api/target/classes/com/mashibing/api/util/R.class and b/beacon-api/target/classes/com/mashibing/api/util/R.class differ diff --git a/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class b/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class index eb444b1..cb0b734 100644 Binary files a/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class and b/beacon-api/target/test-classes/com/mashibing/api/filter/CheckFilterContextTest.class differ diff --git a/beacon-common/pom.xml b/beacon-common/pom.xml index 88d1e36..40c9404 100644 --- a/beacon-common/pom.xml +++ b/beacon-common/pom.xml @@ -26,6 +26,16 @@ spring-context 5.3.12 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.12.5 + \ No newline at end of file diff --git a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java index f04cac3..88204e0 100644 --- a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java +++ b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java @@ -25,6 +25,7 @@ public enum ExceptionEnums { ONE_MINUTE_LIMIT(-16,"1分钟限流规则生效,无法发送短信"), ONE_HOUR_LIMIT(-17,"1小时限流规则生效,无法发送短信"), NO_CHANNEL(-18,"没有选择到合适的通道"), + SEARCH_INDEX_ERROR(-19,"添加ES文档信息失败") ; private Integer code; diff --git a/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java b/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java new file mode 100644 index 0000000..b313ccd --- /dev/null +++ b/beacon-common/src/main/java/com/mashibing/common/exception/SearchException.java @@ -0,0 +1,26 @@ +package com.mashibing.common.exception; + +import com.mashibing.common.enums.ExceptionEnums; +import lombok.Getter; + +/** + * @author dch + * @create 2024-03-20 12:15 + */ +@Getter +public class SearchException extends RuntimeException { + + private Integer code; + + public SearchException(String message, Integer code) { + super(message); + this.code = code; + } + + + public SearchException(ExceptionEnums enums) { + super(enums.getMsg()); + this.code = enums.getCode(); + } + +} diff --git a/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java b/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java index bead5df..6445b00 100644 --- a/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java +++ b/beacon-common/src/main/java/com/mashibing/common/model/StandardReport.java @@ -5,6 +5,11 @@ package com.mashibing.common.model; * @create 2024-03-24 17:05 */ +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -47,6 +52,9 @@ public class StandardReport implements Serializable { /** * 短信的发送时间,当前系统时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime sendTime; /** @@ -61,10 +69,14 @@ public class StandardReport implements Serializable { /** * 回调的信息 - * */ private Integer isCallback; private String callbackUrl; + /** + * 推送报告重试的次数 + */ + private Integer resendCount = 0; + } \ No newline at end of file diff --git a/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java b/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java index b32bada..de50ea0 100644 --- a/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java +++ b/beacon-common/src/main/java/com/mashibing/common/model/StandardSubmit.java @@ -1,5 +1,10 @@ package com.mashibing.common.model; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -56,6 +61,9 @@ public class StandardSubmit implements Serializable { /** * 短信的发送时间,当前系统时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime sendTime; /** diff --git a/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java b/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java new file mode 100644 index 0000000..da8f51f --- /dev/null +++ b/beacon-common/src/main/java/com/mashibing/common/util/JsonUtil.java @@ -0,0 +1,21 @@ +package com.mashibing.common.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * @author dch + * @create 2024-03-25 22:20 + */ +public class JsonUtil { + private static ObjectMapper objectMapper = new ObjectMapper(); + + public static String obj2JSON(Object obj){ + try { + return objectMapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + e.printStackTrace(); + throw new RuntimeException("转换JSON失败!"); + } + } +} diff --git a/beacon-push/pom.xml b/beacon-push/pom.xml new file mode 100644 index 0000000..b81fba9 --- /dev/null +++ b/beacon-push/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.mashibing + beacon-cloud + 1.0-SNAPSHOT + + + beacon-push + + + 8 + 8 + UTF-8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.mashibing + beacon-common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-amqp + + + + \ No newline at end of file diff --git a/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java b/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java new file mode 100644 index 0000000..c00c9b2 --- /dev/null +++ b/beacon-push/src/main/java/com/mashibing/push/PushStarterApp.java @@ -0,0 +1,19 @@ +package com.mashibing.push; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author dch + * @create 2024-03-25 23:59 + */ +@SpringBootApplication +@EnableDiscoveryClient +public class PushStarterApp { + + public static void main(String[] args) { + SpringApplication.run(PushStarterApp.class,args); + } + +} \ No newline at end of file diff --git a/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java b/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java new file mode 100644 index 0000000..e11af5e --- /dev/null +++ b/beacon-push/src/main/java/com/mashibing/push/config/RabbitMQConfig.java @@ -0,0 +1,47 @@ +package com.mashibing.push.config; + +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author dch + * @create 2024-03-26 1:00 + */ +@Configuration +public class RabbitMQConfig { + + public static final String DELAYED_EXCHANGE = "push_delayed_exchange"; + + public static final String DELAYED_QUEUE = "push_delayed_queue"; + + private static final String DELAYED_EXCHANGE_TYPE = "x-delayed-message"; + + private static final String DELAYED_ROUTING_TYPE_KEY = "x-delayed-type"; + + private static final String DELAYED_ROUTING_TYPE_FANOUT = "fanout"; + + @Bean + public Exchange delayedExchange(){ + Map args = new HashMap<>(); + //延迟交换机的路由类型----fanout + args.put(DELAYED_ROUTING_TYPE_KEY,DELAYED_ROUTING_TYPE_FANOUT); + Exchange delayedExchange = new CustomExchange(DELAYED_EXCHANGE,DELAYED_EXCHANGE_TYPE,false,false,args); + return delayedExchange; + } + + @Bean + public Queue delayedQueue(){ + return QueueBuilder.durable(DELAYED_QUEUE).build(); + } + + @Bean + public Binding delayedBinding(Exchange delayedExchange, Queue delayedQueue){ + return BindingBuilder.bind(delayedQueue).to(delayedExchange).with("").noargs(); + } + + +} \ No newline at end of file diff --git a/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java b/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java new file mode 100644 index 0000000..0a40621 --- /dev/null +++ b/beacon-push/src/main/java/com/mashibing/push/config/RestTemplateConfig.java @@ -0,0 +1,25 @@ +package com.mashibing.push.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +/** + * @author dch + * @create 2024-03-26 0:07 + */ +@Configuration +@Slf4j +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} \ No newline at end of file diff --git a/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java b/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java new file mode 100644 index 0000000..f5a6807 --- /dev/null +++ b/beacon-push/src/main/java/com/mashibing/push/mq/PushReportListener.java @@ -0,0 +1,146 @@ +package com.mashibing.push.mq; + +import com.alibaba.cloud.commons.lang.StringUtils; +import com.mashibing.common.constant.RabbitMQConstants; +import com.mashibing.common.model.StandardReport; +import com.mashibing.common.util.JsonUtil; +import com.mashibing.push.config.RabbitMQConfig; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + + +import java.io.IOException; + +/** + * @author dch + * @create 2024-03-26 0:05 + */ +@Component +@Slf4j +public class PushReportListener { + + // 重试的时间间隔。 + private int[] delayTime = {0, 15000, 30000, 60000, 300000}; + + private final String SUCCESS = "SUCCESS"; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private RabbitTemplate rabbitTemplate; + + + /** + * 监控策略模块推送过来的消息(暂时是策略) + * + * @param report + * @param channel + * @param message + * @throws IOException + */ + @RabbitListener(queues = RabbitMQConstants.SMS_PUSH_REPORT) + public void consume(StandardReport report, Channel channel, Message message) throws IOException { + //1、获取客户的回调地址 + String callbackUrl = report.getCallbackUrl(); + if (StringUtils.isEmpty(callbackUrl)) { + log.info("【推送模块-推送状态报告】 客户方没有设置回调的地址信息!callbackUrl = {} ", callbackUrl); + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + return; + } + + //2、发送状态报告 + boolean flag = pushReport(report); + + //3、如果发送失败,重试 + isResend(report, flag); + + //4、直接手动ack + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + + /** + * 监听延迟交换机路由过来的消息 + * + * @param report + * @param channel + * @param message + * @throws IOException + */ + @RabbitListener(queues = RabbitMQConfig.DELAYED_QUEUE) + public void delayedConsume(StandardReport report, Channel channel, Message message) throws IOException { + // 1、发送状态报告 + boolean flag = pushReport(report); + + // 2、判断状态报告发送情况 + isResend(report, flag); + + // 手动ack + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + + /** + * 发送请求,给callbackUrl + * + * @param report + * @return + */ + private boolean pushReport(StandardReport report) { + // 声明返回结果,你默认为false + boolean flag = false; + + //1、声明发送的参数 + String body = JsonUtil.obj2JSON(report); + + //2、声明RestTemplate的模板代码 + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + try { + log.info("【推送模块-推送状态报告】 第{}次推送状态报告开始!report = {}", report.getResendCount() + 1, report); + String result = restTemplate.postForObject("http://" + report.getCallbackUrl(), new HttpEntity<>(body, httpHeaders), String.class); + flag = SUCCESS.equals(result); + } catch (RestClientException e) { + } + //3、得到响应后,确认是否为SUCCESS + return flag; + } + + /** + * 判断状态报告是否推送成功,失败的话需要发送重试消息 + * + * @param report + * @param flag + */ + private void isResend(StandardReport report, boolean flag) { + if (!flag) { + log.info("【推送模块-推送状态报告】 第{}次推送状态报告失败!report = {}", report.getResendCount() + 1, report); + report.setResendCount(report.getResendCount() + 1); + rabbitTemplate.convertAndSend(RabbitMQConfig.DELAYED_EXCHANGE, "", report, new MessagePostProcessor() { + @Override + public Message postProcessMessage(Message message) throws AmqpException { + // 设置延迟时间 + message.getMessageProperties().setDelay(delayTime[report.getResendCount()]); + return message; + } + }); + } else { + log.info("【推送模块-推送状态报告】 第一次推送状态报告成功!report = {}", report); + } + } + + +} \ No newline at end of file diff --git a/beacon-push/src/main/resources/bootstrap.yml b/beacon-push/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..3ddf537 --- /dev/null +++ b/beacon-push/src/main/resources/bootstrap.yml @@ -0,0 +1,17 @@ +# 服务名称 +spring: + application: + name: beacon-push + # 多环境 + profiles: + active: dev + # nacos注册中心地址 + cloud: + nacos: + discovery: + server-addr: 192.168.43.132:8848 + # nacos配置中心地址: + config: + server-addr: 192.168.43.132:8848 + file-extension: yml + # beacon-push-dev.yml \ No newline at end of file diff --git a/beacon-search/pom.xml b/beacon-search/pom.xml new file mode 100644 index 0000000..1e57913 --- /dev/null +++ b/beacon-search/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + com.mashibing + beacon-cloud + 1.0-SNAPSHOT + + + beacon-search + + + 8 + 8 + UTF-8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.mashibing + beacon-common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-amqp + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.6.2 + + + org.elasticsearch + elasticsearch + 7.6.2 + + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java b/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java new file mode 100644 index 0000000..92af7ec --- /dev/null +++ b/beacon-search/src/main/java/com/mashibing/search/SearchStarterApp.java @@ -0,0 +1,18 @@ +package com.mashibing.search; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author dch + * @create 2024-03-25 20:43 + */ +@SpringBootApplication +@EnableDiscoveryClient +public class SearchStarterApp { + + public static void main(String[] args) { + SpringApplication.run(SearchStarterApp.class,args); + } +} \ No newline at end of file diff --git a/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java b/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java new file mode 100644 index 0000000..ad2163a --- /dev/null +++ b/beacon-search/src/main/java/com/mashibing/search/config/RestHighLevelClientConfig.java @@ -0,0 +1,57 @@ +package com.mashibing.search.config; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * @author dch + * @create 2024-03-25 21:02 + */ +@Configuration +public class RestHighLevelClientConfig { + + @Value("#{'${elasticsearch.hostAndPorts}'.split(',')}") + private List hostAndPorts; + + @Value("${elasticsearch.username:elastic}") + private String username; + + + @Value("${elasticsearch.password}") + private String password; + + @Bean + public RestHighLevelClient restHighLevelClient(){ + // 初始化连接ES的HttpHost信息 + HttpHost[] httpHosts = new HttpHost[hostAndPorts.size()]; + for (int i = 0; i < hostAndPorts.size(); i++) { + String[] hostAndPort = hostAndPorts.get(i).split(":"); + httpHosts[i] = new HttpHost(hostAndPort[0],Integer.parseInt(hostAndPort[1])); + } + + // 设置认证信息 + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(username,password)); + + // 构建时设置连接信息,基于set设置认证信息 + RestClientBuilder restClientBuilder = RestClient.builder(httpHosts); + restClientBuilder.setHttpClientConfigCallback(f -> f.setDefaultCredentialsProvider(credentialsProvider)); + + // 构建连接ES的client对象 + RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder); + + // 返回 + return restHighLevelClient; + } +} \ No newline at end of file diff --git a/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java b/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java new file mode 100644 index 0000000..d482c66 --- /dev/null +++ b/beacon-search/src/main/java/com/mashibing/search/mq/SmsWriteLogListener.java @@ -0,0 +1,46 @@ +package com.mashibing.search.mq; + +import com.mashibing.common.constant.RabbitMQConstants; +import com.mashibing.common.model.StandardSubmit; +import com.mashibing.common.util.JsonUtil; +import com.mashibing.search.service.SearchService; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.time.LocalDateTime; + +/** + * @author dch + * @create 2024-03-25 21:16 + */ +@Component +@Slf4j +public class SmsWriteLogListener { + + @Autowired + private SearchService searchService; + + private final String INDEX = "sms_submit_log_"; + + + @RabbitListener(queues = RabbitMQConstants.SMS_WRITE_LOG) + public void consume(StandardSubmit submit, Channel channel, Message message) throws IOException { + //1、调用搜索模块的添加方法,完成添加操作 + log.info("接收到存储日志的信息 submit = {}",submit); + searchService.index(INDEX + getYear(),submit.getSequenceId().toString(), JsonUtil.obj2JSON(submit)); + + //2、手动ack + channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); + } + + + public String getYear(){ + return LocalDateTime.now().getYear() + ""; + } + +} \ No newline at end of file diff --git a/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java b/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java new file mode 100644 index 0000000..f3a63da --- /dev/null +++ b/beacon-search/src/main/java/com/mashibing/search/service/SearchService.java @@ -0,0 +1,18 @@ +package com.mashibing.search.service; + +import java.io.IOException; + +/** + * @author dch + * @create 2024-03-25 21:34 + */ +public interface SearchService { + /** + * 向ES中添加一行文档 + * + * @param index 索引信息 + * @param id 文档id + * @param json 具体的文档内容 + */ + void index(String index, String id, String json) throws IOException; +} diff --git a/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java b/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java new file mode 100644 index 0000000..66e3aab --- /dev/null +++ b/beacon-search/src/main/java/com/mashibing/search/service/impl/ElasticsearchServiceImpl.java @@ -0,0 +1,55 @@ +package com.mashibing.search.service.impl; + + +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.SearchException; +import com.mashibing.search.service.SearchService; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.xcontent.XContentType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * @author dch + * @create 2024-03-25 21:34 + */ +@Service +@Slf4j +public class ElasticsearchServiceImpl implements SearchService { + /** + * 添加成功的result + */ + private final String CREATED = "created"; + + @Autowired + private RestHighLevelClient restHighLevelClient; + + @Override + public void index(String index, String id, String json) throws IOException { + //1、构建插入数据的Request + IndexRequest request = new IndexRequest(); + + //2、给request对象封装索引信息,文档id,以及文档内容 + request.index(index); + request.id(id); + request.source(json, XContentType.JSON); + + //3、将request信息发送给ES服务 + IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT); + + //4、校验添加是否成功 + String result = response.getResult().getLowercase(); + if(!CREATED.equals(result)){ + // 添加失败!! + log.error("【搜索模块-写入数据失败】 index = {},id = {},json = {},result = {}",index,id,json,result); + throw new SearchException(ExceptionEnums.SEARCH_INDEX_ERROR); + } + log.info("【搜索模块-写入数据成功】 索引添加成功index = {},id = {},json = {},result = {}",index,id,json,result); + } +} \ No newline at end of file diff --git a/beacon-search/src/main/resources/bootstrap.yml b/beacon-search/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..74d12b7 --- /dev/null +++ b/beacon-search/src/main/resources/bootstrap.yml @@ -0,0 +1,17 @@ +# 服务名称 +spring: + application: + name: beacon-search + # 多环境 + profiles: + active: dev + # nacos注册中心地址 + cloud: + nacos: + discovery: + server-addr: 192.168.43.132:8848 + # nacos配置中心地址: + config: + server-addr: 192.168.43.132:8848 + file-extension: yml + # beacon-search-dev.yml \ No newline at end of file diff --git a/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java b/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java new file mode 100644 index 0000000..2f6deb0 --- /dev/null +++ b/beacon-search/src/test/java/com/mashibing/search/service/SearchServiceTest.java @@ -0,0 +1,28 @@ +package com.mashibing.search.service; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; + +import static org.junit.Assert.*; + +/** + * @author dch + * @create 2024-03-25 21:49 + */ +@SpringBootTest +@RunWith(SpringRunner.class) +public class SearchServiceTest { + + @Autowired + private SearchService searchService; + + @Test + public void index() throws IOException { + searchService.index("sms_submit_log_2024","1","{\"clientId\":1}"); + } +} \ No newline at end of file diff --git a/beacon-smsgateway/pom.xml b/beacon-smsgateway/pom.xml new file mode 100644 index 0000000..a47bbc1 --- /dev/null +++ b/beacon-smsgateway/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.mashibing + beacon-cloud + 1.0-SNAPSHOT + + + beacon-smsgateway + 短信网关模块的模板 + + + 8 + 8 + UTF-8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.mashibing + beacon-common + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-amqp + + + + \ No newline at end of file diff --git a/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java new file mode 100644 index 0000000..7a40373 --- /dev/null +++ b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/SmsGatewayStarterApp.java @@ -0,0 +1,17 @@ +package com.mashibing.smsgateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * @author dch + * @create 2024-03-26 2:01 + */ +@EnableDiscoveryClient +@SpringBootApplication +public class SmsGatewayStarterApp { + public static void main(String[] args) { + SpringApplication.run(SmsGatewayStarterApp.class, args); + } +} diff --git a/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java new file mode 100644 index 0000000..cbf665a --- /dev/null +++ b/beacon-smsgateway/src/main/java/com/mashibing/smsgateway/mq/SmsGatewayListener.java @@ -0,0 +1,29 @@ +package com.mashibing.smsgateway.mq; + +import com.mashibing.common.model.StandardSubmit; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * @author dch + * @create 2024-03-26 2:12 + */ +@Component +@Slf4j +public class SmsGatewayListener { + + @RabbitListener(queues = "${gateway.sendtopic}") + public void consume(StandardSubmit submit, Channel channel, Message message) throws IOException, InterruptedException { + log.info("【短信网关模块】 接收到消息 submit = {}", submit); + // =====================完成运营商交互,发送一次请求,接收两次响应========================== + + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } + + +} \ No newline at end of file diff --git a/beacon-smsgateway/src/main/resources/bootstrap.yml b/beacon-smsgateway/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..07b78bb --- /dev/null +++ b/beacon-smsgateway/src/main/resources/bootstrap.yml @@ -0,0 +1,16 @@ +# 服务名称 +spring: + application: + name: beacon-smsgateway + # 多环境 + profiles: + active: dev + # nacos注册中心地址 + cloud: + nacos: + discovery: + server-addr: 192.168.43.132:8848 + # nacos配置中心地址: + config: + server-addr: 192.168.43.132:8848 + file-extension: yml \ No newline at end of file diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java index 12b9060..ad57ea0 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitTemplateConfig.java @@ -37,7 +37,7 @@ public class RabbitTemplateConfig { public void confirm(CorrelationData correlationData, boolean ack, String cause) { // ack为false,代表消息没有发送到exchange。 if(!ack){ - log.error("【接口模块-发送消息】 消息没有发送到交换机,correlationData = {},cause = {}",correlationData,cause); + log.error("【策略模块-发送消息】 消息没有发送到交换机,correlationData = {},cause = {}",correlationData,cause); } } }); @@ -48,7 +48,7 @@ public class RabbitTemplateConfig { // 触发这个回调,说明交换机没有把消息路由到指定的队列中 @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { - log.error("【接口模块-发送消息】 消息没有路由到指定的Queue。 message = {},exchange = {},routingKey = {}", + log.error("【策略模块-发送消息】 消息没有路由到指定的Queue。 message = {},exchange = {},routingKey = {}", new String(message.getBody()),exchange,routingKey); } }); diff --git a/pom.xml b/pom.xml index 50d13e5..a5dddbe 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,9 @@ beacon-cache beacon-test beacon-strategy + beacon-search + beacon-push + beacon-smsgateway