SpringCloud Alibaba Nacos服务注册和配置中心

Nacos( Dynamic Naming and Configuration Service)

Nacos集成了注册中心和配置中心:

  • 注册中心用于服务注册、服务发现;
  • 配置中心用于配置管理;

一个更易于构建云原生应用的 动态服务发现、配置管理和服务管理 平台。

Nacos就是一个构建、交付和管理微服务的平台,支持基于DNS和RPC的服务发现,提供对服务的实时的健康检查,动态配置服务, 动态DNS服务等特性,总而言之,Nacos提供了一套 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

服务注册中心对比:

Nacos就是注册中心 + 配置中心的组合 Nacos = Eureka+Config +Bus

替代Eureka做服务注册中心

替代Config做服务配置中心

Nacos和CAP:

能力 Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP+AP AP CP --- CP
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd --- Keep Alive
负载均衡策略 权重/metadata/Selector Ribbon Fabio RoundRobin ---
雪崩保护
自动注销实例 支持 支持 支持 不支持 支持
访问协议 HTTP/DNS/GRPC HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心同步 支持 不支持 支持 不支持 不支持
Spring Cloud集成 支持 支持 支持 不支持 支持
Dubbo集成 支持 不支持 支持 不支持 支持
K8s集成 支持 不支持 支持 支持 不支持

Nacos 支持AP和CP模式的切换

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

何时选择使用何种模式?

一般来说,

如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

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

Nacos作为服务注册与发现:

springcloud中使用nacos进行服务的注册与发现:

  1. 引入spring-cloud-starter-alibaba-nacos-discovery
  2. 开启 @EnableDiscoveryClient

关于 spring-cloud-starter-alibaba-nacos-discovery 中的其他配置信息如下图所示: 一个Nacos机器起起来,是可以通过Namespace命名空间+Group分组支持环境无限扩展,通过资源隔离,也就解决了我们的资源扩展问题。

nacos-discovery-stater原理

服务注册

  • spring-cloud-starter-alibaba-nacos-discovery遵循了spring-cloud-common标准,实现了 AutoServiceRegistration、ServiceRegistry、Registration 这三个接口。
  • 在springcloud应用的启动阶段,监听了WebServerInitializedEvent事件,当Web容器初始化完成后,即收到WebServerInitializedEvent 事件后,会触发注册的动作,调用ServiceRegistry的register方法,将服务注册到 Nacos Server。

服务发现

  • NacosServerList 实现了 com.netflix.loadbalancer.ServerList 接口,并在 @ConditionOnMissingBean 的条件下进行自动注入,默认集成了Ribbon。
  • 如果需要有更加自定义的可以使用 @Autowired 注入一个 NacosRegistration 实例,通过其持有的 NamingService 字段内容直接调用 Nacos API。

服务注册中心

nacos官网下载nacos-sever稳定版本,本地运行nacos服务,访问:http://localhost:8848/nacos,默认账号密码都是nacos(nacos默认集群启动,未配置的情况下需修改为单机启动

服务器上运行,可通过对应IP或域名访问;

spring-cloud-alibaba-group.github.io/github-page...

基于Nacos的服务提供者(nacos-service-provider)

创建一个服务提供者的springcloud项目,引入如下依赖:

XML 复制代码
    <properties>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <spring-cloud.alibaba.version>0.2.1.RELEASE</spring-cloud.alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <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>
    </dependencies>

在项目的application.yml文件中配置nacos相关的配置信息如下:

YML 复制代码
spring:
  application:
    name: nacos-service-provider
  cloud:
    nacos:
      discovery:
        register-enabled: true
        server-addr: 127.0.0.1:8848
        weight: 1
        #注册命名空间 不同环境的注册区分服务和配置隔离,在服务端创建命名空间,复制命名空间ID    
        namespace: 4406f989-aef1-4e4c-94cb-9b5a7ffa69ce
management:
  endpoints:
    web:
      exposure:
        include: "*"

server:
  port: 8080

Actuator暴露所有的端点,参考:blog.csdn.net/munangs/art..., 默认情况下,大多数端点都不通过http公开,我们公开了所有端点。对于生产,您应该仔细选择要公开的端点。 management: endpoints: web: exposure: include: "*"

基于Nacos的服务消费者:(nacos-service-consumer)

创建一个服务消费者的springcloud项目,引入如下依赖,这里多引入了open-feign和ribbon的依赖,是为了同时演示这两种方式的消费。

Spring Cloud版本如果Hoxton.M2 RELEASED版本之前的,Nacos Discovery默认是集成了Ribbon的,但是最新Alibaba-Nacos-DiscoveryHoxton.M2 RELEASED版本之后弃用了Ribbon,使用Spring Cloud Loadbalancer作为客户端的负载均衡组件。从Spring Cloud 2020版本开始,Spring Cloud移除了 Ribbon,使用Spring Cloud Loadbalancer作为客户端的负载均衡组件。

  1. Nacos 2021版本已经没有自带Ribbon的整合,所以需要引入另一个支持的jarloadbalancer;
  2. Nacos 2021版本已经取消了对Ribbon的支持,所以无法通过修改Ribbon负载均衡的模式来实现Nacos提供的负载均衡模式。 如果需要实现负载均衡,官方推荐替代方案是采用Spring Cloud LoadBalancer,默认是轮询

openfeign和Nacos都已集成了Spring Cloud LoadBalancer,弃用了ribbon

xml 复制代码
    <properties>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <spring-cloud.alibaba.version>0.2.1.RELEASE</spring-cloud.alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
        <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <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>
         <!-- openfeign和SpringCloud Loadbalancer如果多个模块需要可放在一个核心包供其他模块调用 --> 
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
     
        <!-- SpringCloud Loadbalancer -->
        <!--<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency> -->

    </dependencies>

在项目的application.yml文件中配置nacos相关的配置信息如下:

yml 复制代码
spring:
  application:
    name: nacos-service-consumer
  cloud:
    nacos:
      discovery:
        register-enabled: true
        server-addr: 127.0.0.1:8848
        weight: 1
        #注册命名空间 不同环境的注册区分服务和配置隔离,在服务端创建命名空间,复制命名空间ID    
        namespace: 4406f989-aef1-4e4c-94cb-9b5a7ffa69ce
management:
  endpoints:
    web:
      exposure:
        include: "*"

server:
  port: 8081

ReactorServiceInstanceLoadBalancer: ReactorServiceInstanceLoadBalancer作为ReactiveLoadBalancer的实现,默认提供了两种不同的负载均衡器,分别是:RandomLoadBalancer(随机负载均衡器)和RoundRobinLoadBalancer(轮询负载均衡器),在需要自定义负载均衡规则的时候我们只需要通过实现ReactorServiceInstanceLoadBalancer,重写choose方法即可。

接下来,需要在新的版本上实现RestTemplate负载均衡策略调用,结合Spring官方案例,需要自定义LoadBalancer配置机制来实现负载均衡,首先自定义负载均衡策略配置:

  • 自定义负载均衡策略CustomLoadBalancerConfiguration LoadBalancer只有随机查询和轮询,如果不适合自己的业务的话可以根据官方给的随机查询和轮询写法重新写一个类使用。也可以不定义使用默认轮询配置,openFeign新版已集成了LoadBalancer
java 复制代码
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

/**
 * Spring Cloud LoadBalancer替代Ribbon实现 随机/轮训 方式负载均衡策略配置
 *
 * @author: austin
 * @since: 2023/2/4 15:14
 */
public class CustomLoadBalancerConfiguration {

    /**
     * 自定义负载均衡策略(随机/轮训)
     *
     * @return ReactorLoadBalancer
     */
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory factory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);           //随机
        //return new RoundRobinLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);     // 轮训
    }
}

接着在RestTemplate配置上通过@LoadBalancerClient指定注入对应策略配置:

java 复制代码
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 配置我们自定义的LoadBalancer策略,注:这里的类为注入Bean的类,而非负载均衡的实现类
 *
 * @author austin
 * @date 2023/2/4 10:23
 */
@Configuration
@LoadBalancerClients(defaultConfiguration = {CustomLoadBalancerConfiguration.class})
public class CustomRestTemplateConfig {

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

在服务启动类添加:@LoadBalancerClient(value = "CLOUD-CONTENT-CENTER-SERVICE", configuration = CustomRestTemplateConfig.class)

java 复制代码
/**
 * 内容中心服务启动类
 *
 * @author austin
 */
@MapperScan(basePackages = "com.jacklin.mamba.mapper")
@SpringBootApplication
@EnableFeignClients
@LoadBalancerClient(value = "CLOUD-CONTENT-CENTER-SERVICE", configuration = CustomRestTemplateConfig.class)
public class MambaContentCenterApplication {

    public static void main(String[] args) {
        SpringApplication.run(MambaContentCenterApplication.class, args);
    }

}

创建服务消费者的代码如下,勿忘在主函数引入 @EnableDiscoveryClient 注解,注册到注册中心。 使用feign方式消费,需要有feign的client,如下,且项目主函数还需引入@EnableFeignClients 注解。

java 复制代码
package com.lazycece.scac.nacos.discovery.consumer.api;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient("nacos-service-provider")
@RequestMapping("/nacos")
public interface FeignConsumerApi {

    @GetMapping("/provider/{name}")
    String provider(@PathVariable String name);
}

服务的 EndPoint

spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个EndPoint,EndPoint的访问地址为 http://ip:port/actuator/nacos-discovery 。因为我们加了 spring-boot-starter-actuator 依赖,所以可以查看endpoint信息。EndPoint 的信息主要提供了两类:

  • subscribe: 显示了当前有哪些服务订阅者
  • NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置

其中一个服务实例访问 EndPoint 的信息如下所示:

json 复制代码
{
    "subscribe":[

    ],
    "NacosDiscoveryProperties":{
        "serverAddr":"127.0.0.1:8848",
        "endpoint":"",
        "namespace":"dev",
        "logName":"",
        "service":"nacos-service-provider",
        "weight":1,
        "clusterName":"DEFAULT",
        "namingLoadCacheAtStart":"false",
        "metadata":{

        },
        "registerEnabled":true,
        "ip":"192.168.3.8",
        "networkInterface":"",
        "port":8080,
        "secure":false,
        "accessKey":"",
        "secretKey":""
    }
}

命名空间(Namespace):

Namespace是官方推荐的多环境支持方案。 一个Nacos机器起起来,是可以通过Namespace命名空间+Group分组支持环境无限扩展,通过资源隔离,也就解决了我们的资源扩展问题。

当我们的服务达到一定的数量,集中式的管理许多服务会十分不便,那我们可以将这些具有相同特征或属性的服务进行分组管理,服务对应的配置也进行分组隔离

这里的分组就是Namespace的概念,将服务和配置纳入相同的Namespace进行管理,不同Namespace下的服务和配置之间就隔离开来

来进行多环境配置和服务的管理及隔离,在nacos服务端管理界面,新建不同环境的命名空间区分不同的环境

注册命名空间

默认是注册到public

namespace: c6d30215-938d-4750-836a-85fd10ca5142 # 命名空间ID

Nacos作为服务配置中心

我们在开发项目,到测试到最终发布一版要经历3个环境,每个环境的配置都是不一样的,这样我们可以把配置文件用Nacos来进行管理,动态更新。

  1. 引入spring-cloud-starter-alibaba-nacos-config
  2. 启动类添加:@EnableDiscoveryClient
  3. 配置自动更新:@RefreshScope

项目配置:

创建:cloudalibaba-config-nacos-client3377

XML 复制代码
<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

yml 复制代码
# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP
        namespace: 4406f989-aef1-4e4c-94cb-9b5a7ffa69ce
 
 
#nacos配置文件名完成的格式: ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

开发环境和数据库等配置可以防在nacos的配置文件上

yml 复制代码
spring:
  profiles:
    active: dev # 表示开发环境

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新: @RefreshScope

less 复制代码
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

在Nacos中添加配置信息:

Nacos中的匹配规则: 在 Nacos Spring Cloud 中,dataId 的完整格式:${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 <math xmlns="http://www.w3.org/1998/Math/MathML"> p r e f i x . {prefix}. </math>prefix.{file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

最终公式: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

nacos-config-client项目,Nacos界面配置对应:

历史配置:

Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新

测试:

  1. 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
  2. 运行cloud-config-nacos-client3377
  3. 调用接口查看配置信息:http://localhost:3377/config/info

动态刷新: @RefreshScope

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新


多环境多项目管理

实际开发中,通常一个系统会准备3个环境:

  1. dev开发环境
  2. test测试环境
  3. prod生产环境

如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

Namespace+Group+DataID

Namespace+Group+DataID相当于3级目录区分

最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。

默认情况:Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT

  1. Nacos默认的命名空间是public,Namespace主要用来实现隔离不同的部署环境。

  2. Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去

  3. 在Nacos中,一个"Service"代表一个微服务。一个微服务可以注册到Nacos中作为一个Service,并提供相关的服务实例信息,如IP地址、端口号等。

    而关于Cluster(集群),Nacos允许对一个Service进行虚拟划分,将其划分为多个Cluster。Cluster是为了实现微服务的高可用性和负载均衡而引入的概念。通过将相同的微服务实例划分到不同的Cluster中,可以在同一个Service下创建多个副本或实例,分别部署在不同的物理机器或节点上。

    然而,默认情况下,Nacos的Cluster是没有预设的,即默认Cluster为DEFAULT。这意味着如果您没有显式指定Cluster,所有服务实例都将被视为同一个Cluster。

    所以,根据给出的描述,可以说"一个Service可以包含多个Cluster,Nacos默认Cluster是DEFAULT",但需要注意的是,默认情况下Cluster并不是对指定微服务的虚拟划分。

比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。最后是Instance,就是微服务的实例。

三种方案加载配置:

DataID方案

  1. 指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
  2. 默认空间+默认分组+新建dev和test两个DataID
  3. 通过spring.profile.active属性就能进行多环境下配置文件的读取

新建dev配置DataID

Group方案

  1. 通过Group实现环境区分
  2. 在nacos图形界面控制台上面新建配置文件DataID
  3. bootstrap+application

在config下增加一条group的配置即可。

Namespace方案:

  1. 新建dev/test的Namespace
  2. 回到服务管理-服务列表查看,界面有命名空间ID
yml 复制代码
# nacos注册中心
server:
  port: 3377

spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #这里我们获取的yaml格式的配置
        namespace: 5da1dccc-ee26-49e0-b8e5-7d9559b95ab0
        #group: DEV_GROUP
        group: TEST_GROUP
yml 复制代码
# Nacos注册配置,application.yml
spring:
  profiles:
    #active: test
    active: dev
    #active: info

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

nacos.io/zh-cn/docs/...

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。

为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,支持MySQL的存储。

Nacos持久化配置:配置MySQL的存储

nacos.io/zh-cn/docs/...

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  • 1.安装数据库,版本要求:5.6.5+
  • 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  • 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
yml 复制代码
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

Linux版Nacos+MySQL生产环境配置

Nacos 需要 3个或3个以上Nacos节点才能构成集群,而且要使用 MySQL 作为数据源,主要用于服务配置的数据持久化。

下图是官方推荐的集群方案,通过域名 + VIP模式的方式来实现,我的理解VIP模式就用 Nginx 就行,用它来负载多个 Nacos 节点 IP,外部客户端直接通过域名访问就可,不仅可读性好,而且更换 IP 方便,最为推荐采用。

nacos.io/zh-cn/docs/...


案例:1个Nginx+3个nacos注册中心+1个mysql

1.安装Nginx+配置数据源+修改集群配置文件cluster.conf

这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP

注:配置文件和启动命令修改前备份

1.添加集群配置文件

nacos的conf目录下有配置文件cluster.conf,请每行配置成ip:port

cluster.conf配置: 如果您只有一台机器,可以创建3个或3个以上的Nacos文件夹,改一下端口号,也可以实现

2.配置MySQL数据库

Nacos 推荐生产环境中数据库使用建议至少主备模式,或者采用高可用数据库。

nacos_config数据库: 这里为了简化只采用了一个数据库,首先创建一个名为 nacos_config 的数据库,然后找到nacos/conf下的 nacos-mysql.sql 文件执行即可。

application.properties配置 在nacos的conf目录下的application.properties,添加以下配置

3.启动Nacos集群模式

在没有参数模式,是集群模式

sh startup.sh

输出信息看start.out,如果最后提示: INFO Nacos started successfully in cluster mode.这样就表示集群模式启动成功,然后打开任何一个Nacos控制台都能看到节点列表

集群节点列表

可以从上面看到,集群下的 Nacos 节点状态分为LEADER 和 FOLLOWER 两种,跟我们熟悉的主从架构相似。如果您想简单的话,推荐使用阿里云的MSE,3分钟帮您搞定Nacos集群模式

MSE的Nacos集群模式

4.Nginx配置

我是Mac电脑,所以使用brew的方式安装Nginx,然后在Nginx中进行配置

Nginx中的配置

注意:server_name 就是 直接改成域名就行。

然后Nginx -s reload 重新加载配置后即可,我把nacos官方Spring Cloud Nacos Example的示例打开,Provider和Consumer两个项目中的application.properties文件的nacos server地址都改成了 Nginx中配置的server_name。

指定nacos的server地址


启动项目,就可以在nacos集群的任何一个节点的服务管理列表中看到里面已经有服务注册成功了

服务列表页

然后在浏览器中输入 http://localhost:8080/echo/强哥 ,看到返回 Hello Nacos Discovery 强哥,这样就表示成功了,其实这个Example就是微服务和微服务之间的调用,所有nacos示例代码下载

5.总结

如果是开发环境建议单节点就行了,测试和生产环境用集群模式,而且MySQL数据库也建议使用阿里云的RDS服务,主从架构。下一篇我们将介绍 几个主流微服务框架配置中心产品比较 Spring Cloud Config、阿里云ACM、Nacos等。

参考:

developer.aliyun.com/article/847...

电子书免费下载地址:developer.aliyun.com/topic/downl...

Nacos 电子书语雀共建库:www.yuque.com/nacos/ebook

nacos.io/zh-cn/index...

github.com/alibaba/spr...

developer.aliyun.com/article/738...

相关推荐
掘金-我是哪吒8 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
茶馆大橘9 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
想进大厂的小王12 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
九卷技术录12 小时前
(微服务)服务治理:几种开源限流算法库/应用软件介绍和使用
微服务·服务治理·限流算法
阿伟*rui13 小时前
认识微服务,微服务的拆分,服务治理(nacos注册中心,远程调用)
微服务·架构·firefox
想进大厂的小王16 小时前
Spring-cloud 微服务 服务注册_服务发现-Eureka
微服务·eureka·服务发现
Gemini199520 小时前
分布式和微服务的区别
分布式·微服务·架构
茶馆大橘1 天前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
coding侠客1 天前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
lexusv8ls600h1 天前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式