通过Nacos让Nginx拥有服务发现能力
通过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的服务发现。
下载二进制包
点击此处下载:最新稳定版
配置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" |
启动,即可使用
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拥有服务发现能力相关推荐
- Nacos注册中心和服务消费方式
哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...
- Nginx网站服务与LNMP架构部署(详解)
Nginx网站服务与LNMP架构部署 1.Nginx服务基础 2.编译安装Ngiax 3.Nginx的运行控制 4.配置文件nginx.conf 5.Nginx虚拟主机 6.LNMP架构部署 1.源码 ...
- Nacos注册中心和服务消费方式(服务治理)
目录 一.服务治理介绍 什么是服务治理? 二.nacos简介 三.nacos实战入门 1.搭建nacos环境 2.将商品.订单.微服务注册到nacos 四.实现服务调用的负载均衡 1.什么是负载均衡 ...
- 四章——Nginx网站服务(应用——linux防护与群集)
三期总目录链接 目录 一.Nginx服务 1.安装及运行控制 2.配置文件nginx.conf 2.1全局配置 解释: 2.2 I/O事件配置 解释: 2.3 HTTP配置 解释: 3 ...
- 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关
微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...
- Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理
前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...
- 【转载】nginx for windows: 让nginx以服务的方式运行
nginx for windows: 让nginx以服务的方式运行 在windows下安装了nginx, 郁闷是发现它没有以服务方式运行, 也就是说当用户注销后,程序 会终止.因此需要将nginx作为 ...
- Nginx Web服务应用
Nginx("engine x")是一个开源的,支持高性能.高并发的WWW服务和代理服务软件.它还具有反向代理负载均衡功能和缓存服务功能. 1 Nginx的几个常见的重要特性 1. ...
- 02 | 服务治理:Nacos 如何实现微服务服务治理
前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...
最新文章
- 如何在NLP领域应用卷积神经网络CNN
- Elasticsearch深入11 运维
- Ksenia and Pan Scales(思维题)
- 计算机二级办公室软件应用选择题,计算机二级,办公软件高级应用技术有没有选择题和判断题的...
- 数据类型,隐式类型转换
- Tomcat监控xml ,当修改xml后,不用重启tomcat
- WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习
- JPA 2.1实体图–第1部分:命名实体图
- 决策树之前要不要处理缺失值_不要使用这样的决策树
- 爱国者首款手机正式上市 零售价不超2000元
- 杭电 1242题(深度优先搜索)
- Chrome开发者工具插件
- 【网易云信】直播推流SDK特性、系统架构、使用说明
- 产品管理系统(MVC设计模式)——第一个Javaee项目
- 前端|如何制作调查问卷
- 小程序切出去重新进入
- 益而优有机核桃油给宝宝安全放心的油!
- 如何用计算机打出平方,如何用电脑打出平方?平方米符号输入方法介绍
- 百练:2408:Anagram Groups
- nnet3-chain-copy-egs用于chain模型输入数据