k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

news2024/11/24 5:41:00

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

大纲

  • 1 镜像制作
  • 2 准备configmap
  • 3 准备deploy 部署文件
  • 4 部署seata到k8s

镜像制作

下载seata 选择1.6.0。下载后得到 seata-server-1.6.0.zip 已经上传到百度云盘

下载地址:http://seata.io/zh-cn/blog/download.html

使用unzip 解压 seata-server-1.6.0.zip

unzip seata-server-1.6.0.zip

解压后得到如下文件夹

在这里插入图片描述

seata文件夹内部包含

  • Dockerfile 创建docker镜像的文件
  • LICENSE
  • bin seata启动脚本
  • conf seata配置
  • ext 性能监控
  • lib 依赖的jar包
  • logs 日志放置位置
  • script 一些脚本 例如数据库脚本 k8s脚本
  • target seata程序所在包 脚本最终会执行 seata-server.jar

可以直接Dockerfile来创建镜像

docker build -t my-seata-server .
docker tag my-seata-server registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0
docker push registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0

在这里插入图片描述

创建好镜像后推送到私库备用

准备configmap

注意:

  • 1 也可以不使用configmap 因为seata1.6.0无法reload配置文件
  • 2 假定mysql数据库配置以及nacos配置以完成,

关于nacos 与 mysql配置可参考
可参考 《seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库》

如果要实现配置文件修改后自动重启,可以使用linux-inotify监听文件变化后重启
可参考 《linux-inotify工具监控文件状态变化总结》
《k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结》

准备两个configmap

  • 1 保存seata application 配置文件 (configmap-for-server.yaml)
  • 2 保存seata logback 配置文件 (configmap-for-logger.yaml)

主要是把 application.yml logback-spring.xml 和 logback文件夹中的配置文件交由configmap管理

在这里插入图片描述

configmap-for-server.yaml 内容如下 保存server相关配置文件

# 将配置放置在configmap中统一管理
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-config
data:
  application.yml: |
    server:
      port: 17091 #修改控制台端口
    
    spring:
      application:
        name: seata-server
    
    logging:
      config: classpath:logback-spring.xml
      file:
        path: ${user.home}/logs/seata
      extend:
        logstash-appender:
          destination: 127.0.0.1:4560
        kafka-appender:
          bootstrap-servers: 127.0.0.1:9092
          topic: logback_to_logstash
    
    console:
      user:
        username: seata
        password: seata
    
    seata:
      config:
        type: nacos
        nacos:
          server-addr: 192.168.0.206:8248
          namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
          group: DEFAULT_GROUP
          data-id: seata.properties      
          #username:  
          #password: 
      registry:
        type: nacos
        nacos:  
          application: seata-server
          server-addr: 192.168.0.206:8248
          namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
          group: DEFAULT_GROUP
          cluster: default
          #username:  
          #password: 
      security:
        secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
        tokenValidityInMilliseconds: 1800000
        ignore:
          urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

  logback-spring.xml: | 
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- Context listeners -->
        <contextListener class="io.seata.server.logging.listener.SystemPropertyLoggerContextListener"/>
    
        <!-- The conversion rules are copied from `defaults.xml` in the `spring-boot-xxx.jar` -->
        <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
        <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
        <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
        <!-- The custom conversion rules -->
        <conversionRule conversionWord="wEx2" converterClass="io.seata.server.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    
        <!-- common properties -->
        <springProperty name="PORT" source="server.port" defaultValue="7091"/>
        <springProperty name="APPLICATION_NAME" source="spring.application.name" defaultValue="seata-server"/>
    
    
        <!-- console-appender -->
        <include resource="logback/console-appender.xml"/>
    
        <!-- file-appender -->
        <include resource="logback/file-appender.xml"/>
    
        <!-- logstash-appender: off by default -->
        <!--<include resource="logback/logstash-appender.xml"/>-->
    
        <!-- kafka-appender: off by default -->
        <!--<include resource="logback/kafka-appender.xml"/>-->
    
        <root level="INFO">
            <!-- console-appender -->
            <appender-ref ref="CONSOLE"/>
    
            <!-- file-appender -->
            <appender-ref ref="FILE_ALL"/>
            <appender-ref ref="FILE_WARN"/>
            <appender-ref ref="FILE_ERROR"/>
    
            <!-- logstash-appender: off by default -->
            <!--<appender-ref ref="LOGSTASH"/>-->
    
            <!-- kafka-appender: off by default -->
            <!--<appender-ref ref="KAFKA"/>-->
        </root>
    </configuration>

configmap-for-logger.yaml 内容如下 保存logback相关配置文件 (注意 kafka-appender.xml logstash-appender.xml 并没有使用 这里为了演示统一也加入了管理

# 将配置放置在configmap中统一管理
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-log-config
data:  
  console-appender.xml: |  
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- console-appender properties -->
        <springProperty name="CONSOLE_LOG_PATTERN" source="logging.pattern.console"
                        defaultValue="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%25.25t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx2"/>
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    </included>  
    
    
    
  file-appender.xml: |
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- file-appender properties -->
        <springProperty name="LOG_FILE_PATH" source="logging.file.path"
                        defaultValue="${user.home}/logs/seata"/>
        <springProperty name="FILE_LOG_PATTERN" source="logging.pattern.file"
                        defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%30.30t] %-40.40logger{39} : %m%n%wEx2"/>
    
        <!--ALL-->
        <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!--WARN-->
        <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!--ERROR-->
        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    </included>      
    
    
  kafka-appender.xml: |
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- kafka-appender properties -->
        <springProperty name="KAFKA_BOOTSTRAP_SERVERS" source="logging.extend.kafka-appender.bootstrap-servers"
                        defaultValue="127.0.0.1:9092"/>
        <springProperty name="KAFKA_TOPIC" source="logging.extend.kafka-appender.topic"
                        defaultValue="logback_to_logstash"/>
    
        <appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender">
            <encoder>
                <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%p|${APPLICATION_NAME:-seata-server}|${RPC_PORT:-0}|%t|%logger|%X{X-TX-XID:-}|%X{X-TX-BRANCH-ID:-}|%m|%wex</pattern>-->
                <pattern>{
        "@timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
        "level":"%p",
        "app_name":"${APPLICATION_NAME:-seata-server}",
        "PORT": ${RPC_PORT:-0},
        "thread_name": "%t",
        "logger_name": "%logger",
        "X-TX-XID": "%X{X-TX-XID:-}",
        "X-TX-BRANCH-ID": "%X{X-TX-BRANCH-ID:-}",
        "message": "%m",
        "stack_trace": "%wex"
    }
                </pattern>
            </encoder>
            <topic>${KAFKA_TOPIC}</topic>
            <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy"/>
            <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
            <producerConfig>bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS}</producerConfig>
            <producerConfig>acks=0</producerConfig>
            <producerConfig>linger.ms=1000</producerConfig>
            <producerConfig>max.block.ms=0</producerConfig>
        </appender>
    </included>   
    

  logstash-appender.xml: |   
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- logstash-appender properties -->
        <springProperty name="LOGSTASH_DESTINATION" source="logging.extend.logstash-appender.destination"
                        defaultValue="127.0.0.1:4560"/>
    
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <!-- the TCP address of the logstash -->
            <destination>${LOGSTASH_DESTINATION}</destination>
    
            <!--<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">-->
            <encoder charset="UTF-8" class="io.seata.server.logging.logback.appender.EnhancedLogstashEncoder">
                <!-- the global custom fields -->
                <customFields>
                    {
                        "app_name": "${APPLICATION_NAME:-seata-server}"
                    }
                </customFields>
    
                <!-- Exclude the provider of data `@version` -->
                <excludeProvider>net.logstash.logback.composite.LogstashVersionJsonProvider</excludeProvider>
                <!-- Exclude providers that are not currently needed, reduce some performance loss. -->
                <excludeProvider>net.logstash.logback.composite.loggingevent.JsonMessageJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.TagsJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider</excludeProvider>
            </encoder>
        </appender>
    </included>  

准备deploy 部署文件

准备部署两个seata服务来实现集群

由于业务服务部署在k8s集群外部无法访问k8s集群内部ip,seata注册到nacos需要使用独立的主机ip, 所以需要两个Deployment来部署seata 无法直接使用 --replicas=2

如果业务服务,nacos ,seata 都在k8s集群内部 ,则直接使用一个Deployment 指定–replicas=2

deploy.yaml 内容如下

# deploy1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server-deploy-1
  labels:
    k8s-app: seata-server-1
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-seata-node1: node1
  template:
    metadata:
      labels:
        k8s-seata-node1: node1
        k8s-app: seata-server
    spec:
      imagePullSecrets:
        - name: myaliyunsecret
      containers:
        - name: seata-server-run
          image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0  #使用开始创建的镜像
          env: 
            - name: SEATA_IP   #环境变量中配置一个IP 用于注册中心
              value: "192.168.0.54"
            - name: SERVER_NODE  #指定seata-server节点ID, 默认为 根据ip生成 (可以不配置)
              value: "1"
            - name: SEATA_PORT   
              value: "5959"  #注意环境变量中是数字也需要使用“”
          volumeMounts:
            - name: seata-config
              mountPath: /seata-server/conf   #使用configMap挂载配置文件
            - name: seata-log-config
              mountPath: /seata-server/conf/logback  #使用configMap挂载配置文件
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
        - name: seata-log-config
          configMap:
            name: seata-server-log-config     


---


# deploy2
apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server-deploy-2
  labels:
    k8s-app: seata-server-2
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-seata-node2: node2
  template:
    metadata:
      labels:
        k8s-seata-node2: node2
        k8s-app: seata-server
    spec:
      imagePullSecrets:
        - name: myaliyunsecret
      containers:
        - name: seata-server-run
          image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0  #使用开始创建的镜像
          env: 
            - name: SEATA_IP   #环境变量中配置一个IP 用于注册中心
              value: "192.168.0.124"
            - name: SERVER_NODE  #指定seata-server节点ID, 默认为 根据ip生成 (可以不配置)
              value: "2"
            - name: SEATA_PORT   
              value: "5959"  #注意环境变量中是数字也需要使用“”
          volumeMounts:
            - name: seata-config
              mountPath: /seata-server/conf   #使用configMap挂载配置文件
            - name: seata-log-config
              mountPath: /seata-server/conf/logback  #使用configMap挂载配置文件
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
        - name: seata-log-config
          configMap:
            name: seata-server-log-config
            
 
---  
            

# service 
apiVersion: v1
kind: Service
metadata:
  name: seata-server
  labels:
    k8s-app: seata-server
spec:
  type: NodePort
  ports:
    - port: 5959
      nodePort: 5959
      targetPort: 5959
      protocol: TCP
      name: http1
    - port: 17091
      nodePort: 17091  #for seata 控制台
      targetPort: 17091
      protocol: TCP
      name: http2  
  selector:
    k8s-app: seata-server

部署seata到k8s

kubectl apply -f configmap-for-logger.yaml
kubectl apply -f configmap-for-server.yaml
kubectl apply -f deploy.yaml

在这里插入图片描述

在nacos上可以看到 seata已经成功注册

在这里插入图片描述

控制台可以正常访问

在这里插入图片描述

启动seata 容器时注意关注k8s内是否有LimitRange限制,seata默认启动使用1G内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven 依赖下载失败解决方案——配置国内源 + 具体解决办法

目录 前言 一、配置 Maven 国内源 二、重新下载jar包 三、其他问题 前言 最近发现 spring-boot 框架更新到 2.7.11 了&#xff0c;由于以前一直使用的是 2.7.9 &#xff0c;所以一直出现依赖下载失败的问题&#xff0c;实际上这是由于 IDEA 会先加载之前下载好的依赖&#xf…

openharmony内核中不一样的双向链表

不一样的双向链表 链表初识别遍历双向链表参考链接 链表初识别 最近看openharmony的内核源码时看到一个有意思的双向链表&#xff0c;结构如下 typedef struct LOS_DL_LIST{struct LOS_DL_LIST *pstPrev; //前驱节点struct LOS_DL_LIST *pstNext; //后继节点 }LOS_DL_LIST;不…

FPGA入门系列12--RAM的使用

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

Spring IOC DI - 整合MyBatis

Spring IOC目录 主要内容Spring 框架介绍Spring 框架的优势(对比以前项目的缺点)Spring 框架引入历史发展框架学习三要素Spring 模块介绍 Spring IoC/DI - 引入IoC/DI 概念辨析使用IoC/DI的好处IoC/DI具体应用场景 Spring IoC/DI - 代码实现环境准备Spring 框架环境搭建创建Mav…

图的遍历和应用

文章目录 图的遍历深度优先遍历对于无向图的邻接矩阵的深度优先遍历无向非连通图的深度优先遍历 对于无向图的邻接表的深度优先遍历非递归实现深度优先遍历无向图的邻接矩阵代码实现无向图的邻接表代码实现递归和非递归的同异 广度优先遍历邻接表BFS邻接矩阵BFS 图的应用生成树…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中&#xff0c;相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新&#xff0c;android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等&#xff1b;遇到这个功能需求&#xff0c;大家肯定会想&#xff0c;“这还不好写&…

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法

二氧化碳地质封存技术起步较晚&#xff0c;目前仍没有一套相对完整的行业规范&#xff1b;且就该技术而言&#xff0c;涉及环节众多&#xff0c;理论相对复杂&#xff0c;对于行业的新入局者不太友好。因此&#xff0c;结合时代背景&#xff0c;我们首次尝试对二氧化碳地质封存…

【裸金属服务器】安装VMware ESXi

官方安装操作ESXi地址 一、虚拟化服务器分类&#xff1a; 寄居架构&#xff08;Hosted Architecture&#xff09;和裸金属架构&#xff08;Bare Metal Architecture&#xff09;。 1、寄居架构&#xff08;Hosted Architecture&#xff09;&#xff1a;在操作系统之上安装和运…

8.系统日志

1.api访问日志 对应数据库 拦截器 拦截逻辑 ApiAccessLogFilter类的createApiAccessLog方法 buildApiAccessLogDTO方法就是完善实体类&#xff0c;把接口执行时长之类的填充完整。 然后就是保存日志到infra_api_access_log数据库。 过滤器注册生效 2.api错误日志 对应数…

Windows 程序开机自启动速度优化,为什么腾讯会议自启动速度那么高?

目录 一、问题的说明和定义 二、问题的分析 1.问题初步分析 2.详细的分析&#xff1a; 2.1Windows常见的自启动方式 2.2Windows常见的自启动方式的细节分析 三、问题的解决方案 1、为什么腾讯会议Rooms那么快 2.我们是否可以跟腾讯会议一样快 一、问题的说明和定义 这…

Vue之插件的定义和使用

概述 学习本文之前&#xff0c;我们需要弄清楚何为插件&#xff1f;插件其实就是一段扩展程序&#xff0c;主要目的是用于扩展功能。就比如Idea家族和VSCode家族的插件&#xff0c;它们也是一段扩展程序&#xff0c;将其安装到IDE中就可以使用插件里面实现的功能了&#xff0c…

SCADA平台的HMI功能

01 前言 虹科Panorama SCADA平台支持桌面HMI、Web HMI和移动HMI的功能。桌面HMI主要是在桌面工作站实现数据可视化&#xff0c;能够获取到最全面的数据信息以及实现功能&#xff1b;Web HMI可以通过在软件中添加Web HMI服务器&#xff0c;运行程序后&#xff0c;可以在Web 客户…

HTML5基础知识总结总结(详细,附带源代码)

HTML5基础知识 一&#xff1a;前言二&#xff1a; HTML基本结构。三&#xff1a;基本标签3.1 h标签3.2 p标签3.3 hr标签3.4 br标签3.5 strong标签与em标签3.6 特殊符号3.7 运行效果 三&#xff1a;图像标签四&#xff1a;链接标签五&#xff1a;列表六&#xff1a;表格七&#…

Allegro PCB后处理和生产文件导出

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。部分是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xf…

【15】SCI易中期刊推荐——电子电气 | 仪器仪表(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

[NISACTF 2022]level-up

[NISACTF 2022]level-up f12 发现提示disallow 也就是不允许的想到robots.txt LEVEL_2 <?php //here is level 2 error_reporting(0); #屏蔽报错信息 include "str.php"; #包含str.php这个页面 if (isset($_POST[array1]) && isset($_POST[arr…

巧用千寻位置GNSS软件|如何快速完成道路桥涵放样

道路桥涵放样主要解决道路施工中正交、斜交涵洞的测量&#xff0c;正交涵洞放样是中心线的定线放样&#xff1b;斜交涵洞放养是涵洞中心线与线路成一固定夹角的情况下的放样。 那么如何运用千寻位置GNSS软件实现道路桥涵放样呢&#xff1f;下面为各位一一介绍。 点击【测量】-&…

【移动端网页布局】移动端网页布局基础概念 ⑨ ( webkit 内核 | 移动端网页 CSS 初始化 - normalize.css )

文章目录 一、webkit 内核二、移动端网页 CSS 初始化 - normalize.css 一、webkit 内核 移动端浏览器 都是 基于 webkit 内核的 , QQ 浏览器 / 百度 / Safari / UC 都是基于 webkit 内核的 ; 移动端网页布局需要 兼容 普通浏览器 与 webkit 浏览器 ; webkit 内核浏览器 对 HT…

Ubuntu18 更换 apt 源为阿里云

Step1. 备份 list 文件 进入对应文件夹&#xff0c;用管理员权限&#xff0c;执行复制操作&#xff1a; cd /etc/apt/ sudo cp sources.list sources.list.bak Step2. 修改 list 文件 通过管理员权限&#xff0c;使用 vim 进行修改&#xff1a; sudo vim sources.list 将…

【Pytorch】六行代码实现:特征图提取与特征图可视化

前言 之前记录过特征图的可视化&#xff1a;Pytorch实现特征图可视化&#xff0c;当时是利用IntermediateLayerGetter 实现的&#xff0c;但是有很大缺陷&#xff0c;只能获取到一级的子模块的特征图输出&#xff0c;无法获取内部二级子模块的输出。今天补充另一种Pytorch官方…