写文章

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

2018-11-29 22:11:14

2019 | 0 | 0

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


环境准备

 

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

  •  docker 版本:17-09

  • nats 版本:1.0.4


Nats 集群架构设计

images/Fz5KpXEPJwCaTYFzf3FEKP6KMm5sBCsw.jpg


搭建集群

 

1、【Manager】创建集群网络

docker network create -d overlay --attachable mongo

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


2、创建 Nats 集群

2.1、【Manager】创建 stack.yml

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】启动集群

docker stack deploy -c stack.yml nats


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

docker service ls

3、连接集群

  • 外部【用于测试】:查看端口随机的端口映射(netstat -ntlp),一般为      30000~30002,连接时指定多个URL

nats://managerIP:30000
nats://managerIP:30001
nats://managerIP:30002

  • 内部【限 nats 网络下的服务或容器】:

nats://nats1:4222
nats://nats2:4222
nats://nats3:4222

Spring Boot 中连接 Nats 集群

1 添加 Maven 依赖

       <!-- 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

@ConfigurationProperties(prefix = "spring.nats")
@Data
public class NatsProperties {
 
    private String[]      urls;
 
}

3Nats 自动配置类 NatsAutoConfiguration.java

@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();
    }
 
}

4application.yml 配置示例

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 订阅发布消息

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

文章来源:http://mp.weixin.qq.com/s/T3Iu8ltIKhQUObA5MAVGcg

Docker视频教程学习地址:http://www.roncoo.com/course/view/3e9d9c48f76f4c698b8349d04b763467


0

收藏
分享