Nacos 入门之使用Nacos做注册中心《一》

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": {}
        }
      ]
      
      
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要取得Nacos配置中心中的List类型配置,需要使用Nacos提供的Java SDK,具体步骤如下: 1. 引入Nacos Java SDK的依赖,可以在Maven中添加如下依赖: ```xml <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos.version}</version> </dependency> ``` 2. 在代码中使用Nacos SDK获取配置,示例代码如下: ```java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import java.util.List; import java.util.Properties; import java.util.concurrent.Executor; public class NacosConfigExample { public static void main(String[] args) throws NacosException { String serverAddr = "localhost:8848"; // Nacos服务地址 String dataId = "example"; // 配置ID String group = "DEFAULT_GROUP"; // 配置分组 Properties properties = new Properties(); properties.put("serverAddr", serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); // 获取配置内容,超时时间为5000ms // 将List类型的配置转换为List对象 List<String> list = Arrays.asList(content.split(",")); // 监听配置变化 configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { // 配置变化后的处理逻辑 List<String> list = Arrays.asList(configInfo.split(",")); // ... } @Override public Executor getExecutor() { return null; } }); } } ``` 在获取配置之后,可以将List类型的配置内容转换为List对象进行处理。同时,可以使用addListener方法监听配置的变化,当配置发生变化时,会触发Listener中的回调函数,从而进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术宅丶拾年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值