• SpringCloud Alibaba微服务之Nacos


    SpringCloud Alibaba微服务之Nacos

    1.简介

    官方网址:

    https://nacos.io/zh-cn/docs/what-is-nacos.html

    https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

    Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

    image-20220430173215790

    从上图不难看出,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka服务配置Config服务总线Bus

    2.Nacos服务端搭建

    用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。

    2.1 下载nacos

    下载地址: https://github.com/alibaba/nacos/releases/tag/2.1.0

    image-20220430173639298

    下载并解压后可以看到以下目录结构:

    tar --zxvf nacos-server-1.1.4.tar.gz
    

    image-20220430175522023

    2. 启动nacos

    单机版

    • 启动命令:sh startup.sh -m standalone
    • 关闭命令:sh shutdown.sh

    image-20220430180104533

    看到这个就表示nacos服务已经启动起来

    集群版

    • 启动命令:sh startup.sh
    • 关闭命令:sh shutdown.sh

    3.访问验证

    输入ip地址+端口号8848/nacos就可以访问

    image-20220430180501112

    默认用户名:nacos 密码:nacos

    image-20220430180603128

    到此nacos服务器端的搭建就完成了。

    4.nacos配置文件

    nacos的配置文件在文conf文件夹里面,包括对nacos的端口号、集群配置、配置数据库连接等信息。

    image-20220430180936950

    image-20220430181214007

    5.nacos的数据持久化

    Nacos使用的是内嵌数据库 Derby(Apache Derby),目前Nacos仅支持Mysql数据库,且版本要求:5.6.5+,也可通过修改配置文件把数据持久化到mysql数据库。

    5.1 修改配置文件

    在配置文件application.properties文件中添加mysql数据库连接配置信息

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000 &autoReconnect=true
    db.user.0=root
    db.password.0=root
    

    image-20220430210753689

    5.2 重启nacos服务

    image-20220430211155845

    5.3 重新打开nacos,新添加一个命名空间

    image-20220430211336660

    5.4 数据库查询

    新建的的命名空间存储在表tenant_info表中的,通过查询该表说明数据已经持久化到我们指定的mysql数据库中

    image-20220430211536629

    6. 集群化部署Nacos

    官方文档: 集群部署

    方法一

    集群部署步骤:

    1、解压nacos安装包,执行命令将nacos的名字改成nacos-8848、nacos-8858、nacos-8868,作为三个服务方便区分。命令:mv nacos nacos8848。

    image-20220501071039286

    2、创建数据库,集群的nacos需要连接数据库保存配制信息,在nacos的解压包中有初始脚本,位置/usr/local/nacos8849/conf/nacos-mysql.sql ,在创建的数据库中直接执行。

    3、配制数据源,位置/usr/local/nacos8849/conf/application.properties,配制内容如下。

    server.contextPath=/nacos
    server.servlet.contextPath=/nacos
    server.port=8849
    
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user.0=root
    db.password.0=XXXX
    

    4、配制集群cluster,将原cluster.conf.example改为cluster.conf,位置/usr/local/nacos8849/conf。

    #it is ip
    #example
    XX.XX.59.125:8848
    XX.XX.59.125:8849
    

    这里有一个坑,就是这个IP不能在阿里云配制为127.0.0.1,得采用它本地的IP。

    docker部署可以参考: https://blog.csdn.net/m0_53151031/article/details/123118920

    方法二

    方法一比较简单,但是需要复制多份nacos文件,而且需要修改每份nacos下面的配置文件,也比较麻烦。下面通过修改startup.sh脚本文件,通过使用参数-p xxxx来指定端口号来启动

    1. 修改startup.sh脚本文件

      • 添加参数-p
      while getopts ":m:f:s:p:" opt
      do
          case $opt in
              m)
                  MODE=$OPTARG;;
              f)
                  FUNCTION_MODE=$OPTARG;;
              s)
                  SERVER=$OPTARG;;
      		p)
      			PORT=$OPTARG;;
              ?)
              echo "Unknown parameter"
              exit 1;;
          esac
      done
      

      修改后

      image-20220509151405064

      • 添加启动参数 $Dserver.port=${PORT}

        # start
        echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
        nohup $JAVA $Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
        echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
        

        修改后

        image-20220509151734941

    2. 启动验证

      使用命令sh ./startup.sh -p xxxx指定不同的端口号启动集群部署nacos

      image-20220509152233994

    3.Nacos客户端搭建

    3.1 Nacos服务注册中心

    微服务的服务注册和发现相信都用过Eureka,要自己本地构建一个Eureka微服务,但是整合了Alibaba的Nacos则不用那么复杂,直接启动Alibaba提供的Nacos服务即可,这样让程序员把全部精力放在业务上,下面是一个简单的架构图:

    img

    服务注册(服务提供者)

    1. 引入依赖

      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</artifactId>
          </dependency>
      
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
      </dependencies>
      
      
    2. 修改配置文件

      server:
        port: 8081
      spring:
        application:
          name: nacos-producer
        cloud:
          nacos:
            discovery:
              server-addr: 192.168.123.103:8848
              enabled: true #如果不想使用 Nacos 作为您的服务注册与发现,设置为false
      management:
        endpoints:
          web:
            exposure:
              include: '*'
      
    3. 启动服务

      @SpringBootApplication
      @EnableDiscoveryClient
      public class NacosProviderDemoApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(NacosProducerDemoApplication.class, args);
          }
      
          @RestController
          public class EchoController {
              @GetMapping(value = "/echo/{string}")
              public String echo(@PathVariable String string) {
                  return "Hello Nacos Discovery " + string;
              }
          }
      }
      
    4. 验证访问

      登录服务注册中心nacos的服务列表就可以找到刚才创建的服务提供者nacos-producer

      image-20220501075606005

    服务消费

    1. 引入依赖

      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</artifactId>
          </dependency>
      
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
      </dependencies>
      
    2. 修改配置文件application.yml

      spring:
        application:
          name: nacos-consumer
        cloud:
          nacos:
            discovery:
              server-addr: 192.168.123.103:8848
              enabled: true
      server:
        port: 8201
      management:
        endpoints:
          web:
            exposure:
              include: '*'
      
      
    3. RestTemplate配置

      ​ 在 Consumer 端需要去调用 Provider 端提供的REST 服务。我们使用最原始的一种方式, 即显示的使用 RestTemolate 的方式来访问

      @Configuration
      public class ApplicationContextConfig {
      
          @Bean
          @LoadBalanced
          public RestTemplate restTemplate()
          {
              return  new RestTemplate();
          }
      }
      
    4. 调用服务提供者的接口

      @RestController
      public class ConsumerController {
      
          @Autowired
          private RestTemplate restTemplate;
      
          @GetMapping("/echo/app-name")
          public String echoAppName(){
              String s = restTemplate.getForObject("http://nacos-provider-payment/echo/hello",String.class);
              return s;
          }
      
      }
      
    5. 验证调用提供者接口

      image-20220501085622591

      image-20220501085324214

    到此,服务的注册与发现功能就完毕,服务提供者和消费者都已经注册到服务注册中心nacos中,Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。

    额外补充

    nacos与Eureka的对比

    image-20220430172716849

    Nacos的配置项信息

    配置项 Key 默认值 说明
    服务端地址 spring.cloud.nacos.discovery.server-addr Nacos Server 启动监听的ip地址和端口
    服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 给当前的服务命名
    服务分组 spring.cloud.nacos.discovery.group DEFAULT_GROUP 设置服务所处的分组
    权重 spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100,数值越大,权重越大
    网卡名 spring.cloud.nacos.discovery.network-interface 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
    注册的IP地址 spring.cloud.nacos.discovery.ip 优先级最高
    注册的端口 spring.cloud.nacos.discovery.port -1 默认情况下不用配置,会自动探测
    命名空间 spring.cloud.nacos.discovery.namespace 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
    AccessKey spring.cloud.nacos.discovery.access-key 当要上阿里云时,阿里云上面的一个云账号名
    SecretKey spring.cloud.nacos.discovery.secret-key 当要上阿里云时,阿里云上面的一个云账号密码
    Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
    日志文件名 spring.cloud.nacos.discovery.log-name
    集群 spring.cloud.nacos.discovery.cluster-name DEFAULT 配置成Nacos集群名称
    接入点 spring.cloud.nacos.discovery.enpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
    是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
    是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch

    Springcloud Alibaba各个组件的版本关系

    官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

    img

    3.2 Nacos配置中心

    官方文档: Nacos config

    1. 基础配置

    1. 添加依赖
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
    1. 添加配置文件 application.yml和bootstrap.yml

    Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

    • bootstrap.yml配置文件
    server:
      port: 3377
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #nacos作为服务注册中心地址
          config:
            server-addr: localhost:8848 #nacos作为配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: DEV_GROUP
            namespace: 3e1a6d2a-63dc-4e1a-9318-3bd41c7d16c8
      application:
        name: nacos-config-client
    
    • application.yml配置文件
    spring:
      profiles:
        active: info
    
    1. 在nacos中添加配置文件

      image-20220507165723791

      DataId的命名规则:

      spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,加载dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

      image-20220507170225804

    2. 创建controller访问接口,从配置中心获取配置信息

      @RestController
      @RefreshScope //支持Nacos动态刷新
      public class ConfigClientController {
      
          @Value("${config.info}")
          private String configInfo;
      
          @GetMapping("/config/info")
          public String getConfigInfo()
          {
              return configInfo;
          }
      
      }
      
    3. 访问接口,验证获取配置信息

    image-20220507170525700

    Nacos配置中心配置如下

    image-20220507170504599

    2. 分类配置

    类似java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和dataId逻辑上区分2个目标对象

    比如我们现在有:开发、测试、生产环境,我们就可以创建3个nameSpace,不同的nameSpace之间是隔离的。Group默认是default_group,Group可以把不同的微服务划分到同一个分组里面去

    image-20220507170729018

    在bootstrap.yml配置中通过配置不同的namespace以及group来选择不同的配置文件

    image-20220507171019344

  • 相关阅读:
    两个半成品的ORM
    Mayberry小镇的管理 | 三种截然不同的领导风格 3M
    敏捷的目的(方向)错了以后……
    Error:java: Compilation failed: internal java compiler error
    java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)
    看mybatis日志模块时涉及的动态代理
    看的顺眼的却Destination Unreachable
    如何下载钉钉回放视频
    不想学习时看一看会有帮助的,“但行好事,莫问前程”
    守护线程
  • 原文地址:https://www.cnblogs.com/seanRay/p/16309240.html
Copyright © 2020-2023  润新知