通过Nacos让Nginx拥有服务发现能力

背景

先来回忆一下, nginx 如何配置多个实例的负载均衡,配置如下:

upstream serverList {server 172.17.0.111:9999;server 172.17.0.110:9999;
}server {location / {proxy_pass  http://serverList;}
}

当我们的服务实例变化时,要手动修改 nginx.conf 然后 nginx -s reload 。

在微服务架构下,我们的服务均已经注册到 注册中心 例如(nacos/eureka),注册中心已经维护所有服务实例的 IP:PORT 列表 ,为何不直接通过 nginx 来获取注册中心中的IP:PORT 列表自动配置 upstream 和热更新。
如上思路实现有如下:

  • 使用 nginx-lua-module 模块编写 lua 脚本, 调用注册中心的 Http API 来获取实例列表 配置 upstream,定时 reload 热更新
  • 使用 JAVA/Golang 编写单独的agent,直接使用nacos 对应语言的 SDK ,获取实例列表生成 upstream,并且使用 Naocs SDK 监听服务变化 reload

nacos-nginx-template 使用

nacos-nginx-template 以上的第二种思路实现以Agent的形式让Nginx实现对Nacos的服务发现。

  1. 下载二进制包

点击此处下载:最新稳定版

  1. 配置config.toml

配置文件使用TOML进行配置

nginx_cmd = "/usr/sbin/nginx"
nacos_addr = "172.16.0.100:8848,172.16.0.101:8848,172.16.0.102:8848"
reload_interval = 1000[discover_config1]
nginx_config = "/etc/nginx/nginx.conf"
nginx_upstream = "upsteam1"
nacos_service_name = "service1"[discover_config2]
nginx_config = "/etc/nginx/nginx.conf"
nginx_upstream = "upsteam2"
nacos_service_name = "service2"
参数 描述 例子
nginx_cmd nginx命令的全路径 "/usr/sbin/nginx"
nacos_addr nacos的地址 "172.16.0.100:8848,172.16.0.101:8848,172.16.0.102:8848"
reload_interval nginx reload命令执行间隔时间(ms 默认值1000) 1000
nacos_service_name nacos服务名 "com.nacos.service.impl.NacosService"
nginx_config 需要修改nginx配置的路径 "/etc/nginx/nginx.conf"
nginx_upstream nginx中upstream的名字 "nacos-service"
  1. 启动,即可使用

sh bin/startup.sh

核心代码

  • 获取 config.toml 配置的信息,支持多个 upstream ,调用Nacos Api 拉取实例列表
for (DiscoverConfigBO configBO : list) {namingService.subscribe(configBO.getServiceName(),event -> {List<Instance> instances = namingService.getAllInstances(configBO.getServiceName());//更新nginx中的upstreamrefreshUpstream(instances, configBO.getUpstream(), configBO.getConfigPath());});
}
  • 根据实例列表,拼凑 upstream
    private boolean refreshUpstream(List<Instance> instances, String nginxUpstream, String nginxConfigPath) {//获取到upstream 名称Pattern pattern = Pattern.compile(UPSTREAM_REG.replace(PLACEHOLDER, nginxUpstream));//获取到配置文件内容String conf =  FileUtl.readStr(nginxConfigPath);//拼接新的upstreamString newUpstream = UPSTREAM_FOMAT.replace(PLACEHOLDER, nginxUpstream);StringBuffer servers = new StringBuffer();if (instances.size() > 0) {for (Instance instance : instances) {//不健康或不可用的跳过if (!instance.isHealthy() || !instance.isEnabled()) {continue;}servers.append(formatSymbol + "    server " + instance.getIp() + ":" + instance.getPort() + ";\n");}}servers.append(formatSymbol);newUpstream = newUpstream.replace(PLACEHOLDER_SERVER, servers.toString());//替换原有的upstreamconf = matcher.replaceAll(newUpstream);return true;}

-Java 调用nginx reload

Runtime.getRuntime().exec("nginx  -s reload");

通过Nacos让Nginx拥有服务发现能力相关推荐

  1. Nacos注册中心和服务消费方式

    哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...

  2. Nginx网站服务与LNMP架构部署(详解)

    Nginx网站服务与LNMP架构部署 1.Nginx服务基础 2.编译安装Ngiax 3.Nginx的运行控制 4.配置文件nginx.conf 5.Nginx虚拟主机 6.LNMP架构部署 1.源码 ...

  3. Nacos注册中心和服务消费方式(服务治理)

    目录 一.服务治理介绍 什么是服务治理? 二.nacos简介 三.nacos实战入门 1.搭建nacos环境 2.将商品.订单.微服务注册到nacos 四.实现服务调用的负载均衡 1.什么是负载均衡 ...

  4. 四章——Nginx网站服务(应用——linux防护与群集)

    三期总目录链接 目录 一.Nginx服务 1.安装及运行控制 2.配置文件nginx.conf 2.1全局配置   解释: 2.2  I/O事件配置   解释: 2.3 HTTP配置    解释: 3 ...

  5. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  6. Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理

    前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...

  7. 【转载】nginx for windows: 让nginx以服务的方式运行

    nginx for windows: 让nginx以服务的方式运行 在windows下安装了nginx, 郁闷是发现它没有以服务方式运行, 也就是说当用户注销后,程序 会终止.因此需要将nginx作为 ...

  8. Nginx Web服务应用

    Nginx("engine x")是一个开源的,支持高性能.高并发的WWW服务和代理服务软件.它还具有反向代理负载均衡功能和缓存服务功能. 1 Nginx的几个常见的重要特性 1. ...

  9. 02 | 服务治理:Nacos 如何实现微服务服务治理

    前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...

最新文章

  1. 如何在NLP领域应用卷积神经网络CNN
  2. Elasticsearch深入11 运维
  3. Ksenia and Pan Scales(思维题)
  4. 计算机二级办公室软件应用选择题,计算机二级,办公软件高级应用技术有没有选择题和判断题的...
  5. 数据类型,隐式类型转换
  6. Tomcat监控xml ,当修改xml后,不用重启tomcat
  7. WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习
  8. JPA 2.1实体图–第1部分:命名实体图
  9. 决策树之前要不要处理缺失值_不要使用这样的决策树
  10. 爱国者首款手机正式上市 零售价不超2000元
  11. 杭电 1242题(深度优先搜索)
  12. Chrome开发者工具插件
  13. 【网易云信】直播推流SDK特性、系统架构、使用说明
  14. 产品管理系统(MVC设计模式)——第一个Javaee项目
  15. 前端|如何制作调查问卷
  16. 小程序切出去重新进入
  17. 益而优有机核桃油给宝宝安全放心的油!
  18. 如何用计算机打出平方,如何用电脑打出平方?平方米符号输入方法介绍
  19. 百练:2408:Anagram Groups
  20. nnet3-chain-copy-egs用于chain模型输入数据

热门文章

  1. 自适应好看的引导单页源码-无后台
  2. cmd命令行启动、停止IIS,打开iis net start w3svc
  3. 通过代码生成机制实现强类型编程-CodeSimth版
  4. CSS尺寸和字体单位-em、px还是%
  5. 如何使用HTML5嵌入视频
  6. UITextField 文本字段控件 -- IOS (解决键盘遮住View及密文設定的问题)(实例)
  7. Google AJAX 搜索 API
  8. Google News优化技巧
  9. JVM——内存区域:运行时数据区域详解
  10. StringBuffer的基本用法 2101 0311