Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转

news2024/11/18 8:40:31

Gerrit | 重磅! 2.x 版本升级到 3.x 版本

为什么要做版本升级?

2.x known bugs

重大问题不一一列举,这里仅仅是举几个例子:

  • 安全或权限问题:普通用户能看到敏感数据,例如看到其他用户的 hashed api 密码,

问题传送门:https://bugs.chromium.org/p/gerrit/issues/detail?id=13514;

  • 再例如 已经设置为失效的账号,还可以登录 gerrit ;
  • 升级时索引建立失败:重建索引未完成,插件就 load 了,索引建立过程 invoked,https://bugs.chromium.org/p/gerrit/issues/detail?id=6472;

3.0 的重大更新

  • ReviewDB 寿终正寝,NoteDB 上台
  • UI 界面全面更新,GWT 被 PolyGerrit 取代
  • 支持 REST-API
  • 其他重大更新,等等

新版本大概长这样

升级 Migration 实操记录

目前待升级的 gerrit 版本为 2.13.9,根据官方文档,必须确保每个中间版本都被升级,所以升级路线暂定为:

  1. 2.13 -- 2.14 -- 2.15 -- 2.16
  2. 到了 2.16 后将review DB 迁移到NoteDB
  3. 迁移 2.16 到 3.0

注意:v2.16是唯一包含和支持 reviewDB 到 NoteDB 的关键版本

Reference Doc:https://gitenterprise.me/2019/05/20/gerrit-v3-0-is-here/

提前测试

测试原版 gerrit 升级路径,不携带任何数据,为的是快速探索成功路径

升级路径:2.13.9 -- 2.15.21 -- 2.16.25 -- 3.2.3

s0:升级前,确认 gerrit 的 replication 和 HA 的插件和配置文件,被禁用(可移走或重命名)

s1:起点版本 2.13.9

$ java -jar gerrit-2.13.9.war init --batch --dev -d gerrit_test

s2:升级到 2.15.21

$ java -jar gerrit-2.15.21.war init --batch --dev -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index groups -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index accounts -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index changes -d gerrit_test

执行以上三步,gerrit 服务才能启动成功

其中第三步 reindex,耗时较长,可以先 skip ,升级到 3.x 再做

s3:升级到 2.16.25

$ java -jar gerrit-2.16.25.war init --batch --dev -d gerrit_test

直接启动 gerrit 可以成功

s4:升级 3.x 之前,将 jdk 11 下载解压,并加入到 环境变量中,source

$ java -version

openjdk version "11.0.9.1" 2020-11-04

OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)

OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)

s5:在2.16.25 上进行数据库 migrate

$ java -jar gerrit-2.16.25.war migrate-to-note-db -d gerrit_test

可以加上 --reindex false 选择跳过 reindex

s6:升级到 3.2.3

$ java -jar gerrit-3.2.3.war init --batch --dev -d gerrit_test

s7:进行 reindex

$ java -jar gerrit-3.2.3.war reindex --index accounts -d gerrit_test

$ java -jar gerrit-3.2.3.war reindex --index changes -d gerrit_test

启动 gerrit 服务,启动 OK, awsome!!


验证一下:

$ curl localhost:29418

SSH-2.0-GerritCodeReview_3.2.3 (APACHE-SSHD-2.4.0)

Unsupported protocol version: GET / HTTP/1.1

到此基本的操作步骤都涵盖在上面了,分割线以下,是我的实际操作日志,仅供参考。

如果有任何问题,可私信咨询。


实际 Tips

  • 升级前的准备

检查 gerrit.config

[cache "diff"]

timeout = 200ms # 减少timeout 提升整体 reindex 速度

  • 导入数据

进入 MySQL : set GLOBAL max_connections=1000;

本地搭建 mysql, 并导入数据

mysql -u username -p < ...sql脚本.sql ,

例如

$ mysql -u gerrit_rw -p --verbose < c3-inf-gerrit-db01.bj.sql

  • 拷贝 线上的 gerrit 目录并停掉 gerrit 的 HA 和 replication,然后修改 gerrit.config 的 database 为本地数据库配置

[database]

type = mysql

hostname = localhost

database = xxx

username = x

password = x

port = 3306

useSSL = false

[auth] type = DEVELOPMENT_BECOME_ANY_ACCOUNT

  • 同步线上代码

$ ssh -p 29418 gerrit@localhost replication start --url 目标地址 --all

  • 2.13 --> 2.14

#停止 gerrit 服务

java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

Get an error:
Exception in thread "main" java.nio.file.NoSuchFileException: gerrit/ha/1/gerrit/shared
解决方式:去掉或重命名etc目录下的 ha config 和 replication config ,去掉 plugins 文件下的 ha 和 replication 的 jar 包
这一步也可以在执行 升级命令 之前完成

继续上面的 java 命令

$ java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

Upgrading schema to 130 ...

Upgrading schema to 131 ...

Upgrading schema to 132 ...

迁移正常的打印信息为:

Migrating 5263 repositories ...

Migration completed: 3 repositories updated:

All-Projects platform/packages/apps/ContactsCommon platform/packages/apps/OneAccountSdk

> Done (44.769 s)

Migrating data to schema 131 ...

Migrating 5263 repositories ...

Migration completed: 16 repositories updated:

... ... ...

Migrating data to schema 141 ...

> Done (0.022 s)

Migrating data to schema 142 ...

> Done (137.173 s)

Execute the following SQL to drop unused objects:

... ... ...

Initialized /home/work/gerrit

报错:直接启动 gerrit 服务会失败:No index versions ready;

解决方式:进行 reindex 操作

$ java -jar gerrit-2.14.22.war reindex --index groups -d ${gerrit-site}

... ... ...

Finishing 5 disk cache updates

启动 gerrit 服务, 查看升级后的版本

$ curl localhost:29418

SSH-2.0-GerritCodeReview_2.14.22 (SSHD-CORE-1.4.0)

Unsupported protocol version: GET / HTTP/1.1

或者查看一下新UI 左下角的版本信息(2.14.22)

  • 继续下一步:2.14 --> 2.15

migration to 2.15 与上述内容基本一致

$ java -jar gerrit-2.15.21.war init --batch --dev -d ${gerrit-site}

Upgrading schema to 143 ...

Upgrading schema to 144 ...

... ... ...

Initialized /home/work/gerrit

这一步想偷懒不做 reindex,但是失败了

No index versions for index 'changes' ready;

run java -jar /home/work/gerrit/bin/gerrit.war reindex --index changes

先升级到 3.2.3 再做 reindex

  • 下一步:2.15 --> 2.16

$ java -jar gerrit-2.16.25.war init --batch --dev -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index projects -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index groups -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index changes -d ${gerrit-site}

注意这一步可能会耗时很久, 取决于Gerrit上change的数量大小

  • 启动 gerrit 服务

$ curl localhost:29418

SSH-2.0-GerritCodeReview_2.16.25 (SSHD-CORE-2.0.0)

Unsupported protocol version: GET / HTTP/1.1

  • 继续下一步:2.16 --> 3.0

出现错误ERROR com.google.gerrit.pgm.init.BaseInit : Couldn't upgrade schema. Expected if slave and read-only database

com.google.gerrit.exceptions.StorageException: You appear to be upgrading from a 2.x site, but the NoteDb change migration was not completed. See documentation:

https://gerrit-review.googlesource.com/Documentation/note-db.html#migration

根据文档,必须先进行 NoteDB 迁移

$ java -jar gerrit-2.16.25.war migrate-to-note-db -d ${gerrit-site}

这一步报错了: failed on some changes ,see log

于是需要把 失败的 changid 的相关信息从数据库里删除掉;

# 举一个changeid 的例子

use database_name;

delete from patch_sets where change_id=183663;

delete from patch_set_approvals where change_id=183663;

delete from patch_comments where change_id=183663;

delete from changes where change_id=183663;

delete from change_messages where change_id=183663;

delete from change_id where s=183663;

... ... ...

执行完后,继续进行 migrate


  • 为了提升效(偷)率(懒),写了个自动化脚本

接受命令行输入参数的脚本

#!/bin/bash 
#
#********************************************************************
#Author:                奈文摩尔
#ID:                    xxxxx
#Created:               2021-02-02
#Modified:              2021-02-04  10:27:27
#Email:                 
#Description:           Upgrade gerrit from 2.x to 3.x
#Copyright (C):         2021 All rights reserved
#********************************************************************
# run as work 
# Input Paras :
# 1:gerrit folder (local path)
# 2:dumped sql script (local path)
# 3:remote mysql host/port/user/password
``` Example:  
bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456
```
set -e
if [ ! -n "$1" ] ;then
    echo "invalid input , bash xxx  -help to get demo"
 exit -1
fi
if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]
then
    echo "
    ----------------------------------------------------
    -g  gerrit folder path
    -d  dump sql script path
    -h  mysql host name
    -p  mysql host port
    -u  mysql login username
    -w  mysql username password
 
    Example:  
    bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456
    -----------------------------------------------------
 "
 exit 0
fi
while getopts "g:d:h:p:u:w:" opt; do
  case $opt in
    g)
        GERRIT_SITE=$OPTARG
        echo "GERRIT_SITE is $GERRIT_SITE" ;;
    d)
        DUMP_SQL=$OPTARG
        echo "DUMP_SQL is $DUMP_SQL" ;;
    h)
        DB_HOST=$OPTARG
        echo "DB_HOST is $DB_HOST" ;;
    p)
        DB_PORT=$OPTARG
        echo "DB_PORT is $DB_PORT" ;;
    u)
        DB_USER=$OPTARG
        echo "DB_USER is $DB_USER" ;;
    w)
        DB_PWD=$OPTARG
        echo "DB_PWD is $DB_PWD" ;;
    \?)
        echo "invalid arg" ;;
  esac
done
# step 0 : modify gerrit.config
cd ${GERRIT_SITE}/etc/
if [ -f gerrit.config ]; then
    mv gerrit.config gerrit-bak.config
fi
if [ -f secure.config ]; then
    mv secure.config secure-bak.config
fi
wget https://staging-cnbj2-fds.api.zzz.net/files/gerrit.config
wget https://staging-cnbj2-fds.api.zzz.net/files/secure.config
JDBC_STR="jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false"
sed -i "0,/hostname =/{s/hostname =.*/hostname = ${DB_HOST}/}" gerrit.config
sed -i "0,/username =/{s/username =.*/username = ${DB_USER}/}" gerrit.config
sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" gerrit.config
sed -i "0,/port =/{s/port =.*/port = ${DB_PORT}/}" gerrit.config
sed -i "/url = /c\        url = jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false" gerrit.config
sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" secure.config
# sed -i "s/hostname =/    hostname = ${DB_HOST}/g" gerrit.config
# sed -i "s/username =/    username = ${DB_USER}/g" gerrit.config
# sed -i "s/password =/    password = ${DB_PWD}/g" gerrit.config
# sed -i "s/port =/    port = ${DB_PORT}/g" gerrit.config
# sed -i "s/url =/    url = ${JDBC_STR}/g" gerrit.config
# sed -i "s/password =*/    password = ${DB_PWD}/g" secure.config
# step 1 : delete replication /  hA config
RPC_CONFIG=${GERRIT_SITE}/etc/replication.config
HA_CONFIG=${GERRIT_SITE}/etc/high-availability.config
rm -rf ${RPC_CONFIG}
rm -rf ${HA_CONFIG}
# delete confirm
if [ -f "${RPC_CONFIG}"] || [ -f "${HA_CONFIG}" ];
then
    echo "config file delete failed: ${RPC_CONFIG} or ${HA_CONFIG}"
 exit -1
fi
# step 2 : download pkg
cd ${GERRIT_SITE}
cd ..
rm -rf gerrit-*.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.15.21.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.16.25.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-3.2.3.war
if [ ! -f "delete_dirty_changeids.sql" ]; then
    wget https://staging-cnbj2-fds.api.zzzzz.net/files/delete_dirty_changeids.sql
fi
# step 3 : Loading dump data into DB
echo "-------------------- split line ---------------------------"
echo "start loading data :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
mysql -h${DB_HOST}  -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < ${DUMP_SQL}
mysql -h${DB_HOST}  -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < delete_dirty_changeids.sql
# step 4 : upgrate from 2.13  --> 2.15
echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
cd ${GERRIT_SITE}/lib 
wget https:///mysql-connector-java-5.1.43.jar
mkdir -p ${GERRIT_SITE}/ha/1/gerrit/shared
cd -
java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}
# step 5 : upgrate from 2.15 --> 2.16
echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
cd ${GERRIT_SITE}/lib 
wget https://staging-cnbj2-fds.api.zzzzz.net/files/mysql-connector-java-5.1.48.jar
cd -
java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}
# step 6 : migrate on 2.16
echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
rm -rf ${GERRIT_SITE}/etc/notedb.config
nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &
while true
do
    echo "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"
 if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; then
        echo "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
 break
    fi
 if test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; then
        echo "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
 exit -1
    fi
 sleep 1m
done
# step 7 : upgrate from 2.16  --> 3.2.3
echo "start 3.2.3 : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-3.2.3.war init --batch --dev -d ${GERRIT_SITE}
# step 8 : reindex on 3.2.3
echo "Reindex accounts : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-3.2.3.war reindex --index accounts -d ${GERRIT_SITE}
echo "Reindex changes : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
nohup java -jar gerrit-3.2.3.war reindex --index changes -d ${GERRIT_SITE} > "reindex-$(date "+%Y-%m-%d-%H-%M-%S").log" 2>&1 &

可固定参数的脚本:

#!/bin/bash
set -e

export GERRIT_SITE=/home/work/hdd1/gerrit_odm
cd ${GERRIT_SITE}/lib
rm -rf ${GERRIT_SITE}/lib/*
wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.43.jar

cd /home/work/hdd1
echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}


cd ${GERRIT_SITE}/lib
rm -rf ${GERRIT_SITE}/lib/*
wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.48.jar

cd -
echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}

echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &

while true
do
    echo "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"
    if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; then
        echo "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
        break
    fi
    if test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; then
        echo "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
        exit -1
    fi
    sleep 1m
done

编辑于 2021-05-13 11:47

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

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

相关文章

小程序配置请求代理

在app.json中添加“proxy”字段配置代理 "proxy": {"/api": {"target": "http://192.168.110.249:8221/",//你要请求的目标地址"changeOrigin": true,"pathRewrite": {"^/api": ""//重定向}}…

尚硅谷大数据项目《在线教育之实时数仓》笔记004

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第8章 数仓开发之DIM层 P024 P025 P026 P027 P028 P029 P030 第8章 数仓开发之DIM层 P024 package com.atguigu.edu.realtime.app.func;import com.alibaba.druid.pool.DruidDat…

面向服务的架构设计理论与实践

面向服务的架构设计理论与实践 面向服务的架构概述 SOA的定义 SOA发展现状 面向Web服务的业务流程执行语言(BPEL) BPEL&#xff08;面向Web服务的业务流程执行语言&#xff09;是一种用于描述和执行业务流程的标准化语言。它可以帮助组织在分布式系统中协调和管理各种Web服务…

【C++进阶】set和map的基本使用(灰常详细)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

QQ云端机器人登录系统php源码开心版

可能很多人不知道这源码有什么用&#xff0c;这款源码主要是针对群机器人爱好者的&#xff0c; 这是一个通过对接挂机宝里面机器人框架的一个网页站点&#xff0c; 用户通过网页登录 QQ 账号至挂机宝里面框架&#xff08;可扫码登录、账密登录、跳转 QQ 快捷登录&#xff09;…

Canal整合SpringBoot详解(一)

文章目录 Canal整合SpringBoot详解&#xff08;一&#xff09;什么是canal搭建Kafka3.2.1集群⭐Kafka集群机器规划创建3台虚拟机&#xff08;centos7系统&#xff09;必要的环境准备&#xff08;3台虚拟机都要执行如下操作&#xff09;⭐分别修改每个服务器的hosts文件&#xf…

【2021集创赛】Robei杯一等奖:基于Robei EDA工具的隔离病房看护机器人设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位&#xff1a;重庆交通大学 队伍名称&#xff1a;一丘之貉 指导老师&#xff1a;毕波 李艾星 参赛队员&#xff1a;郁航 张坤 秦衡 总决赛奖项&#xff1a;Robei杯一等奖…

iOS开发-CoreNFC实现NFC标签Tag读取功能

iOS开发-CoreNFC实现NFC标签Tag读取功能 一、NFC近场通信 近场通信&#xff08;NFC&#xff09;是一种无线通信技术&#xff0c;它使设备能够在不使用互联网的情况下相互通信。它首先识别附近配备NFC的设备。NFC常用于智能手机和平板电脑。 二、实现NFC标签Tag读取功能 在…

Linux | 进程终止与进程等待

目录 前言 一、进程终止 1、进程终止的几种可能 2、exit 与 _exit 二、进程等待 1、为什么要进程等待 2、如何进行进程等待 &#xff08;1&#xff09;wait函数 &#xff08;2&#xff09;waitpid函数 3、再次深刻理解进程等待 前言 我们前面介绍进程时说子进程退出…

Canal整合SpringBoot详解(二)

文章目录 Canal整合SpringBoot详解&#xff08;二&#xff09;什么是canal案例2&#xff1a;CanalKafka实现mysql和elasticsearch的数据同步⭐Docker搭建elasticsearch7.8.0&#xff08;单机版本&#xff09;⭐Docker安装elasticsearch-head5⭐解决es-head 406错误问题直接修改…

实用篇-Eureka注册中心

一、提供者与消费者 服务提供者&#xff1a;一次业务中&#xff0c;被其他微服务调用的服务。(提供接口给其他微服务) 服务消费者&#xff1a;一次业务中&#xff0c;调用其他微服务的服务。(调用其他微服务提供的接口) 例如前面的案例中&#xff0c;order-service微服务是服…

系列七、动态代理

一、概述 二、Jdk动态代理案例 2.1、Star /*** Author : 一叶浮萍归大海* Date: 2023/10/27 17:16* Description:*/ public interface Star {/*** 唱歌* param name 歌曲名字* return*/String sing(String name);/*** 跳舞*/void dance(); } 2.2、BigStar /*** Author : 一叶…

AcWing 1.2.1 最长上升子序列模型 + 动态规划 + 图解(详细)

&#xff08;1&#xff09;acwing 4557. 最长上升子序列 4557. 最长上升子序列 - AcWing题库 给定一个长度为 N 的整数序列 a1,a2,…,aN。请你计算该序列的最长上升子序列的长度。上升子序列是指数值严格单调递增的子序列 输入格式 第一行包含整数 N第二行包含 N个整数 a1,a…

LLM系列 | 23:多模态大模型:浦语·灵笔InternLM-XComposer解读、实战和思考

引言 ​简介 模型解读 模型架构 训练 实战 环境准备 本地实测 服务部署 总结 引言 谁念西风独自凉&#xff0c;萧萧黄叶闭疏窗&#xff0c;沉思往事立残阳。 Created by DALLE 3 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖热干面的小女孩…

在Golang中理解错误处理

处理Golang中临时错误和最终错误的策略和示例 作为一名精通Golang的开发人员&#xff0c;您了解有效的错误处理是编写健壮可靠软件的关键因素。在复杂系统中&#xff0c;错误可能采取各种形式&#xff0c;包括临时故障和最终失败。在本文中&#xff0c;我们将探讨处理Golang中…

源码解析SpringMVC之RequestMapping注解原理

1、启动初始化 核心&#xff1a;得到应用上下文中存在的全部bean后依次遍历&#xff0c;分析每一个目标handler & 目标方法存在的注解RequestMapping&#xff0c;将其相关属性封装为实例RequestMappingInfo。最终将 uri & handler 之间的映射关系维护在类AbstractHand…

Java入门篇 之 数据类型(简单介绍)

博主回归学习状态的第三篇文章&#xff0c;希望对大家有所帮助 今日份励志文案:你若决定灿烂&#xff0c;山无遮&#xff0c;海无拦 加油&#xff01; Java中一共存在2种数据类型 1 . 基本数据类型,基本数据类型四种和八种之说(具体看下图) 四种说的是&#xff0c;整数型&…

vscode打开settings.json方法

cmd shift p&#xff0c;输入setting Open Workspace Settings 也会打开UI设置界面&#xff1b; Open User Settings (JSON) 会打开用户设置 settings.json 文件&#xff1b; Open Workspace Settings (JSON) 会打开工作区设置 settings.json 文件 vscode存在两种设置 sett…

损失函数和目标函数|知识补充

这张图中&#xff0c;横坐标size表示房屋的大小&#xff0c;纵坐标price表示房屋的价格&#xff0c;现在需要建立模型来表示两者之间的关系。 对于给定的输入x&#xff0c;模型会有一个输出f(x)&#xff0c;用一个函数来度量拟合的程度&#xff0c;也就是真实值和预测值之间的…

前端工程化面试题及答案【集合】

前言&#xff1a; 欢迎浏览和关注本专栏《 前端就业宝典 》&#xff0c; 不管是扭螺丝还是造火箭&#xff0c; 多学点知识总没错。 这个专栏是扭螺丝之上要造火箭级别的知识&#xff0c;会给前端工作学习的小伙伴带来意想不到的帮助。 本专栏将前端知识拆整为零&#xff0c;主要…