0%

【SpringCloudAlibaba】Nacos服务注册和配置中心

用nacos来取代eurka作为服务注册中心,取代config作为配置中心

1 Nacos简介

1.1 介绍

  • Nacos:Naming Configuration Service
  • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
  • Nacos就是注册中心 + 配置中心的组合
  • Nacos = Eureka + Config + Bus

1.2 功能

  • 替代Eureka做服务注册中心
  • 替代Config做服务配置中心

1.3 Nacos下载与安装

  • 演示下载的是windows版,解压后,进入bin文件夹
  • 打卡命令行输入startup -m standalone,意思为单机模式运行,非集群模式
  • 默认账号密码为:nacos,可进入后台

2 Nacos服务注册中心

2.1 服务提供者搭建nacos

  • (1)创建项目cloudAlibaba-provider-payment9001
  • (2)修改POM(引入依赖)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- nacos-discovery : 服务注册 -->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- web -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • (3)修改配置文件yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    server:
    port: 9001

    spring:
    application:
    name: nacos-provider-payment
    cloud:
    nacos:
    discovery:
    server-addr: localhost:8848 # nacos web地址
  • (4)主启动类
    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosProviderMain9001 {
    public static void main(String[] args) {
    SpringApplication.run(NacosProviderMain9001.class, args);
    }
    }
  • (5)Controller层
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RestController
    public class NacosProviderController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos")
    public String getPayment() {
    return "nacos registry -- serverPort:" + serverPort;
    }

    }
  • (6)测试:启动项目,访问nacos-web,”服务管理” -> “服务列表”

2.2 IDEA伪集群搭建

  • 如果懒得重新创建一个项目来用集群搭建,可以通过修改IDEA参数来达到伪集群效果

2.3 消费者搭建nacos

  • (1)创建项目cloudAlibaba-consumer-nacos-order83
  • (2)引入依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- nacos-discovery 服务发现 -->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- web -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • (3)修改配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 83

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

    #设置变量,去访问的微服务名称,用于解耦
    service-url:
    nacos-user-service: http://nacos-provider-payment
  • (4)主启动类
    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosOrderMain83 {
    public static void main(String[] args) {
    SpringApplication.run(NacosOrderMain83.class, args);
    }
    }
  • (5)Config类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    public class ApplicationContextConfig {


    @Bean//注入Bean
    @LoadBalanced //开启负载均衡
    public RestTemplate getRestTemplate() {
    return new RestTemplate();
    }
    }
  • (6)Controller层
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @RestController
    public class NacosOrderController {

    //读取配置文件中变量信息,达到代码与配置解耦
    @Value("${service-url.nacos-user-service}")
    private String serviceURL;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/nacos")
    public String getPaymentInfo() {
    return restTemplate.getForObject(serviceURL + "/payment/nacos", String.class);
    }
    }

2.4 服务注册中心对比


3 Nacos服务配置中心

3.1 基础配置

  • (1)创建项目cloudAlibaba-nacos-config-client3377
  • (2)引入依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- 服务配置 -->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- web -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • (3)配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # bootstrap.yaml

    server:
    port: 3377

    spring:
    application:
    name: nacos-config-client
    cloud:
    nacos:
    config:
    server-addr: localhost:8848 #nacos配置中心地址
    file-extension: yaml #指定yaml格式的配置
    1
    2
    3
    4
    5
    # application.yaml

    spring:
    profiles:
    active: dev # 选择开发环境
  • (4)主启动类
    1
    2
    3
    4
    5
    6
    @SpringBootApplication
    public class NacosConfigClient3377 {
    public static void main(String[] args) {
    SpringApplication.run(NacosConfigClient3377.class, args);
    }
    }
  • (5)Controller层
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RestController
    @RefreshScope //支持Nacos的动态刷新功能
    public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
    return configInfo;
    }
    }
  • (6)在Nacos中发布配置文件,”配置管理” -> “配置列表” -> “+”
  • (7)启动服务,访问:http://localhost:3377/config/info , 数据成功访问
    • 并且nacos支持动态刷新,不再需要我们手动发送消息去刷新配置

3.2 分类配置了解

  • (1)Namespace+Group+Data ID三者关系
    • 类似Java里面的package名和类名
    • 最外层的namespace是可以用于区分部署环境,Group和DataID逻辑上区分两个目标对象
    • 默认:Namespace=public,Group=DEFAULT_GROUP,Cluster=DEFAULT
  • (2)具体功能使用
    • Namespace主要用来实现隔离,比如说我们现在有三个环境:开发、测试、生产环境,我们可以创建是哪个Namespace,不同的Namespace之间是隔离的
    • Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一分组里面去
    • Service就是微服务,一个微服务可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比如说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,杭州机房起一个集群名为HZ,广州机房起一个集群名为GZ,还可以尽量让同一个机房的微服务滑翔调用,以提升性能
    • Instance,微服务实例

3.3 分类配置

  • (1)通过DataID切换文件
    • 通过指定spring.profile.active和配置文件的DataID来使不同的环境下读取不同的文件
  • (2)通过GROUP切换文件
  • (3)通过NameSpace切换文件

4 Nacos集群和持久化

4.1 持久化配置

  • (1)nacos默认使用derby内嵌数据库来存储文件,例如我们之前的做配置中心的配置文件。为了持久化,我们可以将derby切换为我们自己的mysql数据库
  • (2)nacos安装目录/conf/nacos-mysql.sql,创建名为nacos_config的数据库,运行此sql,得到我们的mysql数据库
  • (3)也是在conf文件下,修改application.properties文件,迁移数据库
  • (4)重启nacos,进入页面,发现之前配置的文件全部不见,证明配置成功

4.2 Linux环境搭建

  • 集群的搭建在linux上,本人使用的linux为CentOS8

  • Java安装

  • JDK下载:https://www.oracle.com/cn/java/technologies/javase-downloads.html ,选择tar.gz文件

  • (1)上传到linux上,在/user目录下解压sudo tar zxvf 解压文件

  • (2)配置环境sudo vim /etc/profile

    1
    2
    3
    export JAVA_HOME=/usr/jdk1.8.0_271-amd64
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin
  • (3)加载配置source /etc/profile

  • (4)检测是否安装成功java -version

  • Maven安装
  • Maven下载:http://maven.apache.org/download.cgi ,选择bin.tar.gz文件
  • (1)上传到linux上,在/user目录下解压sudo tar zxvf 解压文件
  • (2)配置环境sudo vim /etc/profile
    1
    2
    export M2_HOME=/usr/apache-maven-3.6.3
    export PATH=$PATH:$M2_HOME/bin
  • (3)加载配置source /etc/profile
  • (4)检测是否安装成功mvn -v

4.2 集群搭建

  • (1)数据持久化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 登录mysql数据库
    mysql -u root -p

    # 创建nacos_config数据库
    create database `nacos_config`

    # 切换到nacos_config数据库
    use `nacos_config`

    # 运行sql文件
    source /opt/nacos/conf/nacos-mysql.sql

    # 检查是都创建表成功
    show tables
  • (2)切换数据库,修改application.properties

  • sudo vim /opt/nacos/conf/application.properties

  • 修改内容与上文的数据持久化一样

  • (3)集群配置
  • sduo cp /opt/nacos/conf/cluster.conf.example /opt/nacos/conf/cluster.conf
  • 获取本机的ip地址hostname -i
  • 修改配置文件,sudo /opt/nacos/conf/cluster.conf
  • (4)编辑启动脚本,使其可以接受不同启动端口
  • sudo vim /opt/nacos/bin/startup.sh