⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Nginx/nginx-dynamic-upstream/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

随着SOA、微服务越来越流行,注册发现服务已经成为架构里的标配。无论是在选择Dubbo、Dubbox、Spring Cloud都提供了对应的方案,我们不需要每次新增一个节点,就去修改对应配置。那么在使用Nginx的时候我们该怎么做呢? 参考类似服务发现的方案,我们选择了微博开源的nginx插件:https://github.com/weibocom/nginx-upsync-module 。

基于tengine安装

  • tengine:2.2.0(基于nginx1.8.1+)
  • nginx-upsync-module:v1.0.0(基于nginx1.8.1+)
  • 注册发现服务:etcd 3.0.15

问题:

  • nginx的error.log不断报错recv() failed (104: Connection reset by peer)

    原因:该问题使用etcd会存在。作者在commit#89bf40fb60268062aaeac3780ad8d56f0834c400已经修复。由于该修复的提交是基于nginx 1.9.1+,我们无法直接在tegine2.2.0上使用。等待作者回复如何解决中。 补充说明:即使报该错误,实际不影响插件的功能。

基于nginx安装

由于基于tegine2.2.0会报错,因此我们尝试使用nginx官方版本安装

  • nginx:1.10.1
  • nginx-upsync-module:commit#6e1a9fe9117361539837efc81ac45303d7494dbe(基于nginx1.9.1+)
  • 注册发现服务:etcd 3.0.15

问题:

  • 如果我们需要使用nginx_upstream_check_module 插件,需要使用https://github.com/yaoweibin/nginx_upstream_check_module 下的,不然make时会报错。另外在patch -p1 < check.patch时,请cd nginx的目录下,输入patch -p1 < /path/to/nginx_http_upstream_check_module/check.patch。这点README.md也说了,当时太着急,没去看,卡了半小时。

      $ wget 'http://nginx.org/download/nginx-1.0.14.tar.gz'
      $ tar -xzvf nginx-1.0.14.tar.gz
      $ cd nginx-1.0.14/
      $ patch -p1 < /path/to/nginx_http_upstream_check_module/check.patch
      $ ./configure --add-module=/path/to/nginx_http_upstream_check_module
      $ make
      $ make install
    

基于docker安装

TODO

原理

  1. 实时性:upstream更新依赖注册中心提供的查询的http接口。这点和Dubbo、Spring Cloud的注册发现的实时性有些不同。如果对实时性要求特别高,可以调整upsync_interval参数。
  2. Zookeeper的支持:目前官方暂时未提供相应的支持。考虑到很多团队是使用Zookeeper作为服务发现,另外维护一个etcd、consul集群是有相应学习成本和运维成本的。那么怎么办?我们可以封装Zookeeper提供http接口给nginx-upsync-module使用,当然接口形式得满足consual或者etcd提供的http接口。

参考文章

知识星球

  1. nginx动态配置及服务发现那些事:http://xiaorui.cc/2016/10/16/nginx动态配置及服务发现那些事/
文章目录
  1. 1. 基于tengine安装
  2. 2. 基于nginx安装
  3. 3. 基于docker安装
  4. 4. 原理
  5. 5. 参考文章