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

posted @ 2022-05-25 14:42  肖恩雷  阅读(345)  评论(0编辑  收藏  举报