3

Spring Cloud Alibaba之Nacos - 与牛竞技

 1 year ago
source link: https://www.cnblogs.com/gagaxiang/p/17008832.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Spring Cloud Alibaba之Nacos

目录结构:

  一、Spring Cloud Alibaba简介

  二、使用版本情况

  三、什么是Nacos?

  四、Nacos运行环境部署

  五、Nacos注册中心

  六、Nacos命名空间和分组

  七、Nacos配置中心

  八、基于profile多环境配置

  九、Nacos配置中心动态刷新

  十、Nacos数据持久化

  十一、Nacos集群部署

一、Spring Cloud Alibaba简介

Spring Cloud Alibaba是Spring Cloud下的一个子项目,Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案,它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序,使用Spring Cloud Alibaba,您只需要添加一些注解和少量配置即可将Spring Cloud应用程序整合Alibaba的分布式解决方案,并使用Alibaba中间件构建分布式应用程序系统。

二、使用版本情况

1、项目所使用的的版本

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version
2.2.9.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE

2、Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本:

Spring Cloud Alibaba Version Nacos Version Sentinel Version Seata Version RocketMQ Version Dubbo Version
2.2.9.RELEASE 2.0.4 1.8.5 1.5.2 4.9.4 2.7.13

三、什么是Nacos?

Nacos是阿里巴巴2018年7月推出来的一个开源项目,是一个构建微服务应用的服务注册与发现、配置管理平台;

Nacos 属于Spring Cloud Alibaba下的一个组件;

Nacos 约等于 Spring Cloud Eureka(注册中心)+ Spring Cloud Config(配置中心)

Nacos官网:https://nacos.io/

四、Nacos运行环境部署

服务端(部署一个nacos-server)+ 客户端(你的各个服务)

  1、下载Nacos的二进制压缩包

  下载地址:https://github.com/alibaba/nacos/releases

  2、解压下载下来的Nacos的二进制压缩包  

  tar -zxvf nacos-server-2.0.4.tar.gz

  3、启动nacos server

  [root@localhost bin]# ./startup.sh -m standalone

  注:单机环境必须带-m standalone参数启动,否则无法启动,不带参数启动的是集群环境

  4、访问nacos的web客户端地址:http://ip地址:8848/nacos

  使用默认的用户名:nacos、密码:nacos

  5、关闭nacos server

  [root@localhost bin]# ./shutdown.sh

五、Nacos注册中心

Nacos注册中心可以说是类似于Eureka-server的功能

1391607-20221227200418451-563592416.png

微服务开发是controller调用controller,调用者是服务消费者,被调用者是服务提供者,服务消费者和服务提供者是相对概念,服务消费者也可以被另一个服务调用,那么此时的服务消费者也是一个服务提供者;

在实际开发中,我们会把所有服务都注册到nacos注册中心上,由nacos去维护和管理我们的所有服务。

5.1、实现服务提供者

1、pom.xml 文件中引入Nacos Discovery Starter依赖

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

2、配置文件application.yml中添加Nacos Server地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos

  application:
    name: nacos-provider

注意:如果不想使用Nacos作为你的服务注册与发现,可以将spring.cloud.nacos.discovery.enabled 设置为 false。

3、启动项目,此时就可以在Nacos的web管控台上看到注册上来的服务信息了;

1391607-20221227204504797-1954229387.png

 5.2、实现服务消费者

消费者应用比提供者应用要稍微复杂一点,因为在消费端需要去调用提供者提供的REST服务,此时需要用到RestTemplate、OpenFeign及负载均衡Spring Cloud LoadBalancer。

1、添加OpenFeign、Nacos Discovery Starter依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、配置文件application.yml中添加Nacos Server地址

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos

  application:
    name: nacos-consumer

3、新建Feign接口,调用服务提供者

// nacos-provider是服务提供者的应用名,也就是注册到Nacos中的应用名
@FeignClient(value = "nacos-provider")
public interface ProductFeign {
    // 服务提供者对应的controller接口
    @GetMapping("/product/{id}")
    Product getProduct(@PathVariable("id") Integer id);
}

4、服务消费者接口实现类中注入Feign对象,调用服务提供者

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderDao orderDao;
    @Resource
    private ProductFeign productFeign;
    @Override
    public int addOrder(Integer id) {
        // 注入Feign接口对象,调用服务提供者接口
        Product product = productFeign.getProduct(id);
        int result = 0;
        if (product != null) {
            Order order =
                    Order.builder().orderName("我购买的").orderMoney(new BigDecimal(1000)).productId(1).orderStatus(0).memberId(1001).build();
            result = orderDao.addOrder(order);
        }
        return result;
    }
}

六、Nacos命名空间和分组

6.1、命名空间:用于隔离每一个微服务的外部应用配置,每一个微服务都可以有自己单独的配置环境。默认新增的所有服务都在public空间(保留空间)。

1391607-20221227214017740-1883281370.png

 新建命名空间,每一个服务都可以创建一个命名空间

1391607-20221227214539123-1971321830.png

 6.2、配置分组:默认所有的配置都属于:DEFAULT_GROUP

每个微服务创建自己的命名空间,使用配置分组区分环境:开发环境dev,测试环境test以及生产环境prod等

创建分组:选择对应的命名空间,点击“+”创建分组配置

1391607-20221227215221346-131727837.png

七、Nacos配置中心

Nacos配置中心类似于Spring Cloud Config的功能

Spring Cloud Config 使用git仓库存储配置文件,程序员自己创建config-server的服务器,把各个微服务作为客户端

Nacos 作为配置中心,配置的信息存储到服务端,就是Nacos。Nacos提供用于存储配置数据功能,为分布式系统中的配置数据提供服务器端和客户端支持,使用Spring Cloud Alibaba Nacos Config就可以在Nacos Server集中管理Spring Cloud应用的外部属性配置;

Spring Cloud Alibaba Nacos config是在启动的bootstrap阶段,将配置加载到Spring环境中;

通过bootstrap.properties(bootstrap.yml)启动我们的微服务

6.1、基于Nacos配置中心构建微服务应用

1、pom文件中添加Nacos Config依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.1.5</version>
</dependency>

2、项目配置文件bootstrap.yml中

Spring Cloud Alibaba Nacos Config会根据命名空间、DataId、GROUP以及文件后缀名确定唯一一个配置

spring:
  cloud:
    nacos:
      config:
        server-addr: http://ip地址:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: dev-group
        file-extension: properties

  application:
    name: config-server

3、Nacos中添加外部配置文件

1391607-20221227221106235-1887448893.png

4、客户端通过nacos调用外部配置文件,拿到相应的属性值

@RestController
public class ConfigController {
    @Value("${user.info.username}")
    private String username;
    @Value("${user.info.password}")
    private String password;
    @GetMapping("/user/info")
    public String getUserInfo(){
        return username + ": " + password;
    }
}

八、基于profile多环境配置

nacos配置中心在加载配置的时候,不仅仅加载了以 dataid为 ${spring.application.name}.${file-extension:properties} 的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置;

在日常开发中如果遇到多套环境下的不同配置,可以通过Spring提供的 ${spring.profiles.active} 配置项来激活使用某个配置文件;

1、在Nacos中创建两个配置文件

1391607-20221227223404912-1573193244.png

 2、修改项目的配置文件bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: http://192.168.0.130:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: user-group
        file-extension: properties

  application:
    name: config-server
  profiles:
    active: dev

如果需要切换到测试环境,只需要更改 ${spring.profiles.active} 参数配置即可,如下所示:

spring.profiles.active=test

九、Nacos配置中心动态刷新

Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发org.springframework.cloud.context.refresh.ContextRefresher的refresh 方法;

可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新;

controller 加上以下注解

@RestController
@RefreshScope
public class ConfigController {
    @Value("${user.info.username}")
    private String username;
    @Value("${user.info.password}")
    private String password;
    @GetMapping("/user/info")
    public String getUserInfo(){
        return username + ": " + password;
    }
}

十、Nacos数据持久化

参考网址:https://nacos.io/zh-cn/docs/deployment.html

Nacos默认情况下是采用apache derby内嵌数据库进行数据存储,在单机模式时可以使用nacos嵌入式数据库实现数据存储,但是derby数据库不方便观察数据存储的基本情况,从acos 0.7版本开始增加了支持mysql数据源能力;

具体操作步骤:

第一步:安装数据库,版本要求:5.6.5+;

第二步:初始化MySQL数据库(也就是生成对应的数据库和表),数据库初始化文件: nacos-mysql.sql,该文件可以在Nacos程序包下的 conf目录下获得

1391607-20221228082759365-580978823.png

第三步:修改 conf/application.properties文件,增加支持MySQL数据源配置,添加(目前只支持mysql)数据源的url、用户名和密码

#*************** Config Module Related Configurations ***************#
    32    ### If use MySQL as datasource:
    33     spring.datasource.platform=mysql
    34    
    35    ### Count of DB:
    36     db.num=1
    37    
    38    ### Connect URL of DB:
    39     db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
    40     db.user.0=root
    41     db.password.0=123456

第四步:然后启动nacos(还是单机启动),此时发现nacos所有嵌入式数据库的数据都写到了mysql;

1391607-20221228083410386-333875273.png

十一、Nacos集群部署

具体配置步骤:

1、准备三个nacos,3个或3个以上Nacos节点才能构成集群;

2、在Nacos的conf目录下有一个cluster.conf.example,可以直接把example扩展名去掉来使用,也可以单独创建一个cluster.conf文件,然后在该文件中每行配置一个ip:port;

1391607-20221228083912835-1590449835.png

 端口号需要和对应nacos的文件application.properties中的端口号一致

1391607-20221228084051577-975086822.png

3、按照上面nacos持久化的方式配置好数据持久化到MySQL,生产使用建议至少主备模式,或者采用高可用数据库

4、启动测试;

1391607-20221228084439811-215967666.png
1391607-20221228085010598-1023772806.png

集群下客户端怎么连?

第一种:可以在单机的基础上加多个IP和端口中间用逗号隔开;

spring:
  cloud:
    nacos:
      config:
        server-addr: http://ip地址1:8848/nacos,http://IP地址2:8848/nacos,http://ip地址3:8848/nacos
        username: nacos
        password: nacos
        namespace: e769b2bd-5082-4829-82a5-3c98ee6cf758
        group: user-group
        file-extension: properties

  application:
    name: config-server
  profiles:
    active: dev

第二种:配合Nginx代理我们的Nacos集群,配置里就直接写Nginx的IP和端口即可;


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK