欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring cloud alibaba nacos

程序员文章站 2022-05-05 11:43:38
...

一、nacos是什么?

Nacos前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
一个更易于构建云原生应用的动态服务与发现、配置管理和服务管理平台(来自官网)

二、能做什么?

Nacos:Dynamic Naming and Configuration Service Nacos
就是注册中心与配置中心的组合,Nacos等价于Eureka + config + Bus
代替Eureka做注册中心,代替cloud config做配置中心

各个服务注册与发现中心对比
spring cloud alibaba nacos
Nacos支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的; 而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos -client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式**册实例之前必须先注册服务,如果服务不存在,则会返回错误。
spring cloud alibaba nacos
什么是CP AP?

CAP理论是分布式事务处理的理论基础,CAP理论是分布式系统在设计时只能在一致性(Consistency),可用性(Availability),分区容忍性(PartitionTolerance)中满足两种,无法兼顾三种。

一致性:服务器集群多个节点都存储了用户数据,三个节点的数据需要保持同一时刻数据一致性

可用性:服务器集群多个节点,其中一个节点宕机不影响整个集群对外提供服务

分区容忍性:分区容忍性就是允许通过网络协同工作,分区容忍性要解决由于网络分区导致数据的不完整和无法访问的问题
分布式系统不可避免的出现了多个系统通过网络协同工作的场景,结点之间难免会出现网络中断、网延延迟等现象,这种现象一旦出现就导致数据被分散在不同的结点上,这就是网络分区。

CAP的组合方式

CA:放弃分区容忍性,加强一致性和可用性,关系数据库按照CA进行设计

AP:放弃强一致性,加强可用性和分区容忍性,追求最终一致性,很多nosql数据库按照AP设计。这里放弃一致性是指放弃强一致性,强一致性就是写入成功立即查出最新数据。追求最终一致性是指允许暂时数据不一致,在用户可接收的时间里数据一致即可。

CP:放弃可用性,加强一致性和分区容忍性,一些强一致性的系统按CP设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。

实际上分布式环境只能选择满足CP(强一致性,如果出现不一致则需要拒绝服务)或者AP(强可用性,可能出现不同节点数据存在差异的问题),是因为分布式环境几乎必然会出现因为网络问题导致部分节点暂时不能被集群中其他节点感知到的情况,所以长时间来看整个集群几乎是必然会出现分区的情况(也就是分成2 3 4个不同小团队的情况),这也导致P是肯定要有的

三、如何使用
Nacos中文文档:https://nacos.io/zh-cn/docs
1.下载与安装
①.发行包方式,下载后,进入bin目录,根据系统选择cmd 或者 sh运行即可
https://github.com/alibaba/nacos/releases
②.源码方式

//克隆
git clone https://github.com/alibaba/nacos.git
cd nacos/
//打包
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows
启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件。
启动后访问 127.0.0.1:8848看到下面界面,则为成功 账号:nacos 密码:nacos
spring cloud alibaba nacos
2.pom.xml

<!-- 统一配置需要的依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 服务注册与发现需要的依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.1服务注册与发现的application.properties配置 Nacos server 的地址和应用名:

server.port=8070
spring.application.name=service-provider
# nacos server的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3.2统一配置的bootstrap.properties 中配置 Nacos server 的地址和应用名

spring.application.name=ace-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yaml
spring.profiles.active=dev

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

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

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成

$ {prefix}.${file-extension}

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

3.3命名空间,Group,DataId 是什么?spring cloud alibaba nacos
类似JAVA里面的package名和类名
最外层的nameSpace是可以区分部署环境的,Group和dataID逻辑区分两个目标对象spring cloud alibaba nacos
默认情况:
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) , 还可以尽量让同一个机房的微服务互相调用,以提升性能。

DataID方案配置
spring cloud alibaba nacos

spring.profiles.active=dev

Group方案配置
spring cloud alibaba nacos

spring.cloud.nacos.config.group=DEFAULT_GROUP

Namespace方案配置
spring cloud alibaba nacos

spring.cloud.nacos.config.namespace = 69ad481e-a1e7-4c6d-a91d-2d4439db78f3

四、开启服务注册发现功能
1.启动类上通过 Spring Cloud 原生注解 @EnableDiscoveryClient开启服务注册发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
    
}

2.通过 Spring Cloud 原生注解 @RefreshScope 实现统一配置自动更新(如果不加此注解,统一配置只会获取第一次服务启动时候的值):

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

————————————————————————————————————
Nacos集群配置

Nacos支持三种部署模式

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

默认Nacos使用嵌入式数据库(derby)实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
spring cloud alibaba nacos
derby切换到mysql配置步骤
1.安装数据库,版本要求:5.6.5+
2.nacos\conf下找到nacos-mysql.sql 在mysql数据库中运行spring cloud alibaba nacos
spring cloud alibaba nacos
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring cloud alibaba nacos
spring cloud alibaba nacos
2、配置集群ip(最少需要三个节点,我这里的ip是用局域网ip)spring cloud alibaba nacos
spring cloud alibaba nacos
然后将这份nacos复制到另外两个服务器后。依次启动三个nacos

nginx负载均衡配置(以下安装方式默认已安装docker)
Docker安装Nginx
拉取Nginx镜像

docker pull nginx

spring cloud alibaba nacos
创建Nginx容器

docker run -di --name=nacos_nginx -p 80:80 nginx

spring cloud alibaba nacos
访问是否部署成功spring cloud alibaba nacos
官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下
在容器内编辑配置文件不方便,我们可以先将配置文件从容器内拷贝到宿主机,编辑修改后再拷贝回去。

docker cp nacos_nginx:/etc/nginx/nginx.conf nginx.conf

spring cloud alibaba nacos

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream cluster{
        server 192.168.1.197:8848;
        server 192.168.1.60:8848;
        server 192.168.1.118:8848;
    }
    server {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass  http://cluster;
        }
    }
    include /etc/nginx/conf.d/*.conf;
}

将修改后的配置文件拷贝到容器

docker cp nginx.conf nacos_nginx:/etc/nginx/nginx.conf

重新启动容器

docker restart nacos_nginx

访问 http://你的公网ip/nacos
账号:nacos 密码:nacos
出现下面内容则为成功spring cloud alibaba nacos
最后在yml中配置nginx的映射地址即可spring cloud alibaba nacos