dengsixing 3 年之前
當前提交
9c4d5c413f

+ 134 - 0
pom.xml

@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.12.RELEASE</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>com.fdkankan</groupId>
+  <artifactId>service-monitor</artifactId>
+  <version>2.0.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <repositories>
+    <repository>
+      <id>releases</id>
+      <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
+    </repository>
+    <repository>
+      <id>snapshots</id>
+      <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
+    </repository>
+    <repository>
+      <id>nexus-aliyun</id>
+      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+    </repository>
+  </repositories>
+
+  <properties>
+    <java.version>1.8</java.version>
+    <spring.cloud-version>Hoxton.SR8</spring.cloud-version>
+    <fastjson-version>1.2.79</fastjson-version>
+    <spring-boot-admin.version>2.3.1</spring-boot-admin.version>
+  </properties>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>de.codecentric</groupId>
+      <artifactId>spring-boot-admin-starter-server</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>${fastjson-version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+
+
+  </dependencies>
+
+  <dependencyManagement>
+
+    <dependencies>
+
+      <dependency>
+        <groupId>de.codecentric</groupId>
+        <artifactId>spring-boot-admin-dependencies</artifactId>
+        <version>${spring-boot-admin.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>com.alibaba.cloud</groupId>
+        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+        <version>2.2.7.RELEASE</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>org.springframework.cloud</groupId>
+        <artifactId>spring-cloud-dependencies</artifactId>
+        <version>${spring.cloud-version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
+    </dependencies>
+  </dependencyManagement>
+
+
+
+  <build>
+
+    <pluginManagement>
+      <plugins>
+          <plugin>
+              <groupId>org.springframework.boot</groupId>
+              <artifactId>spring-boot-maven-plugin</artifactId>
+          </plugin>
+      </plugins>
+    </pluginManagement>
+
+  </build>
+
+  <distributionManagement>
+    <repository>
+      <id>releases</id>
+      <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
+    </repository>
+
+    <snapshotRepository>
+      <id>snapshots</id>
+      <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
+    </snapshotRepository>
+  </distributionManagement>
+
+</project>

+ 25 - 0
src/main/java/com/fdkankan/admin/MonitorApplication.java

@@ -0,0 +1,25 @@
+package com.fdkankan.admin;
+
+import com.fdkankan.admin.dingtalk.DingDingNotifier;
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+@EnableAdminServer
+@EnableDiscoveryClient
+public class MonitorApplication {
+
+    @Bean
+    public DingDingNotifier dingDingNotifier(InstanceRepository repository) {
+        return new DingDingNotifier(repository);
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(MonitorApplication.class, args);
+    }
+
+}

+ 49 - 0
src/main/java/com/fdkankan/admin/dingtalk/DingDingMessageUtil.java

@@ -0,0 +1,49 @@
+package com.fdkankan.admin.dingtalk;
+
+import com.alibaba.fastjson.JSONObject;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/31
+ **/
+public class DingDingMessageUtil {
+    public static String access_token = "07808669459042bba12ee8aa929bf8c7455600968fde40f8826917e0c3bf728e";
+    public static String keywords = "aaa";
+    public static void sendTextMessage(String msg) {
+        try {
+            Message message = new Message();
+            message.setMsgtype("text");
+            message.setText(new MessageInfo(msg));
+            URL url = new URL("https://oapi.dingtalk.com/robot/send?access_token=" + access_token + "&keywords=" + keywords);
+            // 建立 http 连接
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            conn.setUseCaches(false);
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Charset", "UTF-8");
+            conn.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");
+            conn.connect();
+            OutputStream out = conn.getOutputStream();
+            String textMessage = JSONObject.toJSONString(message);
+            byte[] data = textMessage.getBytes();
+            out.write(data);
+            out.flush();
+            out.close();
+            InputStream in = conn.getInputStream();
+            byte[] data1 = new byte[in.available()];
+            in.read(data1);
+            System.out.println(new String(data1));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 40 - 0
src/main/java/com/fdkankan/admin/dingtalk/DingDingNotifier.java

@@ -0,0 +1,40 @@
+package com.fdkankan.admin.dingtalk;
+
+import com.alibaba.fastjson.JSONObject;
+import de.codecentric.boot.admin.server.domain.entities.Instance;
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
+import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
+import java.util.Map;
+import reactor.core.publisher.Mono;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/31
+ **/
+public class DingDingNotifier extends AbstractStatusChangeNotifier {
+    public DingDingNotifier(InstanceRepository repository) {
+        super(repository);
+    }
+    @Override
+    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
+        String serviceName = instance.getRegistration().getName();
+        String serviceUrl = instance.getRegistration().getServiceUrl();
+        String status = instance.getStatusInfo().getStatus();
+        Map<String, Object> details = instance.getStatusInfo().getDetails();
+        StringBuilder str = new StringBuilder();
+        str.append("监控报警");
+        str.append("\n服务名称:"+ serviceName );
+        str.append("\n服务地址:" + serviceUrl);
+        str.append("\n状态:" + status);
+        str.append("\n详情:" + JSONObject.toJSONString(details));
+        str.append("\nkeywords:aaa");
+        return Mono.fromRunnable(() -> {
+            DingDingMessageUtil.sendTextMessage(str.toString());
+        });
+    }
+}

+ 26 - 0
src/main/java/com/fdkankan/admin/dingtalk/Message.java

@@ -0,0 +1,26 @@
+package com.fdkankan.admin.dingtalk;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/31
+ **/
+public class Message {
+    private String msgtype;
+    private MessageInfo text;
+    public String getMsgtype() {
+        return msgtype;
+    }
+    public void setMsgtype(String msgtype) {
+        this.msgtype = msgtype;
+    }
+    public MessageInfo getText() {
+        return text;
+    }
+    public void setText(MessageInfo text) {
+        this.text = text;
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/admin/dingtalk/MessageInfo.java

@@ -0,0 +1,22 @@
+package com.fdkankan.admin.dingtalk;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/31
+ **/
+public class MessageInfo {
+    private String content;
+    public MessageInfo(String content) {
+        this.content = content;
+    }
+    public String getContent() {
+        return content;
+    }
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

+ 57 - 0
src/main/java/com/fdkankan/admin/security/SecuritySecureConfig.java

@@ -0,0 +1,57 @@
+package com.fdkankan.admin.security;
+
+import de.codecentric.boot.admin.server.config.AdminServerProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/31
+ **/
+@Configuration
+public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
+
+    private final String adminContextPath;
+
+    public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
+        this.adminContextPath = adminServerProperties.getContextPath();
+    }
+
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        // 登录成功处理类
+        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
+        successHandler.setTargetUrlParameter("redirectTo");
+        successHandler.setDefaultTargetUrl(adminContextPath + "/");
+
+        http.authorizeRequests()
+            //静态文件允许访问
+            .antMatchers(adminContextPath + "/assets/**").permitAll()
+            //登录页面允许访问
+            .antMatchers(adminContextPath + "/login","/css/**","/js/**","/image/*").permitAll()
+            //其他所有请求需要登录
+            .anyRequest().authenticated()
+            .and()
+            //登录页面配置,用于替换security默认页面
+            .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
+            //登出页面配置,用于替换security默认页面
+            .logout().logoutUrl(adminContextPath + "/logout").and()
+            .httpBasic().and()
+            .csrf()
+            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
+            .ignoringAntMatchers(
+                "/instances",
+                "/actuator/**"
+            );
+
+    }
+
+}

+ 16 - 0
src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,16 @@
+spring:
+  application:
+    name: service-monitor
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: service-monitor.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev

+ 16 - 0
src/main/resources/bootstrap-pro.yml

@@ -0,0 +1,16 @@
+spring:
+  application:
+    name: service-monitor
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: service-monitor.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: public

+ 16 - 0
src/main/resources/bootstrap-test.yml

@@ -0,0 +1,16 @@
+spring:
+  application:
+    name: service-monitor
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: service-monitor.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-test

+ 16 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,16 @@
+spring:
+  application:
+    name: service-monitor
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: service-monitor.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev