多环境和前后多环境实战

文章目录

  • 一.多环境
    • 1.1 什么是多环境
    • 1.2 多环境分类
      • 1.2.1 本地环境(自己的电脑)
      • 1.2.2 开发环境(远程开发)
      • 1.2.3 测试环境
      • 1.2.4 预发布环境
      • 1.2.5 正式环境
      • 1.2.6 沙箱环境(实验环境)
    • 1.3 如何实现
      • 1.3.1 抽象配置类
      • 1.3.2 配置文件化
      • 1.3.3 注入环境参数
  • 二.前端多环境
    • 2.1 基础
    • 2.2 分类
      • 2.2.1 umi框架
      • 2.2.2 其他框架
    • 2.3 实战
      • 2.3.1 环境分类
        • 2.3.1.1 开发环境
        • 2.3.1.2 线上环境
        • 2.3.1.3 serve
      • 2.3.2 多环境配置参数
      • 2.3.3 实战
  • 三.后端多环境
    • 3.1 基础
    • 3.2 分类
    • 3.3 实战
      • 3.3.1 在云服务器上安装配置mysql
      • 3.3.2 **idea连接线上数据库后的布置**
      • 3.3.3 配置环境
      • 3.3.4 打包运行
      • 3.3.5 线上数据库新用户注册

一.多环境

1.1 什么是多环境

多环境:指同一套项目代码在不同的阶段需要根据实际情况来调整配置并且部署到不同的机器上。

根据实际需要,将同一个项目(或同一套代码)按照一定方法进行区分,并将所需资源和项目本身部署到不同的机器上。不同环境的项目可以有 不同的行为 ,且能够 同时存在、互不影响

  1. 每个环境互不影响

  2. 区分不同的阶段:开发 / 测试 / 生产等

  3. 对项目进行优化:

    • 本地日志级别

    • 精简依赖,节省项目体积

    • 项目的环境 / 参数可以调整,比如 JVM 参数

      针对不同环境做不同的事情。

1.2 多环境分类

1.2.1 本地环境(自己的电脑)

localhost

一般用 local 标识,是指前端或后端独立开发、自主测试的环境。通常就是让项目和依赖在我们自己的电脑上运行,比如数据库、缓存、队列等各种服务,可能需要自己在本地搭建。

1.2.2 开发环境(远程开发)

大家连同一台机器,为了大家开发方便。

一般用 dev 标识,是指前端和后端(或者多个程序员)一起协作开发、联调的环境。通常将项目和依赖放在员工电脑可以直接访问的开发机上,不用自己搭建,直接跑起来项目,提高开发和协作效率。

对规模不大的团队来说,开发和本地环境其实有一套就够了,毕竟本地也可以连接公用的数据库等服务。

1.2.3 测试环境

(测试)开发 / 测试 / 产品,单元测试 / 性能测试 / 功能测试 / 系统集成测试,独立的数据库、独立的服务器。

一般用 test 标识,是指前端和后端开发和联调完成,做出完整的新功能后,交给测试人员去找 Bug 的环境。

通常在测试环境需要有独立的测试数据库和其他服务,让测试人员大显身手。每次修改完 Bug 后,也都要再次发布项目到测试环境,让测试同学重新验证。

1.2.4 预发布环境

预发布环境(体验服):和正式环境一致,正式数据库,更严谨,查出更多问题。

一般用 pre 标识,这是和线上项目最接近的环境,一般是测试验证通过、产品经理体验过后,才能将项目发布到这个环境。

实际上,预发布环境的项目调用的后端接口、连接的数据库、服务等都 和线上项目一致 ,和线上唯一的区别就是前端访问的域名不同。

正因如此,预发布环境看到的都是真实的用户数据,可以发现更多测试环境因为数据不足而没查出来的 Bug。

1.2.5 正式环境

正式环境(线上,公开对外访问的项目):尽量不要改动,保证上线前的代码是 “完美” 运行。

一般用 prod 标识,又叫线上环境,是给所有真实用户使用的环境。

因此不能随意修改,且发布项目到该环境时必须格外小心。线上的数据库、机器等资源一般也是由专业的运维来负责,想要登录机器、修改配置,都需要经过严格审批。

1.2.6 沙箱环境(实验环境)

为了做实验。

1.3 如何实现

遵循 3 个步骤:抽象配置类 + 配置文件化 + 注入环境参数。

1.3.1 抽象配置类

将项目代码中需要根据环境的变化而更改的变量整理到一个或多个配置类中,集中管理。

1.3.2 配置文件化

我们可以用专门的配置文件来维护配置,从而让用户修改配置更方便,不用再去找代码、改代码。

全网最全的springboot配置文件速成

无论是前端还是后端,大部分的多环境实现都是这个原理 —— 搞多套配置,所以总能在项目中看到类似的配置文件:

1.3.3 注入环境参数

到目前为止,其实我们还是在代码中写了 死值 ,来告诉程序应该加载哪个名称的配置文件。

比如在本地开发时,加载application-dev.yml开发完成后、正式上线前,再改代码为加载 application-prod.yml

但这样不仅麻烦,而且可能忘了修改,把开发环境的项目发布到了线上。

最理想的效果应该是:无论项目要切换到哪个环境,整个项目都完全不用修改。

因此,我们可以将 指定环境 这件事放到最后,在通过命令去打包或者启动项目时,将环境参数写进去。

举个例子,我们在启动 java 项目时,给系统变量传递不同参数:

java -jar user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

二.前端多环境

2.1 基础

区分开发环境和线上环境,同时根据应用的不同的前端框架进行不同的部署。

2.2 分类

对于前端项目来讲,开发环境和线上环境还有一些区别,比如说项目的配置。

2.2.1 umi框架

●开发环境:config.dev.ts
●生产环境:config.prod.ts
●公共配置:config.ts 不带后缀

2.2.2 其他框架

此外,不同的项目(框架)都有不同的配置文件,umi 的配置文件是 config.ts,可以在配置文件后添加对应的环境名称后缀来区分开发环境和生产环境。

不同的框架或多或少有一些区别,可以直接查看官方文档,比如umi框架,参考文档:https://umijs.org/zh-CN/docs/deployment

2.3 实战

2.3.1 环境分类

2.3.1.1 开发环境

开发环境 localhost:8000

localhost就是本机。在请求一个网页资源的时候,首先把这些网站的文件,拿到自己的浏览器里,之后,如果说这个网页还需要依赖什么文件,我们都是从自己的电脑上发出的请求,所以这个localhost,其实请求的是我们自己的电脑。

启动方式:npm run start(本地启动,监听端口、自动更新)

2.3.1.2 线上环境

线上环境 已经备案的域名

build就是构建,现在主流的前端项目基本上都是要做构建的,这个构建过程中它做了哪些事情?他就是把咱们写的的代码,各种资源,JS、CS、HTML文件,全部做一些压缩、混淆,去给它做一个编排,然后做一些删减、精简之类的,把它全部打包成一个目录里。

修改前端的全局请求配置文件(src/plugins/globalRequest.ts),把请求地址(baseUrl)改成自己的真实请求地址,注意区分本地和线上环境。

修改前端的全局请求配置文件(src/plugins/myAxios.ts),把请求地址(baseUrl)改成自己的真实请求地址,注意区分本地和线上环境。

**启动方式:**npm run build(项目构建打包),可以使用 serve 工具启动(npm i -g serve)

2.3.1.3 serve

serve使用

前端打包后,有时需要将打包好的项目跑一下看看效果,这时就可以使用 serve 工具,在本地启动一个静态文件服务器。

全局安装 serve

npm install --global serve

运行 serve

方式1:进入到打包好的项目目录下,一般为 dist 或者 build,直接运行 serve 即可。

方式2:在项目根目录运行

serve -s dist

在浏览器输入 http://localhost:3000 即可查看到你打包好的项目。

修改端口

serve -s dist -p 10007

2.3.2 多环境配置参数

项目使用了 umi 框架,本地开发调试时执行 start 命令,会自动传入参数 NODE_ENV = development;当我们运行umi build 命令的时候,其实umi框架已经帮我们把 NODE_ENV = production 传入进来了。

app.tsx里有个 process.env.NODE_ENV,可以在前端的请求配置文件中,通过判断 process.env.NODE_ENV 是否为 production 来指定不同的请求域名。

2.3.3 实战

  1. 修改前端的全局请求配置文件(src/plugins/globalRequest.ts),把请求地址(baseUrl)改成自己的真实请求地址,注意区分本地和线上环境。

现在对里面的umi-request请求库,做一些额外的配置,我们可以用prefix。

prefix:前缀。prefix就是可以指定我们每次请求的前缀,就可以改变咱们每次请求前面的这些地址,就是什么域名端口之类的。

  1. 使用 build 命令打包一下。npm run build(项目构建打包)。 打包之后,我们能够看见这个文件的大小,之后做性能优化什么的,可以从这个大小下手,就是看你怎么样写代码,能够把这个项目的体积能够搞的更小一些。通过build打包得到dist文件。
  2. serve。我们现在可以在本地去运行一下这个项目。

vscode:右键这个dist文件夹->在集成终端中打开。
webstrom:右键这个dist文件夹->Open In -> Terminal
或者直接cd到这个目录里

在dist文件中输入serve。

  1. 访问地址。serve得到网址。

登录local地址,查看Request URL为线上地址。

这个请求的地址由本地地址变成线上地址,也就是说,我们通过了一个环境变量就成功区分出了本地以及线上项目,那如果你要加入测试环境,可以如法炮制。

三.后端多环境

3.1 基础

后端就是提供了用户的增删改查、登录注册。用户的增删改查的数据是存在本地的mysql数据库,上线是要把这个数据库地址改成一个远程的地址,起码要公网可访问,或者说自己的前/后端项目部署的那个服务器能访问。

后端多环境主要更改:

  • 依赖的环境地址
    • 数据库地址
    • 缓存地址
    • 消息队列地址
    • 项目端口号
  • 服务器配置

3.2 分类

后端怎么去区分不同的环境?这种模式就跟前端是一样的,基本上所有的项目都是这种模式,通过在配置文件后面加一个后缀来区分环境,那后端项目也一样。

我们后端的SpringBoot 项目,通过 application.yml(配置文件) 添加不同的后缀来区分配置文件

application.yml就是公共的配置,公共配置就是任何环境它都会加载这个配置,所以像一些什么mybatis-plus这种框架层面的,就任何环境都一样的配置,就写在公共配置里就好了;

3.3 实战

3.3.1 在云服务器上安装配置mysql

  1. 在云服务器中用yum来安装配置mysql。
  2. 使用宝塔面板安装mysql。

参考上面文章,在云服务器上安装配置mysql。

3.3.2 idea连接线上数据库后的布置

参考上面文章,IDEA连接服务器mysql,进入控制台,创建数据库。

3.3.3 配置环境

application.yml配置如下图:

复制application.yml,粘贴到resources包下,重命名为application-prod.yml

mybatis-plus等公共配置保持不变,改变datasource设置,将datasource改变为线上数据库配置。

去改一下线上的配置文件,url可以去修改那里查看复制,后面加上要连接的数据库就可以了。

3.3.4 打包运行

现在要测试一下,在本地运行生产环境的项目,对于Springboot的项目就要打一个jar包
点击右侧maven->Lifecycle->鼠标左键双击package

会出现一个报错,说有一个单元测试没通过,一般情况下,在项目上线之前肯定要执行一遍单元测试的,单元测试就是要保证咱们项目运行的时候是没有问题,不过现在改有点麻烦,我们以打包为主。

点击小闪电图标,让它跳过单元测试,然后再双击package。

target包下出现构建好的jar包

快速进入终端

运行jar包,并传入上线环境参数

java -jar user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

里面有一行The following 1 profile is active: “prod”,这里就是说咱们目前的这个prod的配置文件已经生效了

3.3.5 线上数据库新用户注册

去看一下访问的是哪个数据库,只要是线上的数据库就OK了,我们现在让前端项目来对接一下,把前端项目重启。

重启后,前端页面会弹出未登录,输入账户密码,点击登录,后端报错了。

往下滑,显示数据库查不到这个用户,成功连接上线上数据库,只不过我们还没在这个线上数据库插入数据罢了。

继续验证是否连接上线上数据库,注册一个用户,然后进行登录。

服务器中的数据库中多出了一个注册的新用户,后端多环境完成。

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

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

相关文章

实验报告2-多线程并发

实验报告2-多线程并发 一、实现思路 生产者消费者问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲…

Hadoop学习之hdfs的操作

Hadoop学习之hdfs的操作 1.将HDFS中的文件复制到本地 package com.shujia.hdfs;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.After; import org.junit.Before; import org.j…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十四)- 函数式编程(3)

目录 Optional 创建对象 安全消费值 安全获取值 ofElseGet ofElseThrow 过滤 判断 数据转换 函数式接口 只有一个抽象方法的接口称为函数接口 常用默认方法 基本数据类型优化 Optional 可以避免空指针异常<br/> 创建对象 public static void main(String[…

Leetcode.560.和为k的子数组

原题链接&#xff1a;链接 代码&#xff1a; class Solution { public:int subarraySum(vector<int>& nums, int k) {int n nums.size();vector<int> vec(n1);for(int i 1;i<n;i){vec[i] vec[i-1]nums[i-1];}unordered_map<int,int> hash;hash[0…

Linux-应用编程学习笔记(三、文件属性和目录)

一、文件类型 1、普通文件&#xff08;ls -l 文件&#xff0c;权限前边第一个"-"代表普通文件&#xff1b;stat 文件&#xff09; 文本文件&#xff1a;ASCII字符 二进制文件&#xff1a;数字0/1 2、目录文件&#xff08;‘’d&#xff09;&#xff1a;文件夹 3…

利用微服务SpringCloud如何实现熔断?

熔断是一种保护机制&#xff0c;用于处理由于服务故障或负载过重引起的服务请求失败问题。在分布式系统中&#xff0c;如果一个服务发生故障或负载过重&#xff0c;它可能会导致其他依赖于它的服务也出现故障&#xff0c;最终导致整个系统崩溃。熔断器就是为了解决这个问题而设…

c语言IO

前言 老是忘记c语言IO操作&#xff0c;故写个文章记录一下 打开文件 fopen FILE *fopen(const char *path, const char *mode);mode 返回值 如果文件成功打开&#xff0c;fopen 返回一个指向 FILE 结构的指针。如果文件打开失败&#xff08;例如&#xff0c;因为文件不存…

Flutter 中的 RotationTransition 小部件:全面指南

Flutter 中的 RotationTransition 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;动画是增强用户界面和提供流畅用户体验的强大工具。RotationTransition 是 Flutter 提供的一种动画组件&#xff0c;用于在父组件大小变化时旋转子组件。本文将详细介绍 RotationTransi…

AWS数据库之Neptune

Amazon Neptune是一项快速、可靠且完全托管的图形数据库服务&#xff0c;可帮助我们轻松构建和运行使用高度互连数据集的应用程序。Amazon Neptune的核心是专门构建的高性能图形数据库引擎&#xff0c;它进行了优化以存储数十亿个关系并将图形查询延迟降低到毫秒级。 Amazon N…

跨平台之用VisualStudio开发APK嵌入OpenCV(三)

本篇将包含以下内容&#xff1a; 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门&#xff0c;我们直接使用真机进行调试&#xff0c;一方面运行速度远高于模拟器&#xff0c;另一方面模拟器使用的…

java 拦截器-用户无操作超时退出利用Redis

1、授权过滤&#xff0c;只要实现AuthConfigAdapter接口 2、利用Redis token超时时间&#xff0c;用户访问后台续时 效果 Component public class AuthFilter implements Filter {private static Logger logger LoggerFactory.getLogger(AuthFilter.class);Autowiredprivat…

OWASP top10--SQL注入(二)

目录 06&#xff1a;SQL注入提交方式 6.1、get提交 6.2、post提交 6.3、cookie提交 6.4、HTTP Header头提交 07&#xff1a;注入攻击支持类型 7.1、union注入&#xff1a; 7.1.1、union操作符一般与order by语句配合使用 7.1.2、information_schema注入 7.2、基于函数…

RAG技术中的文本分块与重排序策略:提升大型语言模型应用效果的关键

在探讨RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术中的文本分块&#xff08;Chunking&#xff09;方法时&#xff0c;我们需关注其对大型语言模型&#xff08;LLM&#xff09;应用效果的直接影响。文本分块是处理和优化信息检索过程的关键步骤&#xff0c;…

在gitlab CICD中 小试 hooks:pre_get_sources_script 功能

参考链接&#xff1a; hooks:pre_get_sources_script 功能简介 hooks:pre_get_sources_script 是gitlab CICD中的一个功能&#xff0c;该功能可以指定在克隆 Git 仓库和任何子模块之前要在执行器上执行的某些命令。例如&#xff1a; 调整 Git 配置导出跟踪变量 下来简单给…

(已开源-ICRA2023) High Resolution Point Clouds from mmWave Radar

本文提出了一种用于生成高分辨率毫米波雷达点云的方法&#xff1a;RadarHD&#xff0c;端到端的神经网络&#xff0c;用于从低分辨率雷达构建类似激光雷达的点云。本文通过在大量原始雷达数据上训练 RadarHD 模型&#xff0c;同时这些雷达数据有对应配对的激光雷达点云数据。本…

<Python实际应用>用yolov9实现垃圾检测

公司一个项目需要在无人机巡检的画面中识别垃圾和汽车&#xff0c;正好听闻yolov9最新出炉&#xff0c;于是试了一下采用yolov9来搭建该项目 1.下载和部署 下载yolov9:GitHub地址&#xff1a;GitHub代码下载地址 配置环境可以参考之前关于yolov5的文章 Yolov5自学笔记之一-…

vcpkg环境配置

vcpkg 使用linux相关库&#xff0c;设置环境变量VCPKG_ROOT&#xff0c;设置cmake工具链$VCPKG_ROOT/scripts\buildsystems\vcpkg.cmake set VCPKG_DEFAULT_TRIPLETx64-windows .\vcpkg.exe install fftw3 freetype gettext glibmm gtkmm libjpeg-turbo libpng libxmlpp libs…

驱动开发之新字符设备驱动开发

1.前言 register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数&#xff0c;现在新的 字符设备驱动已经不再使用这两个函数&#xff0c;而是使用 Linux 内核推荐的新字符设备驱动 API 函数。 旧版本的接口使用&#xff0c;感兴趣可以看下面这个博客&#…

免费图片文字转换成文本,ocr文字识别软件免费版,真的太实用了!

截屏短视频上一段扎心文字&#xff0c;想把它发到朋友圈怎么办&#xff1f;这时候就需要一个OCR识别软件。 它就像一个聪明的小助手&#xff0c;它可以帮助电脑“看懂”书本上或者图片里的字。就像我们用眼睛看字一样&#xff0c;OCR软件用它的“眼睛”扫描图片&#xff0c;识…

百亿级流量红包系统,如何做架构?(字节面试真题)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类的场景题&#xff1a; 1.如何设计高并发红包系统 &#xff0…