Docker-Swarm-下-NATS-集群的构建与使用

2021-12-17 09:30:39 浏览数 (1)

NATS 是一个开源的、轻量级的、高性能的分布式消息通信系统,实现了高可伸缩性和优雅的发布/订阅模型。 NATS 适合云基础设施的消息通信系统、物联网设备消息通信和微服务架构。

❤️ 环境准备

三台服务器,建立 Docker Swarm 集群,一个 Manager,两个 Worker。

  • docker 版本:17-09
  • nats 版本:1.0.4

❤️ Nats 集群架构设计

❤️ 搭建集群

1、【Manager】创建集群网络

代码语言:javascript复制
docker network create -d overlay --attachable mongo

--attachable 允许其他容器加入此网络

2、创建 Nats 集群

2.1、【Manager】创建 stack.yml

代码语言:javascript复制
version: '3.3'
services:
  nats1:
    image: registry.docker-cn.com/library/nats
    command: --cluster nats://0.0.0.0:5222 -routes nats://nats2:5222,nats://nats3:5222
    ports:
      - 4222
    networks:
      - nats
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.hostname==manager
  nats2:
    image: registry.docker-cn.com/library/nats
    command: --cluster nats://0.0.0.0:5222 -routes nats://nats1:5222,nats://nats3:5222
    ports:
      - 4222
    networks:
      - nats
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.hostname==worker1
  nats3:
    image: registry.docker-cn.com/library/nats
    command: --cluster nats://0.0.0.0:5222 -routes nats://nats1:5222,nats2:5222
    ports:
      - 4222
    networks:
      - nats
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.hostname==worker2
networks:
  nats:
    external: true

2.2、【Manager】启动集群

代码语言:javascript复制
docker stack deploy -c stack.yml nats

2.3、【Manager】查看服务的启动情况

代码语言:javascript复制
docker service ls

3、连接集群

  • 外部【用于测试】:查看端口随机的端口映射(netstat -ntlp),一般为 30000~30002,连接时指定多个URL:
代码语言:javascript复制
nats://managerIP:30000
nats://managerIP:30001
nats://managerIP:30002
  • 内部【限 nats 网络下的服务或容器】:
代码语言:javascript复制
nats://nats1:4222
nats://nats2:4222
nats://nats3:4222

❤️ 在 Spring Boot 中连接 Nats 集群

1、 添加 Maven 依赖

代码语言:javascript复制
<!-- Nats -->
        <dependency>
            <groupId>com.github.cloudfoundry-community</groupId>
            <artifactId>nats-client</artifactId>
            <version>0.6.7</version>
        </dependency>

        <!-- Spring Boot 配置处理 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

2、 Nats 属性配置类 NatsProperties.java

代码语言:javascript复制
@ConfigurationProperties(prefix = "spring.nats")
@Data
public class NatsProperties {

    private String[] urls;

}

3、Nats 自动配置类 NatsAutoConfiguration.java

代码语言:javascript复制
@org.springframework.context.annotation.Configuration
@EnableConfigurationProperties(NatsProperties.class)
@ConditionalOnClass(Nats.class)
@Log4j2
public class NatsAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(Nats.class)
    public Nats nats(NatsProperties natsProperties) {
        NatsConnector natsConnector = new NatsConnector();
        for (String url : natsProperties.getUrls()) {
            natsConnector.addHost(url);
        }
        return natsConnector.connect();
    }

}

4、application.yml 配置示例

代码语言:javascript复制
spring:
  nats:
    urls:
      - nats://192.168.99.100:30000
      - nats://192.168.99.100:30001
      - nats://192.168.99.100:30002

提示:如需在 yml 文件中提示自定义的配置属性,可以新建文件 resources/META-INF/spring.factories,内容如下:org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.ictgu.config.nats.NatsAutoConfiguration

5、使用 Nats 订阅发布消息

代码语言:javascript复制
@Autowired
private nats.client.Nats nats;

...

// 订阅消息
public void subscribe() {
    nats.subscribe("some.nats.subject", new MessageHandler() {
    @Override
        public void onMessage(Message message) {
            System.out.println("Received: "   message);
        }
    });
}

// 发布消息
public void send() {
    nats.subscribe("some.nats.subject", "message content");
}

0 人点赞