现状

我们想把自己的 http 服务注册 nacos,然后使用nginx 来实现反向代理。官方提供了一个方案是 通过 java 来订阅nacos 。当服务 ip 出现变化的时候。重新生成一份 nginx 配置文件,把然后 通过nginx -s reload 让nginx 进程重启来加载 新的配置文件。

这种方式在 QPS 较高的情况下会造成服务抖动。如果nginx 代理的服务特别多。那主要一个服务出现变化 nginx 就会重启,一天可能重启很多次。

新的方案

我们要解决这个问题,还是得老老实实对nginx 做修改,新开发一个nacos 模块来订阅后端服务。模块已经开发完成,推荐一下.。GitHub - zhwaaaaaa/nginx-nacos-upstream: nginx dynamic upstream module for nacos. subcribe nacos and update address automaticly without reloading config

使用步骤

  1.  首先得把这个带 nacos 模块的 nginx 下载下来然后编译。
git clone https://github.com/zhwaaaaaa/nginx-nacos-upstream.git
cd nginx-nacos-upstream
./configure --add-module=modules/auxiliary --add-module=modules/nacos && make

    2. 启动一个nacos(略,参考nacos 官方文档)。   

    3. 准备一个 http服务来测试一下。使用 spring+nacos 最方便。一共只有几行代码。https://github.com/zhwaaaaaa/springmvc-nacos-registry。返回自己当前使用的端口

@SpringBootApplication
@EnableDiscoveryClient
public class RegistryDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(RegistryDemoApplication.class, args);
    }

    @RestController
    public static class RegistryController {
        @Value("${server.port}")
        private int port;

        @GetMapping("/hello")
        public String helloWorld() {
            return "Current server is running on " + port;
        }
    }
}

配置文件指定 nacos 服务地址

server:
  port: 8080
spring:
  application:
    name: springmvc-nacos-demo
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848


4. 使用带 nacos 模块的 nginx 来代理这个服务。准备配置文件

nacos {
    server_list localhost:8848; # nacos 服务器列表,空格隔开
    udp_port 19999; #udp 端口号
    udp_ip 127.0.0.1; #udp ip 地址。
    udp_bind 0.0.0.0:19999; # 绑定udp 地址
    error_log logs/nacos.log info;
    default_group DEFAULT_GROUP; # 默认的nacos group name
    cache_dir cmake-build-debug/nacos/;
}
http {
    upstream s {
        # 这里得指定 为 spring 的项目名,nacos 使用appname 作为 dataid
        use_nacos_address data_id=springmvc-nacos-demo;
    }
    server {
        # ... other config
        location ^~ / {
            proxy_pass http://s;
        }
    }
}

启动nginx 。 curl http://127.0.0.1:9999/hello 。

敬请玩吧

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐