简介

最近都在弄微服务的东西,现在来记录下收获。我从一知半解到现在能从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导航的更多相关文章

  1. Gateway导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  2. Ribbon导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  3. Sentinel导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  4. nginx设置导航&安装showdoc&创建文件服务&zabbix&grafana

    安装环境: [root@nginx showdoc]# cat /etc/centos-release #系统版本 CentOS Linux release 7.5.1804 (Core) [root ...

  5. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  6. Nginx + spawn-fcgi- Ubuntu中文

    Nginx - Ubuntu中文 页面 讨论 查看源代码 历史   导航 首页 最近更改 随机页面 页面分类 帮助 编辑 编辑指南 沙盒 新闻动态 字词处理 工具 链入页面 相关更改 特殊页面 打印版 ...

  7. 拿到新机器,进行初始化和部署Nginx的过程

    1. 在/etc/ansbile/hosts中添加主机init 2. 在sysinit.yml中修改要初始化的机器:   hosts: init 3. 设置不检查key      export ANS ...

  8. node.js中文资料导航 Mark

    Node.js HomePage Infoq深入浅出Node.js系列(进阶必读) Node.js中文文档 被误解的 Node.js Node.js C++ addon编写实战系列 热门node.js ...

  9. 【干货分享】Node.js 中文资料导航

    这篇文章与大家分享一批高质量的的 Node.js 中文资料.Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用 Node ...

随机推荐

  1. 网关Ocelot功能演示安排的明明白白~~~

    前言 网关(Gateway)在微服务架构中至关重要,可以将其理解为是外部客户端(前端.MVC后台等调用方)与后台服务的连接点,通过这层可以做统一的处理,比如路由.身份认证和授权.服务治理等: 网关的好 ...

  2. JS定时器使用,定时定点,固定时刻,循环执行

    JS定时器使用,定时定点,固定时刻,循环执行 本文概述:本文主要介绍通过JS实现定时定点执行,在某一个固定时刻执行某个函数的方法.比如说在下一个整点执行,在每一个整点执行,每隔10分钟定时执行的方法. ...

  3. ( ) 与 { } 差在哪?-- Shell十三问<第七问>

    ( ) 与 { } 差在哪?-- Shell十三问<第七问> 先说一下,为何要用 ( ) 或 { } 好了. 许多时候,我们在 shell 操作上,需要在一定条件下一次执行多个命令,也就是 ...

  4. 文件连接--ln

    ln -n file1 file2  将文件2设置为文件1的软连接:file1和file2 任何一个改动都会反馈到另一方,删除源文件, 软连接文件不可用 ln -s file1 file2  将文件2 ...

  5. python基础(二):数据类型

    数据类型 学习Python时,一定要注意Python中数据类型和数据结构的学习,这对于你是否能够学好Python其中很重要的作用. 什么是数据类型? 人类有思想,很容易区分汉字和数字的区别,例如,你知 ...

  6. 5. linux 中“~”,“/”,“#”,”$“ 含义

    "~" ~ 是用户的home目录(又叫"用户家目录")linux存储是以挂载的方式,相当于是树状的,源头就是"/",也就是根目录.而每个用户 ...

  7. Day01_04_Java标识符命名规范

    Java标识符命名规范 什么是标识符? 在程序中程序员有权利自己命名的单词都是标识符(类名 方法名 变量名 常量名 接口名) 标识符命名规则 标识符用作给变量.类和方法命名 标识符以由大小写字母.数字 ...

  8. SpringMVC请求参数解析

    请求参数解析 客户端请求在handlerMapping中找到对应handler后,将会继续执行DispatchServlet的doPatch()方法. 首先是找到handler对应的适配器. Hand ...

  9. 深度解析Django REST Framework 批量操作

    我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们 ...

  10. Linux安装MySQL8高版本压缩包(通用)

    前言 前段时间领导让我部署测试环境,希望安装高版本的MySQL,过程遇到很多问题,特此记录帮助迷失的人们 下载 MySQL官方下载地址:https://dev.mysql.com/downloads/ ...