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

栏目: IT技术 · 发布时间: 6年前

内容简介:先来回忆一下,当我们的服务实例变化时,要手动修改在微服务架构下,我们的服务均已经注册到 注册中心 例如(nacos/eureka),注册中心已经维护所有服务实例的

背景

先来回忆一下, 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拥有服务发现能力

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

  1. 下载二进制包

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

  2. 配置config.toml

    配置文件使用 TOML 进行配置

nacos_addr = "172.16.0.100:8848" #nacos 服务地址

reload_interval = 1000 # 刷新间隔

[discover_config1]

nginx_config = "/etc/nginx/nginx.conf" #nginx config 配置

nginx_upstream = "upsteam1" #upstream 名称

nacos_service_name = "service1" #nacos 服务名称

[discover_config2]

nginx_config = "/etc/nginx/nginx.conf"

nginx_upstream = "upsteam2"

nacos_service_name = "service2"

3. #### 启动,即可使用

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");


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

让大象飞

让大象飞

[美] 史蒂文·霍夫曼 / 周海云、陈耿宣 / 中信出版社 / 2017-3 / 69.00

这是一本为中国创业者量身定做的创业指南,将帮助创业者理解创新的基本方法、模式和硅谷的创业理念。作者霍夫曼频繁地穿梭于中美两地,与不同的创业者、投资人、政府负责人进行对话,积累了大量的来自中国创业者的第一手经验。在这本书里,从创业团队的人员配备到创业融资的成败再到团队的高效管理,从创业者的心理素质到创业者的独到眼光再到企业赖以生存的根本,360度无死角地呈现了一家公司从初创到惊艳到立足再到稳定的全过......一起来看看 《让大象飞》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具