consul、eureka、nacos对比

配置中心

  • eureka 不支持
  • consul 支持 但用起来非常麻烦,不符合springBoot框架的命名风格,支持动态刷新
  • nacos 支持 用起来简单,符合springBoot的命名风格,支持动态刷新

注册中心

  • eureka

    1. 依赖:依赖ZooKeeper
    2. 应用内/外:直接集成到应用中,依赖于应用自身完成服务的注册与发现,
    3. ACP原则:遵循AP(可用性+分离容忍)原则,有较强的可用性,服务注册快,但牺牲了一定的一致性。
    4. 版本迭代:2.0不再更新(建议用nacos)
    5. 集成支持:只支持SpringCloud集成
    6. 访问协议:HTTP
    7. 雪崩保护:支持雪崩保护
    8. 上手:容易
  • consul

    1. 依赖:不依赖其他组件
    2. 应用内/外:属于外部应用,侵入性小
    3. ACP原则:遵循CP原则(一致性+分离容忍) 服务注册稍慢,由于其一致性导致了在Leader挂掉时重新选举期间真个consul不可用。
    4. 版本迭代:目前仍然进行版本迭代
    5. 集成支持:支持SpringCloud K8S集成
    6. 访问协议:HTTP/DNS
    7. 雪崩保护:不支持雪崩保护
    8. 上手:复杂
  • nacos

    1. 依赖:不依赖其他组件
    2. 应用内/外:属于外部应用,侵入性小
    3. ACP原则:通知遵循CP原则(一致性+分离容忍) 和AP原则(可用性+分离容忍)
    4. 版本迭代:目前仍然进行版本迭代
    5. 集成支持:支持Dubbo 、SpringCloud、K8S集成
    6. 访问协议:HTTP/动态DNS/UDP
    7. 雪崩保护:支持雪崩保护

背景

Netflix OSS下的诸多重要组件先后宣布停止新功能开发的大背景,而Spring Cloud Alibaba是一个新生项目,正处于高速迭代中,还很好用

下载

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U  
cd distribution/target/nacos-server-$version/nacos/bin

安装

sh startup.sh -m standalone

在这里插入图片描述

熟悉服务

服务注册

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8088'

服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

Nacos集成开发

SpringBoot启动配置管理

添加依赖

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>
  1. 配置地址

    nacos.config.server-addr=127.0.0.1:8848
    
  2. 使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新

    @SpringBootApplication
    @NacosPropertySource(dataId = "example", autoRefreshed = true)
    public class NacosConfigApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigApplication.class, args);
        }
    }
    
  3. 过 Nacos 的 @NacosValue 注解设置属性值。

    @Controller
    @RequestMapping("config")
    public class ConfigController {
    
        @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
        private boolean useLocalCache;
    
        @RequestMapping(value = "/get", method = GET)
        @ResponseBody
        public boolean get() {
            return useLocalCache;
        }
    }
    
  4. 启动 NacosConfigApplication,调用 curl http://localhost:8088/config/get,返回内容是 false

  5. curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"
    
  6. 访问 http://localhost:8088/config/get,此时返回内容为true,说明程序中的useLocalCache值已经被动态更新了。

    启动服务发现

    1. 添加依赖

      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>nacos-discovery-spring-boot-starter</artifactId>
          <version>${latest.version}</version>
      </dependency>
      
    2. 使用 @NacosInjected 注入 Nacos 的 NamingService 实例

      @Controller
      @RequestMapping("discovery")
      public class DiscoveryController {
      
          @NacosInjected
          private NamingService namingService;
      
          @RequestMapping(value = "/get", method = GET)
          @ResponseBody
          public List<Instance> get(@RequestParam String serviceName) throws NacosException {
              return namingService.getAllInstances(serviceName);
          }
      }
      
      @SpringBootApplication
      public class NacosDiscoveryApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(NacosDiscoveryApplication.class, args);
          }
      }
      
    3. 启动 NacosDiscoveryApplication,调用 curl http://localhost:8088/discovery/get?serviceName=example,此时返回为空 JSON 数组[],因为这个时候服务还没有注册

    4. 注册服务

      curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8088'
      
    5. 再访问 curl http://localhost:8088/discovery/get?serviceName=example,此时返回内容为

      [
        {
          "instanceId": "127.0.0.1-8088-DEFAULT-example",
          "ip": "127.0.0.1",
          "port": 8088,
          "weight": 1.0,
          "healthy": true,
          "cluster": {
            "serviceName": null,
            "name": "",
            "healthChecker": {
              "type": "TCP"
            },
            "defaultPort": 80,
            "defaultCheckPort": 80,
            "useIPPort4Check": true,
            "metadata": {}
          },
          "service": null,
          "metadata": {}
        }
      ]
      
      
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐