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

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" ] ;thenecho "invalid input , bash xxx  -help to get demo"exit -1
fi
if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]
thenecho "-----------------------------------------------------g  gerrit folder path-d  dump sql script path-h  mysql host name-p  mysql host port-u  mysql login username-w  mysql username passwordExample:  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; docase $opt ing)GERRIT_SITE=$OPTARGecho "GERRIT_SITE is $GERRIT_SITE" ;;d)DUMP_SQL=$OPTARGecho "DUMP_SQL is $DUMP_SQL" ;;h)DB_HOST=$OPTARGecho "DB_HOST is $DB_HOST" ;;p)DB_PORT=$OPTARGecho "DB_PORT is $DB_PORT" ;;u)DB_USER=$OPTARGecho "DB_USER is $DB_USER" ;;w)DB_PWD=$OPTARGecho "DB_PWD is $DB_PWD" ;;\?)echo "invalid arg" ;;esac
done
# step 0 : modify gerrit.config
cd ${GERRIT_SITE}/etc/
if [ -f gerrit.config ]; thenmv gerrit.config gerrit-bak.config
fi
if [ -f secure.config ]; thenmv 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}" ];
thenecho "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" ]; thenwget 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
doecho "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; thenecho "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logbreakfiif test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; thenecho "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logexit -1fisleep 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 -eexport 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.jarcd /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.jarcd -
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
doecho "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; thenecho "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logbreakfiif test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; thenecho "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logexit -1fisleep 1m
done

编辑于 2021-05-13 11:47

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda虚拟环境笔记收录

1、安装conda 增加执行权限&#xff1a; chmod x Anaconda3-2023.03-1-Linux-x86_64.sh 开始执行&#xff1a;./Anaconda3-2023.03-1-Linux-x86_64.sh2、查看版本 conda --version3、查看当前虚拟环境 虚拟环境和全局环境有前缀可见 如果不进行设置&#xff0c;重新启动就变成…

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址&#xff1a;https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示&#xff1a; 2.php环境 解释&#xff1a;建议使用phpstudy进行安装&#xff0c;安装较为简单 链接&#xff1a;https://www.xp.cn/ 图示&#xff1a; 二、第…

企业年度经营计划预算最全攻略来了!附年度费用预算表格模板

经营分析里最重要&#xff0c;也最让人头大的部分&#xff0c;莫过于制定经营计划。现实中很多企业因为制定年度经营预算费用不善&#xff0c;导致年度经营计划与预算脱节&#xff0c;年度计划成了摆设…… 年度费用预算表 为了摆脱企业年度经营与发展&#xff0c;并作出科学合…

shell语法大全(超级详细!!!!),非常适合入门

本文旨在对y总的Linux基础课shell语法做学习记录&#xff0c;指令较多&#xff0c;方便日后查找。 参考视频&#xff1a;Linux基础课 参考教程&#xff1a;Linux教程 1 概论 Linux中常见的shell脚本有很多种&#xff0c;常见的有&#xff1a; Bourne Shell(/usr/bin/sh或/bi…

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做&#xff1f; 随着国产化的普及&#xff0c;国家政策对信创产业的支持&#xff0c;尤其一些金融证券行业、政府单位等&#xff0c;逐渐开始走国产化信创的路线&#xff0c;越来越多接触到国产 CPU &#xff08;arm 平台&#xff0c;比如华为的鲲鹏处理器&#xf…

区块链物联网中基于属性的私有数据共享与脚本驱动的可编程密文和分散密钥管理

Attribute-Based Private Data Sharing With Script-Driven Programmable Ciphertext and Decentralized Key Management in Blockchain Internet of Things 密钥生成算法 第 1 步&#xff1a;对于属性集A 的用户IDk&#xff0c;他首先将属性集A发送给Pi并且计算 &#xff0c…

docker的安装部署nginx和mysql

小白自己整理&#xff0c;如有错误请指示&#xff01; 自我理解&#xff1a;docker就是把应用程序所用的依赖程序&#xff0c;函数库等相关文件打包成镜像文件&#xff0c;类似系统光盘&#xff0c;然后可以在任意电脑上安装使用&#xff08;方便运维人员部署程序&#xff09;…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后&#xff0c;MySQL需要手动执行启动。 运行执行脚本后发现异常&#xff0c;如下图&#xff1a; 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看&#xff0c;发现mysql进程号一直在变化&#x…

『阿里云盘 AList Kodi』家庭影院搭建指南

文章目录 前言AList简介安装相关命令获取密码 阿里云盘Kodi安装 参考链接 前言 之前我们使用简易 Python 框架搭建部署了私人影院&#xff0c;但是部分小伙伴们表示对于个人使用来说比较复杂&#xff0c;这次将会带来更加适合个人使用&#xff0c;并且部署更加简单的 阿里云盘…

【uniapp】短信验证码输入框

需求是短信验证码需要格子输入框 如图 网上找了一个案例改吧改吧 直接上代码 结构 <template><view class"verify-code"><!-- 输入框 --><input id"input" :value"code" class"input" :focus"isFocus"…

加解密原理(HCIA)

一、加密技术 1、加密的两个核心组件 2、加密技术作用&#xff1a; 二、加解密技术原理 1、对称加密 2、非对称加密 &#xff08;1&#xff09;思考问题&#xff1f; 1&#xff09;、有了非对称加密为什么还用对称加密&#xff1f; 2&#xff09;、如何传递秘钥呢&…

C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

Docker 入门

What - 什么是容器 容器是一种轻量级、可移植、自包含的软件打包技术&#xff0c;使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器&#xff0c;无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。容器与虚拟机谈…

尚硅谷大数据项目《在线教育之实时数仓》笔记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…

网络流学习笔记

网络流基础 基本概念 源点&#xff08;source&#xff09; s s s&#xff0c;汇点 t t t。 容量&#xff1a;约等于边权。不存在的边流量可视为 0 0 0。 ( u , v ) (u,v) (u,v) 的流量通常记为 c ( u , v ) c(u,v) c(u,v)&#xff08;capacity&#xff09;。 流&#xff…

Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css&#xff08;css.txt&#xff09; 2.3 配置路由 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2…

SpringCloud 微服务全栈体系(五)

第七章 Feign 远程调用 先来看我们以前利用 RestTemplate 发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一 参数复杂 URL 难以维护 Feign 是一个声明式的 http 客户端&#xff0c;官方地址&#xff1a;https://github.…

【C++】缺省参数及函数重载

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 缺省参数1.1 缺省…

迭代器的封装与反向迭代器

一、反向迭代器 在list模拟实现的过程中&#xff0c;第一次接触了迭代器的封装&#xff0c;将list的指针封装成了一个新的类型&#xff0c;并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装&#xff0c;并且体现了泛型编程的思想&#xff0c;任意…