springcloud alibaba之Nacos服务注册配置中心

springcloud学习笔记,第十二章,Nacos服务注册、配置中心。

简介:

为什么叫Nacos:

Dynamic Naming and Configuration Service,前四个字母分别为Naming和Configuration的前两个字母,最后的s为service。

它是一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。

简单的来说就是注册中心+配置中心的组合:Nacos=Eureka+Config+Bus

能干嘛:

替代eureka做服务注册中心,替代config做服务配置中心。

各注册中心比较:

Nacos这么优秀,我想也是经过了阿里巴巴大流量的测试。

安装Nacos:

需要java8 和 Maven环境已经ok了。

1,到github上下载安装包

​ 解压安装包

2,启动Nacos

​ 在bin目录下。运行./startup.cmd

​ nacos一直启动失败,我觉得是数据库的问题,所以要配置下数据库。

​ 可以看到文件夹下也有一些sql文件,初始化数据库:

​ 在application.properties文件里还有,修改db.user和db.password:

3,访问Nacos

​ Nacos默认监听8848。直接访问http://localhost:8848/nacos

​ 账号密码:默认都是nacos

我的一直没有启动成功。

使用Nacos作为服务注册中心:

基于Nacos的服务提供者:

  1. 新建pay模块,cloudalibaba-provider-payment9001

  2. pom,父管理里alibaba的依赖。

    1. 父POM:

      1
      2
      3
      4
      5
      6
      7
      8
      <!--spring cloud alibaba 2.1.0.RELEASE-->
      <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.1.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
      <dependency>
    2. 子模块的POM:

      1
      2
      3
      4
      5
      <!--springcloud alibaba nacos-->
      <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
  3. YML:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server:
    port: 9001

    spring:
    application:
    name: nacos-payment-provider
    cloud:
    nacos:
    discovery:
    server-addr: localhost:8848 # 配置nacos地址
    management:
    endpoints:
    web:
    exposure:
    include: '*'
  4. 主启动类:

    1
    2
    @SpringBootApplication
    @EnableDiscoveryClient
  5. Controller:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @RestController
    public class PaymentController
    {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id)
    {
    return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
    }

  6. 测试:

    启动nacos,再启动9001。

    nacos服务注册中心+服务提供者9001都ok了。

为了下一章的演示nacos的负载均衡,参照9001新建9002。

基于Nacos的服务消费者的注册与负载:

  1. 新建pay模块,cloudalibaba-consumer-nacos-order83

  2. pom:

    1
    2
    3
    4
    5
    <!--springcloud alibaba nacos-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    1. 为什么nacos支持负载均衡?因为nacos集成了Netflix的ribbon。

  3. yml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 83

    spring:
    application:
    name: nacos-order-consumer
    cloud:
    nacos:
    discovery:
    server-addr: localhost:8848

    # 消费者去访问的微服务名称(注册成功进nacos的微服务提供者)
    server-url:
    nacos-user-service: http://nacos-payment-provider
  4. 主启动类:

    1
    2
    @EnableDiscoveryClient
    @SpringBootApplication
  5. 业务类:

    1. config配置类ApplicationContextBean:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      @Configuration
      public class ApplicationContextConfig
      {
      @Bean
      @LoadBalanced
      public RestTemplate getRestTemplate()
      {
      return new RestTemplate();
      }
      }
    2. controller控制类OrderNacosController:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      @RestController
      @Slf4j
      public class OrderNacosController
      {
      @Resource
      private RestTemplate restTemplate;

      @Value("${service-url.nacos-user-service}")
      private String serverURL;

      @GetMapping(value = "/consumer/payment/nacos/{id}")
      public String paymentInfo(@PathVariable("id") Long id)
      {
      return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
      }

      }
  6. 测试:

    nacos控制台。http://localhost:83/consumer/payment/nacos/13

Nacos与其他服务注册中心的对比:

Nacos全景图:

Nacos和CAP:

NACOS支持AP和CP模式的切换:

C是所有节点在同一时间看到的数据是一致的,而A的定义是所有的请求都会收到响应。

1
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

使用Nacos作为服务配置中心:

  1. 新建moudle,cloudalibaba-config-nacos-client3377

  2. pom:

    1
    2
    3
    4
    5
    <!--nacos config-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  3. 配置文件

    这里需要配置两个配置文件,application.ymk和bootstrap.yml。

    主要是为了可以与spring cloud config无缝迁移。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    server:
    port: 3377

    spring:
    application:
    name: nacos-config-client
    cloud:
    nacos:
    discovery:
    server-addr: localhost:8848
    config:
    server-addr: localhost:8848
    file-extension: yaml

    所以将重要的配置信息放在bootstrap.yml,自己的配置信息放在application.yml。

    1
    2
    3
    spring:
    profiles:
    active: dev
  4. 主启动类:

    1
    2
    @SpringBootApplication
    @EnableDiscoveryClient
  5. controller:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RestController
    @RefreshScope //支持Nacos的动态刷新功能。
    public class ConfigClientController
    {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
    return configInfo;
    }
    }
  6. 在Nacos的web界面添加配置信息(dataId):

    **Nacos的配置规则:**就是我们在客户端如何指定读取配置文件,配置文件的命名的规则

    默认的命名方式:

    1
    2
    3
    4
    5
    6
    7
    8
    prefix:
    默认就是当前服务的服务名称
    也可以通过spring.cloud.nacos.config.prefix配置
    spring.profile.active:
    就是我们在application.yml中指定的,当前是开发环境还是测试等环境
    这个可以不配置,如果不配置,那么前面的 - 也会没有
    file-extension
    就是当前文件的格式(后缀),目前只支持yml和properties

    所以上面的命名规则导致下面的Data ID就应该是:nacos-config-client-dev.yaml

    在web UI上创建配置文件:

    注意,DataId就是配置文件名字:名字一定要按照上面的规则命名,否则客户端会读取不到配置文件。

  7. 测试:

    重启3377客户端

    访问3377

  8. 注意默认就开启了自动刷新:

    此时我们修改了配置文件,客户端是可以立即更新的。因为Nacos支持Bus总线,会自动发送命令更新所有客户端。

Nacos配置中心之分类配置:

两个问题:

Nacos的图形化管理界面:

namespace、group和data id三者的关系?

NameSpace默认有一个:public名称空间

这三个类似java的: 包名 + 类名 + 方法名

配置不同DataID:

指定spring.profile.active和配置文件的DataID来使不同环境读取不同的配置。

此时,改为dev,就会读取dev的配置文件,改为test,就会读取test的配置文件

配置不同的GroupID:

直接在新建配置文件时指定组

在客户端配置,使用指定组的配置文件bootstrap.yml和application.yml都要修改:

重启服务,即可。

配置不同的namespace:

新建dev/test的Namespace:

回到服务管理-服务列表查看:

按照域名配置填写:

要通过命名空间id指定

OK,测试。

Nacos集群和持久化配置:(重要)

在实际生产中,当然不止一台nacos服务注册和配置中心。所以nacos集群和持久化配置非常重要。

Nacos默认有自带嵌入式数据库,derby,但是如果做集群模式的话,就不能使用自己的数据库。不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql。

真实情况是以下这种情况:

单机版(mysql数据库):

nacos本来是是自带一个嵌入式数据库derby的。但是我们想使用mysql数据库来存储Nacos中的数据。

  1. nacos默认自带了一个sql文件,在nacos安装目录下,在数据库中初始化他。
  2. 修改Nacos安装目录下的application.properties,用户名和密码。
  3. 此时可以重启nacos,那么就会改为使用我们自己的mysql。

集群版(mysql数据库):

环境要求:1个nginx+3个nacos注册中心+1个mysql。nacos下载linux版。

  1. 在linux主机上安装nacos。

  2. 进入nacos安装包下的自带的sql文件,mysql中执行该sql文件。

  3. 修改nacos安装目录下的application.properties:

  4. linux服务器上nacos的集群配置cluster.conf:

    这些ip必须是hostname -i 能够识别的IP。

  5. 我们这里就不将nacos配置在不同节点上了,就放在一个linux节点上。既然要在一个节点上启动不同Nacos实例,就要修改startup.sh,使其根据不同端口启动不同Nacos实例。

  6. 配置nginx:

    1. 修改nginx.conf

  7. 启动nacos:

    1
    2
    3
    4
    5
    ./startup.sh -p 3333

    ./startup.sh -p 4444

    ./startup.sh -p 5555
  8. 启动nginx

  9. 测试:

    访问192.168.111.144:1111。如果可以进入nacos的web界面,就证明安装成功了

  10. 将一个payment微服务注册到nacos集群

  11. 进入nacos的web界面:可以看到我们刚启动的微服务。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信