❤️ 环境准备
三台服务器,建立 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:
nats://managerIP:30000
nats://managerIP:30001
nats://managerIP:30002
- 内部【限 nats 网络下的服务或容器】:
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
@ConfigurationProperties(prefix = "spring.nats")
@Data
public class NatsProperties {
private String[] urls;
}
3、Nats 自动配置类 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();
}
}
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");
}