SpringCloud-Alibaba之配置中心Nacos

此文章主要讲解springcloud中的服务注册和配置中心Nacos的相关知识。

Spring Cloud Alibaba

Github官网:https://github.com/alibaba/spring-cloud-alibaba

概述

之所以有Spring CloudAlibaba,是因为Spring Cloud Netflix项目进入维护模式

不是不更新了,是不会开发新组件了,所以,某些组件都有代替版了,比如 Ribbon 由 Loadbalancer 代替等等。

支持的功能

服务限流降级:默认支持Servlet、Feign、RestTemplate、Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics 监控。

服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持。

分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力。

阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker (schedulerx-client)上执行。

这几乎可以将之前的 Spring Cloud NetFlix 代替。

怎么玩

<!--spring cloud Alibaba-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

具体组件:

Nacos简介

为什么叫Nacos?

  • 前四个字母为Naming和Configuration的前两个字母,最后的s为Service。

Nacos是什么?

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

  • Nacos:Dynamic Naming and Configuration Service。

  • Nacos就是注册中心和配置中心的结合,换言之Nacos=Eureka+Config+Bus。

Nacos能干嘛?

  • 替代Eureka做服务注册中心。

  • 替代Config做服务配置中心。

去哪里下?

各种注册中心比较

C(Consistency):一致性

A(Availability):可用性

P(Partition tolerance):分许容错性

服务注册和发现CAP模型控制台管理社区活跃度
EurekaAP支持低(2.x版本闭源)
ZookeeperCP不支持
ConsulCP支持
NacosAP支持

据说Nacos在阿里内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验。

安装和运行

安装

准备工作

  • 本地安装有JDK8Maven3.x环境。

下载

运行

  • 解压缩安装包。

  • 直接在bin目录下,使用startup.cmd -m standalone命令启动Nacos。以单机模式启动。

  • 命令运行成功后直接访问 http://localhost:8848/nacos (默认用户名和密码为nacos/nacos)。

image-20210121122307564

  • 登录成功,结果页面:

image-20210121122358830

Nacos作为服务注册中心

记得在父工程中引入 Spring Cloud Alibaba 依赖

<!--spring cloud Alibaba-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

基于Nacos的服务提供者

新建Module

cloudalibaba-provider-payment9001

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">
    <parent>
        <artifactId>spring_cloud_atguigu_2020</artifactId>
        <groupId>com.itjing.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <dependencies>
        <!-- springcloud alibaba nacos 依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- springboot整合Web组件 -->
        <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>

        <!-- 日常通用jar包,导入了mybatis记得配置数据库url-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- 引入自己定义的api通用包-->
        <dependency>
            <groupId>com.itjing.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

YML文件

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos的地址

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类

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

业务逻辑

@RestController
public class PaymentController {
    
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String payment(@PathVariable(value = "id") Integer id) {
        return "Nacos的注册中心的端口是:" + serverPort + ",id是:" + id;
    }
}

测试

启动 9001

访问: http://localhost:8848/nacos/ ,查看注册情况

image-20210121124302824

再次新建提供者

Nacos 自带负载均衡机制

为了演示 nacos 的负载均衡,参照 9001 新建 9002

或者可以拷贝虚拟端口映射:

image-20210121124934503

基于Nacos的服务消费者

新建Module

cloudalibaba-consumer-order80

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">
    <parent>
        <artifactId>spring_cloud_atguigu_2020</artifactId>
        <groupId>com.itjing.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-order80</artifactId>

    <dependencies>
        <!-- springcloud alibaba nacos 依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- springboot整合Web组件 -->
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入自己定义的api通用包-->
        <dependency>
            <groupId>com.itjing.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

YML文件

server:
  port: 80

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置Nacos的地址

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

# 消费者将要去访问的微服务名称(成功注册进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

主启动类

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

业务逻辑

配置类

nacos底层也是ribbon,需要注入ReatTemplate

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced // 负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
Controller
@RestController
@Slf4j
public class OrderController {

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/nacos/{id}")
    public String orderId(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }
}

测试

  1. 启动两个提供者 9001/9002
  2. 启动消费者 80

测试访问: http://localhost/consumer/nacos/1 ,成功,并且实现了负载均衡

各种服务注册中心对比

Nacos生态图

image-20210121131825784

Nacos服务发现实例模型

image-20210121131908066

Nacos和其他注册中心特性对比

image-20210121131949281

Nacos支持AP和CP模式的切换

概述

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

  • 如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8s服务和DNS服务则使用于CP模式。CP模式下支持注册服务化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

模式切换

  • Nacos集群默认支持的CAP原则中的AP原则,但是也可以支持CP原则,切换命令如下:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
  • 同时微服务的bootstrap.properties需要配置如下选择指明注册为临时/永久实例(AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例)。
#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=false

Nacos配置中心

Nacos作为服务配置中心的基础配置

新建Module

cloudalibaba-nacos-config3377

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">
    <parent>
        <artifactId>spring_cloud_atguigu_2020</artifactId>
        <groupId>com.itjing.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-nacos-config3377</artifactId>

    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <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>
</project>

YML文件

  • Nacos 和 Spring Cloud Config一样,在项目初始化的时候,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

  • SpringBoot中配置文件的加载时存在优先级顺序的,bootstrap优先级高于application。

bootstrap.yml ,系统级别的

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格式的配置
        
management:
  endpoints:
    web:
      exposure:
        include: '*'

application.yml ,用户自定义的

spring:
  profiles:
    active: dev # 表示开发环境

以上两个文件放在一起,表明从 nacos 上拉取 dev 环境的配置文件。

主启动类

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

Controller

@RestController
@RefreshScope  //支持Nacos的动态刷新
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

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

向Nacos中添加配置信息

  • Nacos中的dataId的组成格式和Spring Cloud中的配置文件的匹配规则。

    image-20210121135824112

    ${prefix}-${spring.profiles.active}.${file-extension}
    
  • 官方地址

image-20210121134449139

从上面可以看到重要的一点,配置文件的名称第二项,spring.profiles.active 是依据当前环境的profile属性值的,也就是这个值如果是 dev,即开发环境,它就会读取 dev 的配置信息,如果是test,测试环境,它就会读取test的配置信息,就是从 spring.profile.active 值获取当前应该读取哪个环境下的配置信息。

则根据之前的配置文件, Nacos 的 Data Id 应为:nacos-config-client-dev.yaml

image-20210121135217231

新建配置:

image-20210121135344895

image-20210121135523044

测试

启动 cloudalibaba-nacos-config3377 的主启动类

调用接口查看: http://localhost:3377/config/info

自带动态刷新

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

这样以后就不用在项目中建立配置中心了,客户端直接刷新了。

Nacos作为服务配置中心的分类配置

问题:多项目多环境问题

问题1

  • 在实际开发中,通常一个系统会准备:dev开发环境,test测试环境,prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件?

问题2

  • 一个大型分布式微服务会有很多微服务子项目,每个微服务服务又都会有相应的开发环境、测试环境、预发布环境、正式环境等等,如果对这些微服务配置进行管理?

Nacos图形化界面管理

配置列表

image-20210121141504661

命名空间

image-20210121141539625

Namespace+Group+DataId什么关系,为什么这么设计?

Namespace+Group+DataId是什么?

  • Namespace+Group+DataId 类似于Java里面的 package(包名)和类名

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

Namespace+Group+DataId的关系以及设计的意图

image-20210121142031151

  • 默认情况下,Namespace=publicGroup=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,就是微服务的实例。

三种方案加载配置

DataID方案

  1. 指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置(常用)
  2. 默认空间+默认分组+新建 dev 和 test 两个 DataID:
  • 新建dev配置DataID
  • 新建test配置DataID

image-20210121142931950

  1. 通过 spring.profile.active 属性就能进行多环境下配置文件的读取

image-20210121143320250

Group方案

通过Group实现环境区分,新建配置指定不同Group

image-20210121144207568

image-20210121144354499

在 bootstrap.yml中的 config 下增加一条 group的配置即可

image-20210121145409117

Namespace方案

新建 dev/test 的 Namespace,会自动给创建的命名空间分配命名空间ID

image-20210121145709091

image-20210121145741846

可以看到多出了两个命名空间。

image-20210121145938444

image-20210121150621097

dataid、group、namespace 三者关系如下:

(不同的dataid,是相互独立的,不同的group是相互隔离的,不同的namespace也是相互独立的)

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

官网说明

官网地址

官网集群架构图

image-20210121151556045

Nacos集群架构图理解

image-20210121151724863

说明

单机版的Nacos持久化配置

  • Nacos默认自带的是嵌入式数据库derby,不方便观察数据存储的基本情况,需要将数据源由derby切换到MySQL。

  • derby切换到MySQL的步骤:

    • 安装MySQL数据库,版本要求5.6.5+。
    • 初始化MySQL数据库,数据库的sql脚本在nacos/conf/nacos-mysql.sql文件中
  • 修改conf/application.properites文件,增加支持MySQL数据源配置(目前只支持MySQL),添加MySQL的数据源的URL、用户和密码等。

    spring.datasource.platform=mysql
    
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=root
    
  • 启动Nacos

Linux版Nacos+MySQL生产环境配置

准备工作

  • Nginx:1个。

  • Nacos Server:3个。

  • MySQL:1个(IP地址为192.168.32.100,端口是3306)。

  • Centos7:3个(IP地址分别为192.168.32.100、192.168.32.101和192.168.32.102)。

逻辑架构图

image-20210121154017591

在每个Centos7系统中下载Linux版本的Nacos

点我下载

cd /opt
wget https://github.91chifun.workers.dev//https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
tar -zxvf nacos-server-1.3.2.tar.gz

数据库环境

将nacos-mysql.sql文件导入到每个CentOS7系统的MySQL数据库中

持久化配置

在每个CentOS7系统上的Nacos的conf/application.properties文件中加入如下的配置:

# 在最后一行添加
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.32.100:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

集群配置

  • 在每个CentOS7系统上的Nacos的conf目录,复制cluster.conf.example文件,并改名为cluster.conf
cp cluster.conf.example cluster.conf
  • 修改每个CentOS7系统上的Nacos的conf/cluster.conf文件,并添加如下的配置,指定哪几个节点是Nacos集群:
  • 前面的ip地址不能写127.0.0.1,必须是用Linux命令 hostname -i 能够识别的ip
192.168.32.100:8848
192.168.32.101:8848
192.168.32.102:8848
  • 分别启动各个Nacos服务。
/opt/nacos/bin
./startup.sh

修改Nginx的配置文件并启动Nginx

  • nginx.conf
#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 nacos {
        server 192.168.32.100:8848;

        server 192.168.32.101:8848;

        server 192.168.32.103:8848;
    }
    # -----------修改-----------------    
    server {
        # -----------修改-----------------    
        listen       8089;
        # -----------修改-----------------    
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        # -----------修改-----------------    
        location ^~ /nacos{
            proxy_pass http://nacos;

            # nginx非80端口处理

            proxy_set_header        Host $host:$server_port;

            # 获取真实IP

            proxy_set_header        X-Real-IP $remote_addr;

            # 获取代理者的真实ip

            proxy_set_header       X-Forwarded-For        $proxy_add_x_forwarded_for;

            # 解决getScheme,isSecure,sendRedirect

            proxy_set_header X-Forwarded-Scheme  $scheme;

            client_max_body_size    1000m;

            client_body_buffer_size 128k;

            proxy_connect_timeout   90;

            proxy_send_timeout      90;

            proxy_read_timeout      90;

            proxy_buffer_size       4k;

            proxy_buffers           4 32k;

            proxy_busy_buffers_size 64k;

            proxy_temp_file_write_size 64k;

        }
        # -----------修改-----------------    
        #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;
    #    }
    #}

}

在一台Linux上搭建伪集群

1、由于学习配置的问题,这里只能在一台机器上搭建伪集群。

2、下载安装Nacos的Linux版安装包,解压

3、进入mysql,执行nacos自带的sql文件

4、修改配置文件,切换为我们的mysql,即 conf/application.properties,和上面一样

5、修改 conf/cluster.conf,指定哪几个节点是Nacos集群,这里使用3333/4444/5555作为三个Nacos节点监听的端口

192.168.111.144:3333
192.168.111.144:4444
192.168.111.144:5555

6、模拟三台nacos服务,编辑nacos的startup启动脚本,使他能够支持不同的端口启动多次

1597812716080

修改 startup.sh,内容如下:

1597812799242

1597813020494

1597815675706

7、nginx配置,修改nginx.conf

8、启动Nacos

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

9、启动nginx

10、测试,访问192.168.111.144:1111,如果可以进入nacos的web界面,就证明安装成功了

11、新建配置测试,在Linux服务器查看mysql是否插入一条记录

12、将微服务注册到Nacos集群

13、启动微服务,进入Nacos界面,可以看到,已经注册成功

image-20210121163939239

14、总结

image-20210121164102621

Docker搭建集群

官方教程地址:点我跳转

单服务器部署集群

1、从git上下载nacos-docker项目,本地目录为/opt/nacos-docker

# 如果linux上没有 git ,需要安装
yum -y install git

# 克隆项目,官方的github下载太慢
git clone https://github.com/nacos-group/nacos-docker.git /opt/nacos-docker

# 可以使用国内gitee的下载
git clone https://gitee.com/BetterMe1125/nacos-docker.git /opt/nacos-docker

2、安装docker-compose( docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用)

# 官方
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 这个可能快点
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m`  > /usr/local/bin/docker-compose

image-20210104145125137

3、给docker-compose授权

[root@iz2ze4lfnjztrjppyfbqo1z bin]# chmod +x /usr/local/bin/docker-compose

image-20210104145337254

4、运行nacos-docker脚本

首先对 cluster-hostname.yaml 进行修改

version: "3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:1.1.4
    environment:
      - MODE=cluster # 集群模式
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
      - MYSQL_MASTER_SERVICE_PORT=3306    # mysql数据库对应的端口
      - MYSQL_MASTER_SERVICE_DB_NAME=nacos_config 
      - MYSQL_MASTER_SERVICE_USER=root
      - MYSQL_MASTER_SERVICE_PASSWORD=123456
      - MYSQL_DATABASE_NUM=1 # 数据源为1个
      - JVM_XMS=128m
      - JVM_XMX=128m
      - JVM_XMN=128m
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9555:9555"
    restart: on-failure

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:1.1.4
    container_name: nacos2
    environment:
      - MODE=cluster # 集群模式
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
      - MYSQL_MASTER_SERVICE_PORT=3306    # mysql数据库对应的端口
      - MYSQL_MASTER_SERVICE_DB_NAME=nacos_config 
      - MYSQL_MASTER_SERVICE_USER=root
      - MYSQL_MASTER_SERVICE_PASSWORD=123456
      - MYSQL_DATABASE_NUM=1 # 数据源为1个
      - JVM_XMS=128m
      - JVM_XMX=128m
      - JVM_XMN=128m
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8849:8848"
    restart: on-failure
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:1.1.4
    container_name: nacos3
    environment:
      - MODE=cluster # 集群模式
      - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
      - MYSQL_MASTER_SERVICE_PORT=3306    # mysql数据库对应的端口
      - MYSQL_MASTER_SERVICE_DB_NAME=nacos_config 
      - MYSQL_MASTER_SERVICE_USER=root
      - MYSQL_MASTER_SERVICE_PASSWORD=123456
      - MYSQL_DATABASE_NUM=1 # 数据源为1个
      - JVM_XMS=128m
      - JVM_XMX=128m
      - JVM_XMN=128m
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8850:8848"
    restart: on-failure

如果您的服务器内存资源足够(大于4G),则可以直接运行。

否则会出现三台nacos机器疯狂重启的情况,这是我们可以选择增加内存资源或者修改nacos运行配置,修改内存大小。

JVM参数根据自己服务器调整。nacos默认就2G,不设置的话容器就会不断重启,还非常卡。找了蛮久才发现是这个原因。

部署命令:

cd /opt/nacos-docker

# 使用 example/cluster-hostname.yaml 构建集群
docker-compose -f example/cluster-hostname.yaml up

5、停止、启动

# 停止 
docker-compose -f ./example/cluster-hostname.yaml stop
# 启动 
docker-compose -f ./example/cluster-hostname.yaml start

启动成功后 我们可以访问 nacos 控制台 http://xxxx:8848/nacos/ ,默认用户名和密码都是nacos。

多台服务器通过ip部署集群

修改每个服务器中 nacos 的 cluster-ip.yaml ,每换一个服务器就把 NACOS_SERVER_IP 改一下就好了

version: "3"
services:
  nacos:
    container_name: nacos1
    image: nacos/nacos-server:1.1.4
    networks: 
      - nacos_net
    environment:
      - MODE=cluster # 集群模式
      - NACOS_SERVERS=IP1:8848 IP2:8848 IP3:8848 # IP1,IP2是对应的服务器外网,PORT1,PORT2是对应的nacos服务端口
      - NACOS_SERVER_IP=当前服务器IP # 服务器外网
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_MASTER_SERVICE_HOST=xxx.xxx.xx.xx# mysql数据库对应的ip
      - MYSQL_MASTER_SERVICE_PORT=3306    # mysql数据库对应的端口
      - MYSQL_MASTER_SERVICE_DB_NAME=nacos_config 
      - MYSQL_MASTER_SERVICE_USER=root
      - MYSQL_MASTER_SERVICE_PASSWORD=123456
      - MYSQL_DATABASE_NUM=1 # 数据源为1个
      - JVM_XMS=256m
      - JVM_XMX=256m
      - JVM_XMN=256m
    volumes:
      - ./cluster-logs/nacos:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9555:9555"
    restart: on-failure
networks:
  nacos_net:
    driver: bridge

部署命令:

docker-compose -f cluster-ip.yaml up -d

nginx配置

nginx-compose.yaml

nginx:
  restart: always
  image: nginx:1.17
  container_name: nginx
  ports:
    - nginx端口号:映射端口号
  volumes:
    - /home/nginx/nginx.conf:/etc/nginx/nginx.conf
  ulimits:
    nproc: 65535
    nofile:
      soft: 65535
      hard: 65535

nginx.conf配置文件,主要是改http中的配置

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;

    keepalive_timeout  65;
	
    

    upstream cluster{
    	# 此处三个修改成对应的ip
        server nacos1的IP:port weight=1 max_fails=2 fail_timeout=30s;
		server nacos2的IP:port weight=1 max_fails=2 fail_timeout=30s;
		server nacos3的IP:port weight=1 max_fails=2 fail_timeout=30s;
    }
 
    server{
        listen nginx端口号; # 此处修改
        server_name nginx的IP; # 此处修改
		
		large_client_header_buffers 4 16k;     # 读取大型客户端请求头的缓冲区的最大数量和大小
        client_max_body_size 300m;     #设置nginx能处理的最大请求主体大小。
        client_body_buffer_size 128k;  #请求主体的缓冲区大小。 
		
		fastcgi_connect_timeout 300;
		fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
		fastcgi_buffer_size 64k;
        fastcgi_buffers 8 32k;
        fastcgi_busy_buffers_size 128k;
		fastcgi_temp_file_write_size 64k;

	location / {
	    proxy_pass http://cluster;
	}
    }
    include /etc/nginx/conf.d/*.conf;
}

这样就可以通过 nginx的IP:port/nacos 来访问nacos集群啦。

将微服务注册到Nacos集群

spring:
  application:
    name: SYSTEM-SERVICE
  cloud:
    nacos:
      discovery:
        server-addr: # 这里写nginx的IP:port即可,由nginx转发到其中某个节点

参考文章:

https://www.freesion.com/article/9674637134/

https://blog.csdn.net/weixin_43993065/article/details/105607999

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱晶哥哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值