如何使用gitlab CI/CD自动打包并部署一个SpringBoot项目
前文提到了怎么部署一个gitlab平台以及配套的runner,下面就应用这套来进行一个项目实战,部署官方的SpringBoot示例
首先新建一个仓库,然后选择模板,选择SpringBoot模板
设置一些基本信息,可以随便填,仓库选择私人或者内部
然后进入仓库页面确定创建成功
接下来需要用idea拉取代码,有两种方式,如果安装gitlab插件的话,可以使用访问令牌登录之后,直接选择有权限的仓库直接拉取到本地
如果没装gitlab插件,也可以在项目界面直接点击克隆链接,在idea输入也可
idea这边创建新项目选择来自版本控制
这里就会遇到前文提到的为什么要在docker设置里写好ip,如果没写ip这里点复制git地址的时候,ip那里会是一串代码(docker镜像id),不过如果按照我的教程走的就应该不会遇到了
如果提示需要登录,那就输入root账号和密码,如果提示输入邮箱和用户名,这俩可以随便填
ok在输入一些信息之后,代码应该已经克隆到本地了
这个代码在本地可以直接跑,输入localhost:8080即可
如果要使用CICD来跑的话,还需要更改一些设置
首先打开项目里的pom ...
在Ubuntu服务器上部署自己的GitLab+CI/CD流水线
持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。
持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。
这些方法使得可以在开发周期的早期发现bugs和errors,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。
本文主要介绍如何使用Ubuntu服务器来部署属于自己团队的专属GitLab平台以及使用GitLab CI/CD流水线实现自动打包并部署
为了照顾对linux不熟悉的用户,本文主要使用宝塔面板来进行操作,尽量避免使用命令行等,争取全部可视化,下面介绍主要流程
前期准备
一台Ubuntu服务器(最基本的)
安装宝塔面板,有一键安装脚本 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 12f2c1d72
安装docker(目前国内可能访问不了,只能自 ...
Protocol Buffers 学习笔记
文章摘要:学习 Protobuf 时整理,主要介绍 Protobuf 特性、proto 语法以及 Protobuf 编码方式
前言Protocol Buffers(Protobuf)Protocol Buffers 是一种跨语言、跨平台、可扩展的数据格式(序列化方式),与 Json、XML 相比,Protocol Buffers 的性能更高(占用空间更少,序列化和反序列化速度更快)。
Protobuf 的优秀特性
跨语言:Protobuf 支持多种变成语言,统一使用 Protobuf 定义数据结构,然后使用 Protoc 生成不同语言的序列化和反序列化代码。
跨平台:Protobuf 是平台无关的,不依赖特定的系统架构,可以在不同操作系统和硬件平台运行。
向后兼容:proto3 中所有字段都是可选的,如果没有赋值,序列化时不会被包含,反序列化时会被初始化为默认值。
高性能:Protobuf 使用二进制存储,并且采用变长整数以及字段编号,使得其序列化后占用空间更少,并且序列化和反序列化速度更快。
安全性:没有结构描述文件,则无法解析实际内容,安全性更高。
Proto ...
Java函数式编程总结
1. 函数式编程函数式编程近几年炒的火热,其实函数式编程其实很早就有了,支持该范式的语言有大名鼎鼎的C、JavaScript、PHP等,那为什么又进行了一波高潮呢,我们来探究一下。首先了解一下什么是函数式编程:
函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算为该语言最重要的基础。而且,λ演算的函数可以接受函数作为输入参数和输出返回值。——维基百科
简而言之,函数式是一种编程范式,同时函数式也是一种以函数为核心的编程思维方式。面向对象思想需要关注用什么对象完成什么事情,而函数式编程思想就类似于我们数学中的函数,它主要关注的是对数据进行了什么操作。
函数式编程的优点
代码简洁,开发快速
接近自然语言,易于理解
易于并发编程
为什么学函数式编程
能够看懂公司里的代码
大数量下处理集合效率高
代码可读性高
消灭嵌套地狱
请看下面一段代码,查询未成年作家的评分在70以上的书籍,作家和书籍可能出现重复,需要进行去重。
123456 ...
为什么有HTTP还要RPC
省流版RPC是一套方法论描述,HTTP是一种7层网络协议。这两个东西其实完全是正交的,没有啥可比性。RPC没有明确的协议标准,可以基于http,也可以基于tcp/udp。正因为缺少标准才有涌现出GRPC、thrift,dubbo多种版本框架,各个框架都是基于自己的理解去实现的。
背景从第一次接触 RPC 后,这个疑惑就一直萦绕在我脑海中,但纵观整个编程史,大家都在心照不宣的使用 RPC,就好像本该如此。于是在好奇心的驱使下去搜了搜这个问题,才算是搞懂了这个问题。
然而答案却让我傻了眼,RPC 比 HTTP 更早出世!这让我大为震惊,由于入坑编程开始第一个接触的就是 HTTP 协议,且在往后的开发中不停的与 HTTP 在打交道,因此一个错误的观点就先入为主了 —HTTP 比 RPC 更早诞生。好了,现在问题演变为《既生 RPC 何生 HTTP》,这就得从大家熟背于心的八股文 —TCP 开始讲起。
TCPTCP 协议,大白话来解释就是两台服务器想要进行通信,就得用到的一个玩意。
大概过程就是两台服务器会经过一个三次握手的过程来建立一个可靠的连接,然后双方就可以基于这个连接来互相发送消息。那 ...
MySQL事务篇
1.事务介绍:
一般是指要做的或所做的事情。 在计算机 术语 中是指访问并可能更新数据库中各种 数据项 的一个程序 执行单元 (unit)
2.数据库事务具有ACID四大特性。
ACID是以下4个词的缩写:
原子性(atomicity) :事务最小工作单元,要么全成功,要么全失败 。
一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏 。
隔离性(isolation) :不同事务之间互不影响,四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。
持久性(durability) :事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失 。
3.隔离级别:
四种隔离级别分别为:
1)未提交读(READ UNCOMMITTED/RU) 如果一个事务读到了另一个未提交事务修改过的数据,那么这种 隔离级别 就称之为 未提交读 会产生脏读的情况
2) 已提交读(READ COMMITTED/RC) 不可重复读:一个事务因读取到另一个事务已提交的update。导致对同一条记录读取两次以上的结果不 ...
Java基础常见面试题(不定期更新)
1、java 的基本数据类型/有哪些?Java 的基本数据类型包括以下八种:
boolean: 用于存储逻辑值,只能存储 true 和 false。
byte: 用于存储字节数据,占用 8 位(一个字节)内存空间。
short: 用于存储较短整数,占用 16 位(两个字节)内存空间。
int: 用于存储整数,占用 32 位(四个字节)内存空间。
long: 用于存储长整数,占用 64 位(八个字节)内存空间。
float: 用于存储单精度浮点数,占用 32 位(四个字节)内存空间。
double: 用于存储双精度浮点数,占用 64 位(八个字节)内存空间。
char: 用于存储单个字符,占用 16 位(两个字节)内存空间,采用 Unicode 编码。
2、java 为什么要有包装类型?主要原因包括以下几点:
处理基本数据类型的 null 值:基本数据类型(如 int,double 等)不能直接赋值为 null,而包装类型(如 Integer、Double)可以表示 null 值,这对于某些业务逻辑和数据处理来说非常有用。
提供额外功能:包装类型 ...
minIO图床配合el-upload和springboot实现后端签名前端直传
概述背景谷粒商城中有许多需要保存图片的场景,正规做法是在数据库中保存图片地址,文件则保存在对象存储服务(OSS)中,官方视频教学的是使用阿里云的OSS,这样还可以搭配spring boot cloud alibaba使用,但是本人希望能自己部署的环境尽量自己部署,查询后找到了minIO这款工具,可以实现OSS的大部分功能,使用docker部署也非常方便,这样的话就需要重构很多前后端代码
分析问题本来个人想要做成前端把文件传到后端,后端再上传到minIO图床,这套流程个人很熟悉。但是教程中使用的是签名直传的方案,想来少了一段文件传输的流程也确实速度更快也更稳定,这在minIO里也可以实现,只是需要一些技巧
签名直传方案的原理是,前端向后端发送请求,携带文件名参数,后端返回给前端一个直传地址,前端直接请求该地址即可上传文件,这样保证了既不会需要在前端填写图床信息(通过返回参数获得),还可以直接由前端上传文件
在el-upload中填入action参数是官方做法,这样该组件会自己调用封装好的post方法请求这个参数地址来直传文件
minIO这个软件给的api里,直传地址只能通过put请 ...
Redis实现排行榜功能
背景 通常来说,榜单是指一定时间周期内以某个指标反序排列的 N 个元素 (id, score),即 topN 个元素,这里的 N,一般来说是个较小的常数,如 100。而根据时间周期的不同,可分为小时榜、日榜、周榜、月榜等。
以直播为例,在直播后端业务场景下,涉及榜单的包括但不限于直播间榜单、直播 PK 贡献榜单、粉丝团亲密度榜单、直播宠物好友榜单、直播宠物投喂饭团榜单、地区小时榜单。其中直播间榜单是日榜、直播 PK 贡献榜则是以 PK 时长为周期的榜单。
本文主要简述在不同需求场景下,如何使用 redis 对榜单数据进行存储,并尽可能保证榜单数据一致性。
概念
榜单,一系列榜单单元 <id, score> 构成,按 score 反序排列的有序列表。
榜单元素,id,用户于惟一标识榜单中某个数据单元,如用户 id;score,用于标识 id 的计分。
说明:后续示例中以 u 表示用户,topList 表示榜单,userScore 表示用户计分。
选择 redis 原因
redis 丰富的数据结构中 zset 就是有序列表。
redis ...
Redis 实战:Redis 在 Java 中的基本使用
Redis 实战:Redis 在 Java 中的基本使用1、使用 jedis 操作 redis1.1、Jedis 简介Jedis 是 Java 语言开发的 Redis 客户端工具包,用于 Java 语言与 Redis 数据进行交互。
Jedis 在 github 官网地址:https://github.com/redis/jedis#readme
Jedis 只是对 Redis 命令的封装,掌握 Redis 命令便可轻易上手 Jedis。
Jedis 遵循 RESP 协议规范开发,具有良好的通用性与可读性。
1.2、引入 jedis 的 Maven 依赖123456<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> ...