JSD-2204-续 配置中心-Nginx-Linux部署java项目-Day19
1.续 配置中心
上次课我们完成了cart模块的数据库配置信息添加到nacos的操作
我们也删除了cart模块原有的连接数据库信息的配置
下面开始,我们尝试连接nacos配置中心,读取数据库配置信息,令cart模块仍然能够正常连接数据库
1.1项目读取配置
csmall-cart-webapi模块要读取连接数据库的配置
如果要读取配置中心的信息,首先要添加依赖
<!-- Nacos配置中心的依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 支持SpringCloud加载系统配置的依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
如果当前我们使用的SpringCloud版本不是2020.x
那么上面添加的依赖会有不一样的情况,要想去了解就要查阅相关资料
像其他程序一样,在添加完依赖之后,还需要添加yml文件的配置
借此机会讲解一下SpringCloud项目的配置文件加载顺序
我们学习过的配置文件大体有application.properties和application.yml两种配置文件添加配置
这两个文件如果同时存在,他们的配置都可以同时生效
但是如果两个文件配置有冲突(对同一个属性配置两次)
那么就要看加载顺序了
先加载application.yml
后加载application.properties
如果两个配置文件同时设置了同一个属性,后加载的覆盖掉先加载的
在添加上面的pom文件依赖之后,SpringCloud项目就又多了一组配置文件
它们是bootstrap.yml和bootstrap.properties
这组配置文件是SpringCloud项目才能使用的
它的作用是实际开发时,主要配置系统内容,一般都是不轻易修改的
所以这组配置文件的加载时机,整体早于application这一组
一个SpringCloud项目加载配置文件的顺序最终可能如下图
因为配置文件的特性,bootstrap这一组是加载系统配置的
所以我们读取配置中心的配置信息,最好添加在bootstrap.yml\properties中
下面我们就在cart-webapi项目中resources文件夹中添加bootstarp.yml文件
spring:cloud:nacos:config:# 指定配置中心的配置server-addr: localhost:8848# 命名空间模式就是public,可以省略# 下面配置groupgroup: DEFAULT_GROUP# SpringCloud项目,加载配置信息的规则# 默认情况下,会自动读取配置中心里,如下格式的配置信息[服务名称].[后缀名称]# 服务名称nacos-cart,后缀名下面配置的yamlfile-extension: yaml# 所以最终读取public命名空间中,DEFAULT_GROUP组下的nacos-cart.yaml
如果一切顺利,那么cart模块是可以通过knife4j测试操作连接数据库的
我们可以新增购物车信息,或删除购物车信息后检查数据库是否有对应操作
因为我们已经删除了本地yml文件中数据库的配置,所以,它能连接操作数据库一定是配置中心生效了!
1.2RestTemplate远程调用
我们现在项目中使用的RPC远程调用技术是Dubbo
实际上除了Dubbo技术之外,还有很多远程调用的方法
它们有些调用的思想都和Dubbo完全不同
Dubbo是SpringCloudAlibaba提供的功能强大的RPC框架
但是Dubbo功能也有限制,如果我们想调用的方法不是我们当前项目的组件或功能,甚至想调用的方法不是java编写的,那么Dubbo就无能为力了
我们可以使用RestTemplate来调用任何语言编写的公开的Rest路径
也就是只要能够使用浏览器访问的路径,我们都可以使用RestTemplate发送请求,接收响应
使用步骤如下
步骤1:
无需添加任何pom依赖和yml文件配置
只需在调用的发起方,也就是使用RestTemplate发起请求的项目配置文件中(指支持@Configuration注解的类或SpringBoot启动类),向Spring容器注入一个该类型对象
所有SpringBoot配置类都可以添加下面代码,我们选择SpringBoot启动类添加如下代码
在CartWebapi启动类中修改
@SpringBootApplication
// 略....
public class CsmallCartWebapiApplication {public static void main(String[] args) {SpringApplication.run(CsmallCartWebapiApplication.class, args);}@Bean// 启动负载均衡的注解,因为Dubbo直接负载均衡,RestTemplate能够代替Dubbo的功能,所以也要负载均衡@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}}
步骤2:
RestTemplate是一个能够发送请求到指定url路径的工具
我们项目中有若干控制器方法,都可以作为它调用的目标
我们可以实现在cart模块运行删除购物车商品的同时减少库存
这样就要求我们stock模块具备一个能够减少库存的控制器方法,
现在这个方法是有的,url为:/base/stock/reduce/count
但是RestTemplate调用时请求以get方法居多,post方法调用代码比较繁琐,所以将现在stock模块减少库存的方法由之前的@PostMapping修改为@GetMapping
@GetMapping("/reduce/count")
步骤3:
回到cart-webapi模块
开始调用
我们可以在当前CartController控制器方法deleteUserCart中
添加RestTemplate的调用,实现库存的减少
// 装配执行RestTemplate调用的对象
@Autowired
private RestTemplate restTemplate;@PostMapping("/delete")
@ApiOperation("删除购物车商品")
@ApiImplicitParams({@ApiImplicitParam(value = "用户ID",name="userId",example = "UU100"),@ApiImplicitParam(value = "商品编号",name="commodityCode",example = "PC100")
})
public JsonResult deleteUserCart(String userId,String commodityCode){// 下面准备调用stock模块减少库存的方法// 使用RestTemplate首先要确定调用的路径String url="http://localhost:20003/base/stock/reduce/count?" +"commodityCode={1}&reduceCount={2}";// restTemplate对象发起调用// getForObject方法参数解释// 第一个参数就是请求的url路径// 第二个参数就是访问目标方法的返回值类型的反射,他决定了返回值的类型// 第三个参数开始,是向url中占位符赋值的参数,{1}的位置 被第三个参数赋值,{2}被第四个参数赋值,以此类推JsonResult jsonResult=restTemplate.getForObject(url,JsonResult.class,commodityCode,5);System.out.println("rest调用完毕,返回值:"+jsonResult);// 原有的删除购物车的方法(未更改)cartService.deleteUserCart(userId,commodityCode);return JsonResult.ok("删除购物车商品完成!");
}
步骤4:
发送测试
将相关的模块都启动
Nacos\Seata
cart\stock
调用cart模块删除购物车中的方法
运行后检查对应商品减少库存和购物车中数据的删除效果
如果一切正常证明调用成功了
SpringCloudNetflix系统下,RestTemplate实现有一个别名叫Ribbon
如果说"Ribbon"调用,指的就是RestTemplate对象的调用过程
1.3什么是web服务器
简单来说
Web服务器就是一个能够接收http请求并作出响应的程序
webServer项目(二阶段项目)就是一个我们手写的Web服务器
我们现在开发的标准SpringBoot项目启动时内置的Web服务器叫Tomcat
实际上我们业界中还有很多Web服务器,它们具备很多不同的特征
网关Gateway项目使用Netty服务器,Netty服务器内部是NIO的所以性能更好
下图以Tomcat为例,解释请求响应流程
大多数情况我们会使用Tomcat作为Web服务器
它是我们请求\响应流程中的核心组件
Tomcat是也有缺点
常规情况下,一个tomcat并发数在100多一点
一般情况下,一个网站要1000人在线,并发数是2%~5% 也就是20~50并发
如果需要一个支持更高并发的服务器,就是需要使用Nginx
2.Nginx
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
2.1Nginx的优势
- 高并发响应性能非常好,官方 Nginx 处理静态文件并发 5万/秒
- 反向代理性能非常强。(可用于负载均衡)
- 内存和 cpu 占用率低。(为 Apache(也是一个服务器) 的 1/5-1/10)
又小又快
Nginx快速的原因
常见面试题:Nginx为什么快
Nginx使用NIO来实现,是它能快速的主要原因之一
从Nginx内部的结构和运行流程上讲,它内部是一个主进程(Master)多个工作进程(Worker)
Master负责统筹管理配置和Worker的分工
Worker来负责处理请求,作出响应
而且使用非阻塞式的,异步的来完成工作
简单来说,就是一个Worker接到一个请求后,对请求进行处理,处理后在响应返回前,这个Worker还会处理别的请求,直到请求返回响应时,才会处理响应,也就是Worker这个进程全程无阻塞
2.2正向代理
要想了解反向代理,首先了解正向代理
正向代理,当我们访问的目标服务器无法连通时,可以借助代理服务器,间接访问该目标服务器
关系类似于生活中的介绍人
2.3反向代理
而反向代理的模式为下图
请求反向代理服务器的特点是,我们请求的是代理服务器的地址,真正提供服务的服务器地址我们不需要知道,这样做的好处是反向代理服务器后可能是一个集群,方便负载均衡
有点类似于生活中的代理人(中介),有什么事情直接找这个人就能完成需求,它怎么完成的我们不用管
2.4Nginx的使用
实际开发中,Nginx可以用于反向代理服务器,
实际处理请求的是Tomcat服务器
因为Nginx优秀的静态内容并发性能
我们常常使用它做静态资源服务器
在Nginx中保存图片,文件视频等静态资源
经常和FastDFS组合使用
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
2.5Nginx和Gateway的区别
首先明确Nginx和Gateway并不冲突
他们都是统一入口的概念,它们可以同时开启
也可以开启其中一个
只不过Nginx不属于java程序,而Gateway是java程序,而且是微服务的一部分
Nginx是服务器程序我们不可编辑,
Gateway是我们自己创建的项目,依赖和配置都由我们自己完成
最终如果想做反向代理服务器,就使用Nginx
如果是微服务项目的网关就是Gateway
3.Linux部署java项目
3.1启动虚拟机
这部分的操作之前学习虚拟机时已经做过,可以参照之前的笔记即可
推荐大家重新解压纯净版的RockyLinux来实现
启动后登录rockylinux
sudo su -
修改root用户密码
passwd
下面就切换到客户端软件连接虚拟机
ifconfig
ifconfig | more
查看ip地址使用Bvssh软件连接
3.2安装java环境
连接成功后,打开命令行界执行安装java的命令
yum install java
运行过程中出现了y/N的选择,要输入y之后按回车
安装需要时间,等待即可
yum安装好的java会自动配置环境变量
验证安装
java -version
3.3创建java项目
按照创建普通SpringBoot项目的流程创建即可
注意需要勾选 Spring Web依赖
项目创建好之后,在项目的resources目录下static下创建html文件
内容编写完毕
在侧边栏选中maven运行package打包命令
打包成功后找到jar包生成的位置
进入这个位置,找到生成的jar包
将生成的jar包拖入Bvssh软件提供的复制文件的工具中
转到linux命令行
输入ll(两个小写的L)
ll
观察当前目录是否有我们拖入的jar文件
如果存在执行运行jar文件的名
java -jar [jar包名称]
[jar包名称]可以敲前面几个字母,按Tab自动补全
如果顺利启动,会看到Spring的图形Logo
下面关闭防火墙(启动Springboot项目的界面不能关,可以新开一个界面输入命令)
systemctl stop firewalld
然后可以在windows中打开浏览器访问项目
如果你愿意购买云服务器
就可以将当前项目用同样的办法,部署到云服务器中,可以让全世界人访问了
随笔
SpringCloud版本在2019年以前
都是在使用伦敦地铁站站名
后来才改为2020\2021....这样的版本号
我们的网站秒杀时每秒处理数8000
400
酷鲨商城26左右节点(服务器数)
10000
JSD-2204-续 配置中心-Nginx-Linux部署java项目-Day19相关推荐
- Linux部署Java项目
文章目录 一.启动虚拟机 二.安装java环境 三.创建java项目 一.启动虚拟机 使用RockyLinux来实现 启动后登录rockylinux sudo su - 修改root用户密码 pass ...
- nginx linux 部署web项目名,Linux部署web项目配置Nginx
1.先配置java环境 下载 jdk-7u80-linux-x64.rpm 2.下载数据库 mysql yum 安装 3.下载linux下的tomcat 解压 4.检测tomcat是否安装成功 ...
- apollo 配置中心 支持php,apollo配置中心服务端部署
apollo配置中心服务端部署 木某人 • 2020 年 05 月 07 日 Apollo服务端安装部署 apollo-configservice:提供配置获取接口,提供配置更新推送接口,接口服务对象 ...
- centos7根据端口查进程_记录一次CentOs7下Nginx+WSGI部署Django项目(超详细)
记录一次Django部署的文章,不是很熟悉Linux系统,踩了不少坑,本篇文章相当于是一个总结,我会在本文中详细介绍,部署单个Django项目和多个Django的方法,如读者有更好的方法,欢迎留言一起 ...
- nginx下部署vue项目概览 - (资源篇)
相关博客: nginx下部署vue项目概览 这里使用的是百度云的服务器,CentOS7系统的 linux服务器用centos还是ubuntu系统_Linux nginx服务器搭建以及配置 nginx部 ...
- linux部署php项目
linux服务器部署php项目 当我们项目开发完之后,都是放到测试服上面测试,可以跑通之后,再放到正式服上面,正式服都是用linux敲命令,而测试服一般都是用的宝塔,小皮面板之类部署的,这就会有一点差 ...
- 【linux部署前端项目】
linux部署前端项目(本地部署) 1.nginx安装 #在/usr/local/目录下新建nginx目录 sudo mkdir nginx #升级文件权限 sudo chmod 777 mginx ...
- nginx怎么部署php项目,nginx怎么正确部署前端项目
目的: nginx部署打包成为dist的前端项目 (学习视频分享:php视频教程) 相关知识:docker 安装与使用 docker pull nginx docker run --restart=o ...
- 在nginx上部署vue项目(history模式);
在nginx上部署vue项目(history模式): vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想has ...
最新文章
- centos6/7安装gitlab
- WCF中的REST是什么
- [转载] python画柱状图-Python绘制精美图表之双柱形图
- java 异常java.lang.UnsupportedOperationException
- Map按照key的ASCII码排序
- 微信小程序实现视频功能(二):视频列表与下载
- Python网络爬虫:空姐网、糗百、xxx结果图与源码
- 【LDO带载能力和两端压差有关】
- c语言 虚拟时钟 指针,指针式模拟时钟.doc
- 一个遮罩层怎么遮罩两个图层_巧妙运用图层做遮罩动画
- Nginx 使用 ngx_http_mirror_module 模块 复制 http请求流量
- 【转】常用邮箱的 IMAP/POP3/SMTP 设置
- 《李航 统计学习方法》学习笔记——第八章提升方法
- 学习笔记:UDP实现进程心跳检测
- 记一次低级错误:feign.FeignException: status 404 reading XXXClient#XXMethod(Long)
- 在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤
- 精致的动画特效源代码
- 密码设置之古诗九键后缀法
- matplotlib中ylabel和xlabel函数
- 解决configure: WARNING: You will need re2c 0.13.4 or later
热门文章
- vue.config.js配置说明
- VScode如何快速生成【.vue】文件骨架(配置vue.json)
- Java图片抓取2.0
- Qt操作Word——在书签处插入表格
- 2018北京大兴数字经济论坛-区块链应用创新峰会成功举办
- python编程初学指南电子书_Python编程初学者指南书籍和Python零基础快乐学习之旅...
- stylus 直转 css
- 2022年第七届智能制造机器视觉与自动化展览会
- c语言电量百分比程序,C语言实现的百分比加进度条的显示程序
- Go语言之log日志