深入理解Spring Cloud Alibaba组件_Nacos_由浅至深

Nacos简介

Nacos是阿里巴巴开源的服务注册中心以及配置中心。
学过Spring Cloud 的小伙伴肯定都接触过EurekaConfigBus

EurekaConfig这两个组件相信大家都用过,有什么感受?

感受就是繁琐:

  • 无论是Eureka还是Config都必须自己搭建个服务
  • 英文界面不是那么友好

用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。当然最重要的原因就是以上组件很可能面临停更、比如Eureka已经停更了,谁知道后面其他的组件会不会如此呢?

Nacos主要提供以下四大功能

  • 服务发现和健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

Docker安装Nacos服务

下载镜像

docker pull nacos/nacos-server:1.4.3

单机版部署

docker run -d --name nacos -p 8848:8848 -e MODE=standalone -e NACOS_SERVER_IP=ip
nacos/nacos-serve:1.4.3

参数:

  • MODE:单节点模式

  • NACOS_SERVER_IP:服务ip地址

  • 通过http://ip:port/nacos即可访问nacos服务

image.png

应用注册到Nacos上

Dubbo实现服务生产者

  • 创建父工程进行统一的依赖管理
<!--    进行依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.26</version>
            </dependency>

        </dependencies>
    </dependencyManagement>
  • 编写公共模块,我们使用的是Dubbo进行远程调用,service层和controller层都需要引入公共模块,在公共模块需要编写接口,在service层将接口注册到nacos上,在controller层远程调用

eg:

JAVA中接口引用指向其实现类对象,比如ArrayList实现了List接口则生成了ArrayList对象,也就是List list = new ArrayList();也就是所有实现类List接口的类,都可以用List接口来声明对象类型,然后用实现类进行实例化。

  • 编写服务生产者service
<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>
        <version>2.6.3</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>com.xiaoxiao</groupId>
        <artifactId>cloud-common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

接口实现类

@DubboService(timeout = 5000,
methods = {@Method(name = "index",retries = 2)},cluster = "failfast",version = "1.0.0")
public class IProviderPaymentServiceImpl implements IPaymentService {
    @Override
    public String index() {
        return "支付成功";
    }
}
  • 编写服务消费者
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.6.3</version>
    </dependency>

    <dependency>
        <groupId>com.xiaoxiao</groupId>
        <artifactId>cloud-common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

业务层

@Service
public class PaymentServiceImpl {

    @DubboReference(version = "1.0.0",
    mock = "com.xiaoxiao.service.fallback.PaymentServiceImplFallBack",
    cluster = "failfast")
    private IPaymentService paymentService;

    public String index(){
        String name = this.paymentService.index();
        return name;
    }

}

服务降级策略

/**
 * 服务降级策略
 */
public class PaymentServiceImplFallBack implements IPaymentService {


    @Override
    public String index() {
        return "服务器繁忙请稍后重试.....";
    }
}

分布式配置中心

上面我们了解了Nacos可以当作服务注册中心进行服务治理,Nacos还可以当作分布式配置中心。

为什么需要分布式配置中心

Spring的项目中,默认会提供一个application.properties/application.yml

image.png

主要缺点:

  • 不支持配置文件动态更新: 在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。

  • 不支持配置集中式管理: 在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。

  • 不支持多环境部署: 如果通过底层框架来维护不同环境的信息,则成本也是非常高的。

分布式配置管理就是弥补上述不足的方法

image.png

Namespace命名空间

Namespace主要进行多环境下的管理和隔离,现如今,在微服务体系中,一个系统往往被拆分成多个服务,每个服务都有自己的配置文件,每个系统还会准备 开发环境、测试环境、生产环境(线上环境) 进行多环境配置。

不足:

假设我们游一个系统,该系统有十个微服务,那么至少需要10个配置文件,还需要进行多环境配置,三个环境(dev、test、prod),那就有30个配置文件需要进行管理。

Namespace就是解决上述问题的

在不同的命名空间下,可以配置相同环境的Group或者DataID的配置。Namespace的常用场景之一是不同环境的配置进行区分隔离。

Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod等。

image.png

注意:

命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

image.png

查看命名空间

image.png

DataID配置

DataID拼接形式

${prefix}-${spring.profiles.active}-${file.extension}

解释:

  • prefix:默认为 spring.application.name 的值。

  • spring.profiles.active:即为当前环境对应的 profile(环境名)。

  • file-extension:文件后缀

Nacos集群架构

默认Nacos使用嵌入式数据库Derby实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

image.png

Nacos数据持久化

初始化数据库

Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有进入\nacos\conf目录,初始化文件:nacos-mysql.sql此处我创建一个名为 mynacos 的数据库,然后执行初始化脚本,成功后会生成 11 张表;

修改配置文件

这里是需要修改Nacos-server的配置文件Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:

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

启动Nacos-server和Nacos-config

先启动Nacos-server,启动成功后进入Nacos控制台,此时的Nacos控制台中焕然一新,之前的数据都不见了。

注意:

因为加入了新的数据源,Nacos从mysql中读取所有的配置文件,而我们刚刚初始化的数据库是干干净净的,自然不会有什么数据和信息显示。

在公共空间(public)中新建一个配置文件DataID: order-consumer-dev.yml, 配置内容如下:

image.png

验证是否持久化到数据库中:

image.png

Nacos集群配置

模拟三台机器,端口号分别为8848、8858、8868

修改各自的application.properties文件

将各自的conf文件夹下的cluster.conf.example重命名为cluster.conf,文件内容为:

192.168.66.101:8848
192.168.66.101:8858
192.168.66.101:8868

使用Nginx做负载均衡反向代理访问Nacos集群

安装c语言编译器
yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel
安装Nginx
# 生产MakeFile文件
./configure
# 依赖安装生成nginx文件夹
make && make install
配置nginx.conf文件
#指定上游服务器列表
upstream  nacos{  
    #指定后端服务器地址
    server 192.168.66.101:8848;    
    server 192.168.66.101:8858; 
    server 192.168.66.101:8868;   
}
 
server {
 listen 80;
 server_name localhost;
 location / {
   proxy_pass http://nacos;    #引用upstream
  }
}

启动Nginx

image.png

通过Nginx访问Nacos
浏览器输入:http://ip:port/nacos

Nginx默认端口为80

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud Alibaba Nacos 是一个服务注册中心和配置中心,可以实现服务的注册与发现、配置的动态管理等功能,同时还提供了容灾和高可用的支持。下面简单介绍如何使用 Nacos 实现 Spring Cloud 的配置容灾。 首先,在应用的 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.3.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.3.RELEASE</version> </dependency> ``` 然后在 `application.properties` 中配置 Nacos 的地址和应用的名称: ```properties spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.namespace=your-namespace spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=your-namespace spring.cloud.nacos.config.file-extension=properties spring.application.name=your-application-name ``` 其中 `server-addr` 是 Nacos 的地址,`namespace` 是命名空间,`file-extension` 是配置文件的扩展名,`application.name` 是应用的名称。 接着在 `bootstrap.properties` 中配置应用的环境和配置来源: ```properties spring.profiles.active=dev spring.cloud.nacos.config.prefix=${spring.application.name}-${spring.profiles.active} spring.cloud.nacos.config.group=DEFAULT_GROUP spring.cloud.nacos.config.shared-dataids=${spring.application.name}-${spring.profiles.active}.properties ``` 其中 `spring.profiles.active` 是应用的环境,`prefix` 是配置文件的前缀,`group` 是配置文件所在的分组,`shared-dataids` 是配置文件的名称。 最后,在代码中使用 `@Value` 注解来获取配置项的值: ```java @RestController public class ConfigController { @Value("${config.key}") private String configValue; @GetMapping("/config") public String getConfig() { return configValue; } } ``` 其中 `config.key` 是配置项的名称。 以上就是使用 Nacos 实现 Spring Cloud 的配置容灾的简单示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿晓晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值