SpringCloudAlibaba-Nacos

SpringCloudAlibaba-Nacos

文章参考

SpringCloud Alibaba实战(6:nacos-server服务搭建)_三分恶的博客-CSDN博客_nacos server

nacos 实战(史上最全) - 疯狂创客圈 - 博客园 (cnblogs.com)

https://blog.csdn.net/weixin_43464964/article/details/123272248

什么是Nacos?

Nacos是阿里巴巴开源的一个动态服务发现配置管理服务管理平台。

官方网站:

什么是 Nacos

Nacos英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。

在这里插入图片描述

生态图

nacos_landscape.png

Nacos 无缝支持一些主流的开源生态,使用Nacos,可以简化服务发现、配置管理、服务治理及管理。

如果要把Nacas和SpringCloud Netflix的组件对标的话,那么:

Nacos = Eureka/Consule + Config + Admin

关于注册中心问题:既然有了Eureka ,为啥还要用Nacos?
与eureka对比

1 eureka 2.0闭源码了。

2 从官网来看nacos 的注册的实例数是大于eureka的,

3 因为nacos使用的raft协议,nacos集群的一致性要远大于eureka集群.

分布式一致性协议 Raft,与其他的分布式一致性算法比,Raft 相对比较简单并且易于实现

Raft 的数据一致性策略

Raft 协议强依赖 Leader 节点来确保集群数据一致性。即 client 发送过来的数据均先到达 Leader 节点,Leader 接收到数据后,先将数据标记为 uncommitted 状态,随后 Leader 开始向所有 Follower 复制数据并等待响应,

在获得集群中大于 N/2 个 Follower 的已成功接收数据完毕的响应后,Leader 将数据的状态标记为 committed,随后向 client 发送数据已接收确认,

在向 client 发送出已数据接收后,再向所有 Follower 节点发送通知表明该数据状态为committed。

关于配置中心问题:既然有了springcloud config,为啥还要用Nacos?
  • springcloud config大部分场景结合git 使用, 动态变更还需要依赖Spring Cloud Bus 消息总线来通过所有的客户端变化.
  • springcloud config不提供可视化界面
  • nacos config使用长连接更新配置, 一旦配置有变动后,通知Provider的过程非常的迅速, 从速度上秒杀springcloud原来的config几条街,
目前的Spring Cloud Ailbaba 组件
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  • AliCloud OSS: 阿里云对象存储服务(Object Storage Service,简称
    OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Spring Cloud Alibaba 套件和Spring Cloud Netflix套件类比
  • Nacos = Eureka/Consule + Config + Admin
  • Sentinel = Hystrix + Dashboard + Turbine
  • Dubbo = Ribbon + Feign
  • RocketMQ = RabbitMQ
  • Schedulerx = Quartz
  • AliCloud OSS、AliCloud SLS 这三个应该是独有的

下载安装

Nacos Server下载地址:

https://github.com/alibaba/nacos/releases

standalone 单机模式

linux 下载的是 nacos-server-1.4.2.tar.gz

上传后解压

tar -xvf nacos-server-1.4.2.tar.gz

解压后进入 /nacos/bin 目录,启动服务

单机模式启动

sh startup.sh -m standalone

最后访问 http://192.168.2.128:8848/nacos 这里的ip换成你的ip;

如果是本地虚拟机,需要关防火墙

systemctl stop firewalld

最后打开页面可以看到登录页面

默认账号和密码为:nacos nacos

在这里插入图片描述

window 系统的解压 nacos-server-1.4.2.zip

进入 \nacos-server-1.4.2\nacos\bin 目录

然后 cmd 进入dos窗口

在这里插入图片描述

控制台输入命令 单机启动

startup.cmd -m standalone

一样的访问后台

http://192.168.233.128:8848/nacos

默认账号和密码为:nacos nacos

cluster 集群模式

测试环境,可以先用 standalone 模式,但是,生产环境可以使用 cluster 模式。

需要依赖 MySQL,然后改两个配置文件

conf/cluster.conf
conf/application.properties

1: cluster.conf,填入要运行 Nacos Server 机器的 ip

192.168.100.155
192.168.100.156
192.168.100.157    

2:先数据备份,修改 /conf/application.properties ,加入 MySQL 配置

spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

在这里插入图片描述

3: 创建一个名为nacos的 database,将/conf/nacos-mysql.sql 中的表结构导入刚才创建的库中

用的是mysql 5.7的

CREATE DATABASE `nacos` CHARACTER SET 'utf8' COLLATE 'utf8_bin';

重新启动

随便新建配置

在这里插入图片描述

可以看到数据库里面有写入了数据,说明数据库配置有效

在这里插入图片描述

Nacos Server 的配置数据是存在哪里呢?

我们没有对 Nacos Server 做任何配置,那么数据只有两个位置可以存储:

  • 内存
  • 本地数据库

现在重启刚刚在运行的 Nacos Server,会发现刚才加的 nacos.properties 配置还在,说明不是内存存储的。

打开NACOS_PATH/data,会发现里边有个derby-data目录,我们的配置数据现在就存储在这个库中

Derby 是 Java 编写的数据库,属于 Apache 的一个开源项目

Nacos采用的一个Leader节点,多个Follower节点的集群架构,数据一致性算法采用的是Raft。

在这里插入图片描述

Nacos基本原理

Nacos作为注册中心分为server与client。

在这里插入图片描述

Server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑。

注册中心原理

在这里插入图片描述

服务注册方法:服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

配置中心原理

在这里插入图片描述

实战案例

注册中心

新建一个maven 的 父工程 my-test 以及两个maven的子工程

cloud-provider-8001
cloud-consumer-8002

在这里插入图片描述

父工程的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ung</groupId>
    <artifactId>my-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>my-url</module>
        <module>my-encryptor</module>
        <module>cloud-provider-8001</module>
        <module>cloud-consumer-8002</module>
    </modules>
    <!--打包方式  pom-->
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud-alibaba-version>2021.0.1.0</spring-cloud-alibaba-version>
        <spring-cloud-version>2021.0.1</spring-cloud-version>
        <spring-boot-version>2.6.3</spring-boot-version>
        <junit-version>4.12</junit-version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springCloud的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit-version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

新建子模块 cloud-provider-8001 maven项目,将其加入到 父项目下作为子项目;

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>my-test</artifactId>
        <groupId>com.ung</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-8001</artifactId>

    <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>
</project>

新建 application.yml

server:
  port: 8001

spring:
  application:
    name: nacos-producer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.124:8848

新建主启动类 ServiceProviderApplication

package com.ung.cloud;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

controller接口

package com.ung.cloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EchoController {

    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
        System.out.println("被调用了,参数是:"+string);
        return "Hello Nacos Discovery " + string;
    }
}

新建 cloud-consumer-8002 模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>my-test</artifactId>
        <groupId>com.ung</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-8002</artifactId>

    <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>

        <!--ibbon目前已经停止维护,新版SpringCloud(2021.x.x)用LoadBalancer替代了Ribbon。
        Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了兼容
        Nacos 2021版本已经没有自带ribbon的整合,所以无法通过修改Ribbon负载均衡的模式来实现nacos提供的负载均衡模式
        ,需要引入另一个支持的jar包loadbalancer。 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

    </dependencies>
</project>

application.yml 端口是8002

server:
  port: 8002

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

新建主启动类ServiceConsumerApplication

package com.ung.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
package com.ung.cloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

NacosController

使用 restTemplate 来调用发起服务调用

package com.ung.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


@RestController
public class NacosController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    @Value("${spring.application.name}")
    private String appName;

    @GetMapping("/echo/app-name")
    public String echoAppName() {
        //使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-producer");
        String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), appName);
        System.out.println("request url:" + url);
        return restTemplate.getForObject(url, String.class);
    }
}

启动两个服务,可以在nacos看到成功注册

在这里插入图片描述

向8082 consumer 发起请求,可以看到成功调用

http://localhost:8002/echo/app-name

返回

Hello Nacos Discovery nacos-consumer

配置中心
基本概念
Profile

Java项目一般都会有多个Profile配置,用于区分开发环境,测试环境,准生产环境,生成环境等,每个环境对应一个properties文件(或是yml/yaml文件),然后通过设置 spring.profiles.active 的值来决定使用哪个配置文件。

Nacos Config的作用就把这些文件的内容都移到一个统一的配置中心,即方便维护又支持实时修改后动态刷新应用。

例如

spring:
  application:
    name: sharding-jdbc-provider
  jpa:
    hibernate:
      ddl-auto: none
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
      show-sql: true
  profiles:
     active: sharding-db-table    # 分库分表配置文件
    #active: atomiclong-id    # 自定义主键的配置文件
    #active: replica-query    # 读写分离配置文件
Data ID

当使用Nacos Config后,Profile的配置就存储到Data ID下,即一个Profile对应一个Data ID

Data ID的拼接格式:${prefix} - ${spring.profiles.active} . ${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置
  • spring.profiles.active 取 spring.profiles.active 的值,即为当前环境对应的 profile
  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置
Group

Group 默认为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 来配置,当配置项太多或者有重名时,可以通过分组来方便管理

最后就和原来使用springcloud一样通过@RefreshScope 和@Value注解即可

通过Nacos的console 去增加配置

首先要在nacos中配置相关的配置,打开Nacos配置界面,依次创建2个Data ID

  • nacos-config-demo-dev.yaml 开发环境的配置
  • nacos-config-demo-test.yaml 测试环境的配置

在这里插入图片描述

  1. nacos-config-demo-dev.yaml

    foot:
      bar: dev value is hallo dev!
    

在这里插入图片描述

  1. nacos-config-demo-test.yaml

    foot:
      bar: test!!!
    

在这里插入图片描述

使用Nacos Config Client组件

cloud-service-provider 模块新增 config 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-alibaba</artifactId>
        <groupId>com.ung</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-service-provider</artifactId>
    <dependencies>
        <!--config 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--discovery 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

新增 bootstrap.yml 配置文件

spring:
  application:
    name: nacos-config-demo-provider
  profiles:
    active:  dev
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.124:8848
      config:
        server-addr: 192.168.2.124:8848
        prefix: nacos-config-demo
        group: DEFAULT_GROUP
        file-extension: yaml
server:
  port: 18083

新增接口 ConfigGetController

@RefreshScope //支持Nacos的动态刷新功能。

package com.ung.cloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
@RefreshScope //支持Nacos的动态刷新功能。
public class ConfigGetController {


    @Value("${foot.bar:empty}")
    private String bar;


    @Value("${spring.datasource.username:empty}")
    private String dbusername;

    //获取配置的内容
    @RequestMapping(value = "/bar", method = RequestMethod.GET)
    public String getBar() {
        return "bar is :" + bar;
    }

    //获取配置的内容
    @RequestMapping(value = "/dbusername", method = RequestMethod.GET)
    public String getDbusername() {
        return "db username is :" + bar;
    }
}

启动服务

访问链接 http://192.168.2.124:18083/config/bar

可以看到读取的是dev的配置信息

在这里插入图片描述

在页面在线修改配置文件

在这里插入图片描述

在不重新启动服务的基础上,会动态的刷新,再次请求链接

http://192.168.2.124:18083/config/bar

可以实现动态刷新配置内容

在这里插入图片描述

分类配置
多环境多项目管理

问题1:实际开发中,通常一个系统会准备dev开发环境test测试环境prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?

Nacos的服务管理设计思路

Namespace+Group+Data ID三者关系?为什么这么设计?

类似Java里面的package名和类名 最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
三者情况
默认情况:

Namespace=public,

Group=DEFAULT_GROUP,

默认Cluster是DEFAULT Nacos默认的命名空间是public,Namespace主要用来实现隔离。

比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去 Service就是微服务;
一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。

在这里插入图片描述

指定active和配置文件的DataID来实现环境区分

之前已经有 两个配置的 DataID

  • nacos-config-demo-dev.yaml 开发环境的配置
  • nacos-config-demo-test.yaml 测试环境的配置

修改项目里的 bootstrap.yml 配置文件,切换active 再重新启动

spring:
  application:
    name: nacos-config-demo-provider
  profiles:
#    active:  dev
    active:  test
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.124:8848
      config:
        server-addr: 192.168.2.124:8848
        prefix: nacos-config-demo
        group: DEFAULT_GROUP
        file-extension: yaml
server:
  port: 18083
通过Group实现环境区分

新建 nacos-config-demo-info.yaml 的Data ID在 DEV_GROUP 分组下

nacos-config-demo-dev.yaml
DEV_GROUP
foot:
  bar: DEV_GROUP !

在这里插入图片描述

再新建一个 TEST_GROUP 组 也是 nacos-config-demo-info.yaml

TEST_GROUP
foot:
  bar: TEST_GROUP  !

在这里插入图片描述

可以看到配置的 列表

在这里插入图片描述

最后在项目的配置文件 bootstrap.yml 里修改

在这里插入图片描述

切换到 DEV_GROUP 的 active是info

访问链接 http://192.168.2.124:18083/config/bar

返回的结果就是 DEV_GROUP 下的 info 设置的信息

在这里插入图片描述

通过不同的命名空间实现环境的区分

命名空间下新建两个命名空间,一个dev,一个test,然后使用唯一的命名空间id来实现读取不同的环境配置

在这里插入图片描述

在这里插入图片描述

最后看到列表有两个自定义的命名空间

在这里插入图片描述

在dev下新建配置(yaml 格式)

在这里插入图片描述

nacos-config-demo-dev.yaml
foot:
  bar: nacos-config-demo-dev.yaml from dev命名空间DEFAULT_GROUP组

在这里插入图片描述

在新建 DEV_GROUP 和 TEST_GROUP 的配置

在这里插入图片描述

在这里插入图片描述

最后可以看到在dev空间下有三个组,每个组的ID都是 nacos-config-demo-dev.yaml

在这里插入图片描述

最后在项目的bootstrap.yml 文件指定空间

这里的 36d8f48e-50ae-4e1b-a4fe-376a7fefc19d 就是 dev空间的 命名空间ID

在这里插入图片描述

通过切换组,可以获取在 dev空间下的配置

http://192.168.2.124:18083/config/bar

可以看到结果返回的就是对应组的配置信息;

在这里插入图片描述

总结

使用Namespace+Group+Data ID的方式可以灵活的实现环境配置,三层是最为合理的

举个简单的例子,我们开发中开发完成后可能要有自测,内外网环境等等的配置信息,通过在nacos上配置不同的组就可以时间环境的动态切换,而进入测试部门后又需要不同的测试环境,这时可以用上命名空间,另外命名空间还可以用于服务隔离,当我们不同的服务集群环境下配置信息不同时,可以用不同的命名空间来分配,类似于java程序中的(工程、模块、包),缺一不可。

nacos集群搭建

参考 http://t.csdn.cn/NAVmD

要搭建集群的话,那么肯定是不能用内嵌的数据库,不然数据无法共享。所以,集群搭建的时候我们需要将Nacos对接Mysql进行数据存储。

集群模式跟我们平时进行扩容是一样的,可以通过Nginx转发到多个节点,最前面挂一个域名即可

在这里插入图片描述

IP规划

通常如果我们只是为了体验的话,直接在本地起动3个实例就可以了,没必要真的去搞三台服务器,下面我们就以在本地的方式来搭建集群。 将Nacos的解压包复制分成3份,分别是:

nacos
nacos1
nacos2

进入nacos的conf目录,编辑application.properties文件,增加数据库配置

# 指定数据源为Mysql
spring.datasource.platform=mysql

# 数据库实例数量
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

复制代码同样的步骤进入nacos1和nacos2操作一遍,

唯一需要修改的就是application.properties文件中的server.port,默认nacos的server.port=8848,

我们在本地启动三个实例,那么端口肯定会冲突,所以其他2个实例的端口我们需要进行修改,比如nacos1修改成8847,nacos2修改成8846。
数据库配置信息好了后,我们需要将对应的数据库和表进行初始化,数据库脚本在conf目录下的nacos-mysql.sql中,执行即可。

最后一步需要配置一份集群节点信息,配置文件在conf目录下的cluster.conf.example文件,我们进行重命名成cluster.conf。 然后编辑cluster.conf文件,增加3个节点的信息,格式为IP:PORT,三个目录都一致即可。

127.0.0.1:8848
127.0.0.1:8847
127.0.0.1:8846

启动的话直接到bin目录下,执行./startup.sh就可以了,默认就是集群模式,不需要加任何参数

集群的使用

nacos集群的使用一般有4种方式:

  • http://ip1:port/openAPI 直连ip模式,不同的节点,则需要修改ip才可以使用。
  • http://VIP:port/openAPI VIP模式高可用,客户端vip即可,VIP下面挂server真实ip,部署比较麻烦,需要部署vip(keepalive)。
  • http://nacos.com:port/openAPI 域名模式,可读性好,而且换ip方便,在host文件配置本地域名即可。
  • http://反向代理:port/openAPI 反向代理模式

nginx反向代理

upstream nacos_server {
  server 127.0.0.1:8848;
  server 127.0.0.1:8847;
  server 127.0.0.1:8846;
}

server {
listen 8648;
   server_name localhost;
  #charset koi8-r;
  #access_log logs/host.access.log main;
  location / {
     proxy_pass http://nacos_server;
     index index.html index.htm;
   }
}

官网文档部署

https://nacos.io/zh-cn/docs/deployment.html

在这里插入图片描述

持久化配置(使用Mysql)

为了保证数据不丢失,每次重启后上次的数据还在,Nacos需要做数据持久化,当然他默认的也有数据持久化的方式。
Nacos自带了小型的derby数据库,在集群环境下每个Nacos使用自带的数据库会出现数据不一致问题,Nacos提供了方式可以将derby切换为Mysql。

1、新建数据库

在master数据库上新建 nacos 数据库,然后执行/conf/nacos-mysql.sql 中的表结构导入刚才创建的库中

用的是mysql 5.7的

CREATE DATABASE `nacos` CHARACTER SET 'utf8' COLLATE 'utf8_bin';

在这里插入图片描述

2、修改配置文件

修改Nacos目录 \nacos\conf 的配置文件application.properties,添加以下配置代表使用Mysql做Nacos数据库(注意配置信息需要修改为自己的)

建议提前备份好

cp application.properties application.properties.bk

在这里插入图片描述

添加自己的配置

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.2.128:3301/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
3、修改集群配置

我们用同一台服务器,3333,4444,5555这三个不同的端口来配置集群
将cluster.conf.example复制为cluster.conf,修改集群配置

cp -r cluster.conf.example cluster.conf

在这里插入图片描述

修改文件

 vi cluster.conf

输入i打开编辑模式,输入如下内容,注意修改IP为自己linux服务器的ip(ip不能写127.0.0.1)

192.168.2.128:3333
192.168.2.128:4444
192.168.2.128:5555

在这里插入图片描述

按ESC 后按 :wq 保存退出

4、修改nacos的启动命令,修改startup.sh脚本

在这里插入图片描述

同一台机器上集群启动时,还使用startup.sh就不知道要启动哪一台nacos,因此,我们要修改nacos的启动脚本,给他添加一个 -p 端口的参数,让nacos能根据端口区分启动哪一个
先进入 /bin目录下 先将原启动脚本备份

 cp startup.sh startup.sh.bk

在这里插入图片描述

接下来编辑 /bin 目录下的 startup.sh 文件

建议先下载出来,在windos上操作再上传

在这里插入图片描述

$OPTARG代表的是-x后跟的参数

在这里插入图片描述

修改后

在这里插入图片描述

修改启动的命令

拉到最下面,找到图中行

在这里插入图片描述

我们在启动命令上加上启动时指定端口,也就是获取我们上面输入的那个端口
修改后,-Dserver.port的意思是指定端口启动,${PORT}是获取我们上面第一步配置的-p参数

-Dserver.port=${PORT}

在这里插入图片描述

编辑好后保存退出
这时,我们输入以下命令就可以指定3333端口启动nacos了

./startup.sh -p 3333
Linux下Nginx配置负载分发

配置nginx 需要修改 nginx.conf 文件

先备份 nginx.conf

我这里用的是docker容器的nginx,直接操作挂载的文件就行;

cp nginx.conf nginx.conf.bk

在这里插入图片描述

修改配置

建议下载下来在win操作

在这里插入图片描述

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	
	upstream cluster{
		server 192.168.248.128:3333;
		server 192.168.248.128:4444;
		server 192.168.248.128:5555;
	}

    server {
        listen       1111;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
           # root   html;
           # index  index.html index.htm;
		   proxy_pass http://cluster;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

进入 nacos的 bin目录下

在这里插入图片描述

分别执行 启动nacos

./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555

最后启动 jps 查看启动情况

在这里插入图片描述

最后请求链接 http://192.168.2.128:3333/nacos 可以看到正常页面

启动nginx

指定配置文件启动

./nginx -c /usr/local/nginx/conf/nginx.conf

最后访问nginx的链接

http://192.168.2.128:1111/nacos

成功登录后添加配置,可以在数据库看到新加的配置

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要搭建Spring Cloud Alibaba Nacos项目,您可以按照以下步骤进行操作: 1. 创建Spring Boot项目:首先,在您的IDE中创建一个新的Spring Boot项目。 2. 添加依赖:在项目的pom.xml文件中添加相应的依赖。您需要添加以下四个核心依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> ``` 3. 配置Nacos Server地址:在application.properties(或application.yml)文件中配置Nacos Server的地址。例如: ```yaml spring.cloud.nacos.discovery.server-addr=${NACOS_SERVER_ADDR:localhost:8848} ``` 4. 创建服务提供者和消费者:根据您的需求,创建相应的服务提供者和消费者。您可以使用`@RestController`注解创建简单的RESTful接口。 5. 注册服务:在服务提供者的主类上添加`@EnableDiscoveryClient`注解,以将服务注册到Nacos Server上。 6. 调用服务:在服务消费者中使用`@RestTemplate`或Feign等方式调用服务。您可以通过在方法上添加`@LoadBalanced`注解来实现负载均衡。 7. 启动应用程序:最后,启动应用程序并验证各个微服务之间的通信是否正常。 这些是搭建Spring Cloud Alibaba Nacos项目的基本步骤。根据您的具体需求,您可能还需要配置其他功能,如动态配置等。希望对您有帮助!如有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值