Nginx导航
简介
最近都在弄微服务的东西,现在来记录下收获。我从一知半解到现在能从0搭建使用最大的感触有两点
1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功
2.网上博客参差不齐,有些甚至错误的。更离谱的是,好的文章阅读量除非高出天际,不然就都很低,比那些复制粘贴,随便应付的都低(这个搜索推荐算法不知道基于什么的)
通过这段时间学习,我觉得最重要是从好的博客入手,先不要着急怎么组件怎么使用,而是先了解组件的作用,大概的原理,然后才是使用,这样搭建和尝试的过程中才能更好的定位问题,最后再次回到原理和一些实际问题的处理(不知道实际问题怎样的,直接搜那个组件的面试题往往效果最好)
接下来的内容,都以导航的形式展现给大家(毕竟优秀的轮子很多,直接看大佬写的不香嘛),再顺带提些自己的理解
传送门
更多微服务的介绍可点击下方链接
微服务介绍、Nginx导航、Nacos导航、Gateway导航、Ribbon导航、Feign导航、Sentinel导航
博主微服务git练手项目:https://github.com/NiceJason/SpringCloudDemo
Nginx介绍
Ng基础原理介绍:https://blog.csdn.net/wang379275614/article/details/47777985
从以下几个方面去了解Ng:
1.讲了正向代理和反向代理的区别(其实就是请求方和接收方两个角度看事情)
2.非阻塞高并发链接,其实底层使用了epoll事件模型
这其实是linux内核+硬件的支持:https://blog.csdn.net/armlinuxww/article/details/92803381 通俗易懂的讲解了epoll事件驱动是怎么一回事
事件驱动简单来说就是两个阶段的事件模型
第一阶段:由硬件接收到信息给内核发送中断信号以此执行中断程序
第二个阶段:由内核发送唤醒信号将阻塞的进程唤醒,例如socket执行了accept()方法被阻塞了
由于是事件模型,那么肯定是异步的,因此NG能一口气接收很多请求,间接保护了背后的系统,这个事件模型其实和我们写代码时设计的事件模型一模一样,只不过事件源的产生和发送都是由内核发出,我们监听就好(同样内核也作为监听者去监听硬件)
3.Ng由多个模块组成(我们具体配置的地方),每个模块都负责不同的功能(我把这些模块理解为Web程序的过滤器,只要你写了过滤器,那每个请求过来时都会执行下过滤器)
例如最常用的Http模块,里面的各种参数常用的作用如下(具体实现百度)
负载均衡,反向代理,限流(限制并发量),限制下载速度,设置缓存(静态缓存设置),设置http头
4.Ng使用Master/Worker模型来保证可靠性(https://guisu.blog.csdn.net/article/details/8930668),这个模型引发了下面几点思考
结合Linux进程与线程的原理(https://my.oschina.net/cnyinlinux/blog/422207)可以了解到父进程和子进程的关系
Ng采用的是父进程先绑定端口然后再fork子进程,这种模型会发生惊群现象(https://www.zhihu.com/question/360939266),多个进程监听同一个端口,有消息进来后全部惊醒,最终却只有一个进程能够处理
NG是这样处理的(https://blog.csdn.net/wan_hust/article/details/38958545),将请求到来延时处理(相当于自身加个队列,变成了异步处理),然后设置一个互斥锁让多个worker去竞争,拿到锁的进程自身监听所有端口,没拿到锁的删除所有监听的端口(一开始由于继承父进程而监听所有端口),这样就变成了实际只有1个进程监听所有端口,等这个进程处理的事情满了就把锁释放出来,自身不再监听和争抢锁,消化完后再来
5.Nginx一般作为系统的最外层的网关,所有请求都先经过NG转发,一般是转发给系统服务的网关(如果有多个网关就能负载均衡啦,不过NG的负载均衡只有很简单的轮询或根据权重等,并不像Ribbon负载内部服务这么多选择),而这个转发行为,对于外面的请求来讲就是反向代理,对于系统来讲就是正向代理(一定程度上就保护了系统啦)。
6.NG可以做静态服务器,像浏览器一样存储一些静态资源的缓存,从而能快速响应
小结
作为Java后端开发,博主还是菜鸡一个,对于Ng只能浅尝辄止,具体调优还是交给专业的运维人员,了解上面大概原理之后有如下好处:
1.最重要的好处是了解公司架构,公司肯定有自己服务器,而开发是本地内网进行的,所以有些外部请求可能到不了你的内网机。例如微信支付的回调,公司Ng会配转发至内部服务器,但不会转发给你本地电脑ip。因此发现回调无效就能排查出问题,而不是一个劲的去找是不是自己操作姿势不对。
还有为了安全期间,有的环境还可能有托管机,不能直接访问,这种也是让Ng暴露一个端口。
2.清晰流程,数据的来去能更好的把握,碰到问题和新需求也能想想Ng能不能帮忙,跟运维人员吹水也不会一问三不知。个人感觉和学习前端知识一个道理,不求精通,但起码要了解,这样才能更好的开发
Nginx导航的更多相关文章
- Gateway导航
简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...
- Ribbon导航
简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...
- Sentinel导航
简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...
- nginx设置导航&安装showdoc&创建文件服务&zabbix&grafana
安装环境: [root@nginx showdoc]# cat /etc/centos-release #系统版本 CentOS Linux release 7.5.1804 (Core) [root ...
- 【干货分享】Node.js 中文学习资料和教程导航
这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...
- Nginx + spawn-fcgi- Ubuntu中文
Nginx - Ubuntu中文 页面 讨论 查看源代码 历史 导航 首页 最近更改 随机页面 页面分类 帮助 编辑 编辑指南 沙盒 新闻动态 字词处理 工具 链入页面 相关更改 特殊页面 打印版 ...
- 拿到新机器,进行初始化和部署Nginx的过程
1. 在/etc/ansbile/hosts中添加主机init 2. 在sysinit.yml中修改要初始化的机器: hosts: init 3. 设置不检查key export ANS ...
- node.js中文资料导航 Mark
Node.js HomePage Infoq深入浅出Node.js系列(进阶必读) Node.js中文文档 被误解的 Node.js Node.js C++ addon编写实战系列 热门node.js ...
- 【干货分享】Node.js 中文资料导航
这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...
随机推荐
- 网关Ocelot功能演示安排的明明白白~~~
前言 网关(Gateway)在微服务架构中至关重要,可以将其理解为是外部客户端(前端.MVC后台等调用方)与后台服务的连接点,通过这层可以做统一的处理,比如路由.身份认证和授权.服务治理等: 网关的好 ...
- JS定时器使用,定时定点,固定时刻,循环执行
JS定时器使用,定时定点,固定时刻,循环执行 本文概述:本文主要介绍通过JS实现定时定点执行,在某一个固定时刻执行某个函数的方法.比如说在下一个整点执行,在每一个整点执行,每隔10分钟定时执行的方法. ...
- ( ) 与 { } 差在哪?-- Shell十三问<第七问>
( ) 与 { } 差在哪?-- Shell十三问<第七问> 先说一下,为何要用 ( ) 或 { } 好了. 许多时候,我们在 shell 操作上,需要在一定条件下一次执行多个命令,也就是 ...
- 文件连接--ln
ln -n file1 file2 将文件2设置为文件1的软连接:file1和file2 任何一个改动都会反馈到另一方,删除源文件, 软连接文件不可用 ln -s file1 file2 将文件2 ...
- python基础(二):数据类型
数据类型 学习Python时,一定要注意Python中数据类型和数据结构的学习,这对于你是否能够学好Python其中很重要的作用. 什么是数据类型? 人类有思想,很容易区分汉字和数字的区别,例如,你知 ...
- 5. linux 中“~”,“/”,“#”,”$“ 含义
"~" ~ 是用户的home目录(又叫"用户家目录")linux存储是以挂载的方式,相当于是树状的,源头就是"/",也就是根目录.而每个用户 ...
- Day01_04_Java标识符命名规范
Java标识符命名规范 什么是标识符? 在程序中程序员有权利自己命名的单词都是标识符(类名 方法名 变量名 常量名 接口名) 标识符命名规则 标识符用作给变量.类和方法命名 标识符以由大小写字母.数字 ...
- SpringMVC请求参数解析
请求参数解析 客户端请求在handlerMapping中找到对应handler后,将会继续执行DispatchServlet的doPatch()方法. 首先是找到handler对应的适配器. Hand ...
- 深度解析Django REST Framework 批量操作
我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们 ...
- Linux安装MySQL8高版本压缩包(通用)
前言 前段时间领导让我部署测试环境,希望安装高版本的MySQL,过程遇到很多问题,特此记录帮助迷失的人们 下载 MySQL官方下载地址:https://dev.mysql.com/downloads/ ...