常用注册中心
Nacos、Eureka、Zookeeper、Consul、Etcd.....
Nacos | Eureka | Zookeeper | |
---|---|---|---|
数据存储 | 存储在内存ConcurrentHashMap | 存储在内存ConcurrentHashMap | 存储在内存NodeDataBase |
通信协议 | gRPC | http | jute |
数据变更推送方式 | push + pull | pull (30s一次) | push |
集群模式CAP模型 | AP (默认) / CP | AP | CP |
Nacos结构图
Nacos2
gRPC(http2 + protobuf)
鉴权、加密
Nacos简单应用
@RestController
public class NacosController {
@NacosInjected
private NamingService namingService;
// 注册服务
@GetMapping("/registry")
public void registry() {
Instance instance = new Instance();
instance.setClusterName("test");
instance.setEnabled(true);
instance.setEphemeral(true); //临时是AP,持久是CP
instance.setIp("192.168.1.101");
instance.set(8080);
namingService.registerInstance("test-service", instance);
}
// 查找服务
@GetMapping("/discovery")
public List<Instance> get(@RequestParam String serviceName) {
return namingService.getAllInstances(serviceName);
}
// 订阅服务:服务变更能够感知到,通过这可以实现push推送数据变化
@GetMapping("/sub")
public List<Instance> get(@RequestParam String serviceName) {
namingService.subscribe(serviceName, new EventListener(){
@override
public void onEvent(Event event) {
System.out.println("收到地址变更事件");
NamingEvent namingEvent = (NamingEvent)event;
System.out.println(namingEvent.getServiceName() + ":" + namingEvent.getClusters());
}
});
}
}
Namespace 和 Group
多租户设计(隔离)
namespace:可用来区分不同环境 - dev/prod/test
group:区分同一环境下的不同模块
Nacos配置中心
实现一个配置中心需要考虑的问题:
服务端的配置存储
配置的CRUD
配置的动态感知
SpringCloud注解实现动态感知
@RefreshScope
@Value
Nacos多环境配置
spring中通过spring.profiles配置不同环境