通过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中的upstream refreshUpstream(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); //拼接新的upstream String 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()); //替换原有的upstream conf = matcher.replaceAll(newUpstream); return true; }
-Java 调用nginx reload
Runtime.getRuntime().exec("nginx -s reload");
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
抗击疫情,阿里云数据库团队这样做…
应对逐步发酵的疫情,社会各界都做出了积极响应,贡献了自己的一份力。 那么阿里云数据库团队的同学们有何行动呢? 采访时刻 小库: 在春节和疫情防控期间,阿里云数据库如何保障客户业务的正常运行,为疫情防控提供了怎样的支持? OLTP 数据库团队 PolarDB 通过云原生弹性能力快速扩容支撑了春节和抗疫期间在线教育、游戏行业和在线办公(钉钉)等流量爆发式增长的一波业务。在疫情中,通过重保和护航等方式有力的保障了多地医院、医保、交通、出入境管理等政府系统的稳定运行,在数字经济时代助力国家全面防控疫情。 OLAP 数据库团队 数据库OLAP团队采用虚拟联合专家组的方式重点支撑教育、游戏、数字政府等行业客户,助力教育和游戏等行业实现精细化运营,助力数字政府多个省份实现全局疫情深度分析和防控。 NoSQL 数据库团队 在春节期间,NoSQL 数据库团队同学志愿参
- 下一篇
SOHO 办公场景下,企业数据保护指南
病毒肆掠,疫情严峻。为了共同抵抗疫情,众多企事业单位开始 SOHO 办公(也叫线上办公),员工尽量在家远程办公,通过钉钉、手机和邮箱等方式完成业务沟通,以有效降低人员接触导致的交叉感染风险,这是互联网时代给予疫情防御战线的一份礼物。 与此同时,这类新型的办公方式也给企事业单位的数据安全保护带来了更多挑战,主要体现在以下几个方面: 需要将部分前期仅在内网可访问的数据权限开放到互联网; 员工使用缺乏安全管控的家庭终端接入到公司内部系统中(特别是日常使用固定终端的办公人员); 数据访问源分布广泛(白名单访问控制方式极易失效); 截屏、拍照、录像等数据窃取方式缺乏监管。 云上企业如何在 SOHO 办公场景下有效实现敏感数据的保护呢? 阿里云数据安全专家建议从以下五个方面着手,提升企业数据安全保护能力: 01 控制接入 SOHO 办公方式无可避免的需要将前期
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境