风在路上 风在路上
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • golang基础

    • golang基础
  • golang框架

    • gin
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)

风

摸鱼
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • golang基础

    • golang基础
  • golang框架

    • gin
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)
  • mybatis

  • mybatis-plus

  • Spring

  • SpringMvc

  • RabbitMQ

  • Dubbo

  • SpringCloud

    • SpringCloud知识体系
    • Eureka
    • ZookeeperAndConsul
    • Ribbn
    • OpenFeign
    • Hystrix
    • Gateway
    • Config
    • Bus
    • Stream
    • Sleuth
    • Nacos
      • Nacos简介
        • 为什么叫Nacos
        • 是什么
        • 能干嘛
      • 安装并运行Nacos
      • Nacos作为服务注册中心演示
        • 服务提供者
        • pom
        • yaml
        • 主启动类
        • Controller
        • 服务消费者
        • pom
        • yaml
        • 业务类
        • 测试
        • 注册中心对比
        • AP、CP切换
      • Nacos作为服务配置中心演示
        • 基础配置
        • pom
        • yaml
        • 主启动类
        • Controller
        • 在Nacos中添加配置信息
        • Nacos中的匹配规则
        • 在nacos进行添加配置
        • 测试
        • 分类配置
        • 为什么这样设计?
        • 三种方案加载配置
        • DataId方案
        • Group方案
        • Namespace方案
      • Nacos集群和持久化配置(重要)
        • 将单体Nacos数据库迁移到MySQL
        • Linux版Nacos+MySQL生产环境配置
        • Linux安装步骤
        • 集群配置步骤(重点)
        • MySQL
        • cluster.conf
        • startup.sh脚本
        • nginx配置
        • 测试
        • 测试注册功能
        • 总结
    • Sentinel
    • Seata
  • 框架
  • SpringCloud
zdk
2022-11-15
目录

Nacos

Table of Contents generated with DocToc (opens new window)

  • Nacos
    • Nacos简介
      • 为什么叫Nacos
      • 是什么
      • 能干嘛
    • 安装并运行Nacos
    • Nacos作为服务注册中心演示
      • 服务提供者
        • pom
        • yaml
        • 主启动类
        • Controller
      • 服务消费者
        • pom
        • yaml
        • 业务类
      • 测试
      • 注册中心对比
      • AP、CP切换
    • Nacos作为服务配置中心演示
      • 基础配置
        • pom
        • yaml
        • 主启动类
        • Controller
        • 在Nacos中添加配置信息
          • Nacos中的匹配规则
          • 在nacos进行添加配置
          • 测试
      • 分类配置
        • 为什么这样设计?
        • 三种方案加载配置
          • DataId方案
          • Group方案
          • Namespace方案
    • Nacos集群和持久化配置(重要)
      • 将单体Nacos数据库迁移到MySQL
      • Linux版Nacos+MySQL生产环境配置
        • Linux安装步骤
        • 集群配置步骤(重点)
          • MySQL
          • cluster.conf
          • startup.sh脚本
          • nginx配置
        • 测试
          • 测试注册功能
          • 总结

# Nacos

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11

首先需要引入spring-cloud-alibaba-dependencies依赖管理

Nacos 服务注册与配置中心

# Nacos简介

# 为什么叫Nacos

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

# 是什么

  • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
  • Nacos:Dynamic Naming and Configuration Service,即注册中心与配置中心的组合

# 能干嘛

  • 替代Eureka作为注册中心
  • 替代Config作为配置中心

image-20221115171832488

# 安装并运行Nacos

  • 从GitHub下载nacos-server-2.1.2.zip,(.tar.gz是Linux的)
  • 压解安装包,直接运行bin目录下的startup.cmd
  • 命令运行成功后直接访问:http://localhost:8848/nacos

这里要注意,运行时需要增加命令参数-m standalone,否则运行失败

startup.cmd -m standalone # 单机模式启动 因为默认是集群模式
1

image-20221115173526865

# Nacos作为服务注册中心演示

# 服务提供者

新建cloudalibaba-provider-payment9001模块

# pom

前面的父pom中要加cloud alibaba的父依赖,这里子pom相较以前,删除eureka的依赖,增加nacos的依赖

<dependencies>
        <!--        通用的依赖-->
        <dependency>
            <groupId>com.zdk</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>

        <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>
        <!-- nacos依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# yaml

yaml主要就是配置nacos注册中心地址和actuator监控管理

server:
  port: 9001
  
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
          
management:
  endpoints:
    web:
      exposure:
        include: '*'         
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001{
    public static void main(String[] args){
        SpringApplication.run(PaymentMain9001.class,args);
    }
}
1
2
3
4
5
6
7

# Controller

@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos registry, serverPort:"+serverPort+"\t id:"+id;
    }
}
1
2
3
4
5
6
7
8
9
10
11

最后启动此9001服务,可以在nacos控制台中查看到服务注册情况

image-20221115175037508

最后,为了演示后面的nacos负载均衡功能,参照9001再建一个9002模块,步骤不再赘述,启动后可以发现nacos控制台nacos-payment-provider服务实例数量已变为2

image-20221115175848839

# 服务消费者

新建消费者模块cloudalibaba-consumer-nacos-order83

# pom

将provider的pom复制过来,新增spring-cloud-starter-loadbanlacer的依赖

这里要注意,我是用的2021.0.4.0版本cloud alibaba的nacos-discovery包中,已经去除掉了loadbanlacer的依赖,所以不能再直接进行rest+服务名的调用,且不支持了负载均衡,所以这里要测试的话还需要再将loadbanlacer的包进行引入,并且记得注入RestTemplate时加上@LoadBalanced注解

<!-- nacos依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- loadbalancer依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10

# yaml

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 用来在代码中获取provider服务地址
service-url:
  nacos-user-service: http://nacos-payment-provider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

主启动类不多赘述

因为这里使用到了ribbon,所以需要注入一个RestTemplate的Bean

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //必须加这个注解 才能使用服务名走注册中心进行rest调用
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }   
}
1
2
3
4
5
6
7
8

# 业务类

@RestController
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

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


    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id){
        return restTemplate.getForObject(serviceUrl+"/payemnt/nacos/"+id, String.class);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

最后启动此消费者,nacos控制台出现它的信息即可

image-20221115183213390

# 测试

三个服务均启动好,访问http://localhost:83/consumer/payment/nacos/1

我们可以发现对于两个provider,是轮询访问

这里其实就是引入一个负载均衡来测试注册中心,2021.1版本的nacos本身已不带有负载均衡

# 注册中心对比

nacos支持CP、AP模型的切换

image-20221115185730171

nacos与其他注册中心特性对比

Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP、AP均可 AP CP / CP
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
Spring Cloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8S集成 支持 不支持 支持 支持 不支持

# AP、CP切换

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

何时选择使用何种模式?

一般来说,


如果不需要存储服务级别的信息且服务实例是通过racos-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'
1

# Nacos作为服务配置中心演示

# 基础配置

新建cloudalibaba-config-nacos-client3377模块

# pom

依赖相较于前面的服务注册模块,除了保留discovery外,还要新增一个config依赖

<!-- nacos config依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1
2
3
4
5

# yaml

这里需要两个配置文件,一个是原来的application.yaml,另一个是bootstrap.yaml。

Nacos同SpringCloud-Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。 SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

application.yaml

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

bootstrap.yaml

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml # 指定在configServer上找yaml格式的文件

# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377{
    public static void main(String[] args){
        SpringApplication.run(NacosConfigClientMain3377.class,args);
    }
}
1
2
3
4
5
6
7

# Controller

@RestController
@RefreshScope //支持nacos的动态刷新
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping(value = "/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 在Nacos中添加配置信息

# Nacos中的匹配规则
  • Nacos中的DataId的组成格式以及与SpringBoot配置文件中的匹配规则

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

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

#{prefix}-${spring.profile.active}.${file-extension}
1
  • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置
  • spring.profile.active即为当前环境对应的profile,详情参考Spring Boot文档。注意,当spring.profile.active为空时,对应的连接符-也将不存在,dataId的拼接格式变为#{prefix}.${file-extension}
  • file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持properties和yaml类型
  • 通过Spring Cloud原生注解@RrefreshScope实现配置自动更新

所以最后的公式:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
1
# 在nacos进行添加配置

image-20221116170241590

image-20221116170335913

# 测试

添加配置后,启动3377项目会发现启动报错,这篇文章指出了原因:

https://blog.csdn.net/wyz0923/article/details/118303072,即cloud2020版本后,已不会再自动先加载bootstrap.yaml文件了,所以我们需要和在Spring Cloud Config中一样,手动添加上bootstrap的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
1
2
3
4

调用接口获取配置文件测试正常

image-20221116172040578

在nacos控制台进行配置修改,然后再次获取,发现已立刻刷新

image-20221116172254186

# 分类配置

为了解决大型微服务项目中存在多个子项目,且每个子项目又有开发、测试、预发布、正式环境等环境,所需要的配置文件难以管理的问题,Nacos的配置中心采用Namespace+Group+DataId的设计

# 为什么这样设计?

此设计类似于java中的概念,即package名和类名

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

三者情况:

image-20221116173241902

默认情况下:

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),还可以尽量让同一个机房的微服务互相调用,以提升性能。


最后是Instance,就是微服务的实例。

# 三种方案加载配置

# DataId方案
  • 指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
  • 默认空间+默认分组+新建dev和test啷个DataID
  • 通过spring.profile.active设为dev或test实现多环境下配置文件的读取

由于先前已经新增了dev的配置文件,现在新增一个test即可

image-20221116174327799

修改spring.profiles.active为test,访问配置测试接口:成功获取到

image-20221116174712161

# Group方案

新建两个配置,配置的DataId都是nacos-config-client-info.yaml,但是Group不相同,一个是DEV_GROUP,一个是TEST_GROUP,内容为:config:info:nacos-config-client-info.yaml,TEST(DEV)_GROUP

image-20221116175458797

然后是对bootstrap.yaml进行配置,在spring.cloud.nacos.config下增加group属性,值即为新建的配置的group,然后application.yaml的spring.profiles.active改为info

image-20221116175631203

在不同group下进行进行测试:

image-20221116175953637

# Namespace方案

首先,新建命名空间

image-20221116180812294

低版本的nacos中,命名空间id是不能自定义的,目前我使用的版本是可以自定义的,但我们还是先用它的自动生成即可

创建完命名空间后,回到配置列表,可以发现,可以选择我们刚才创建命名空间了

image-20221116180953484

切换以后会发现没有配置

image-20221116181013663

这个时候就可以创建配置了,在哪个空间下创建配置,这个配置就是属于这个命名空间的,与其他命名空间是隔离的,这里我们两个环境都创建一个配置

image-20221116181351892

如何使其能够被访问到也和group的配置差不多:

对bootstrap.yaml进行配置,在spring.cloud.nacos.config下增加namespace属性,值为上面的命名空间ID,这样再结合上面的group配置、spring.profiles.active配置,即可访问配置文件,就不再进行测试了

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

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

# 将单体Nacos数据库迁移到MySQL

步骤:

  1. 首先先在MySQL中创建名为nacos_config的数据库

  2. 然后导入nacos/conf/mysql-schema.sql文件

  3. 然后找到application.properties文件,在最后增加以下内容

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos_config?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    db.user.0=root
    db.password.0=root
    
    1
    2
    3
    4
    5
  4. 然后重新运行nacos,可以发现我们之前新建的配置全部消失了,说明切换成功

可以进行测试,现在新增一条配置,看看MySQL中的数据情况

image-20221118145643954

# Linux版Nacos+MySQL生产环境配置

预计需要:一个nginx+3个nacos注册中心(因为要3个或以上nacos节点才能构成集群)+1一个MySQL

Linux版nacos server的包(tar.gz后缀)的下载赘述,下面直接到集群配置步骤

# Linux安装步骤

  • 首先将安装包上传到Linux服务器,我这里是/usr/local/software/nacos/applicaion,目录

  • 运行命令解压

    tar -zxvf nacos-server-2.1.2.tar.gz
    
    1

image-20221118150537412

同级目录下就会出现一个名为nacos的文件夹,里面的内容和我们在win里面测试时的一样

# 集群配置步骤(重点)

# MySQL

首先是MySQL的准备,由于我虚拟机上的MySQL还是5.1的版本,这里就直接使用本机上的MySQL,步骤和上面一样,改一下application.properties

spring.datasource.platform=mysql
db.num=1
# 这里注意ip改一下就行
db.url.0=jdbc:mysql://192.168.0.110:3306/nacos_config?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
db.user.0=root
db.password.0=root
1
2
3
4
5
6

这里启动nacos还遇到问题,即No Datasource set,原因是我这里是虚拟机连接本机的MySQL,而本机MySQL没有设置远程连接的权限,所以需要设置一下,设置好以后重新连接一下即可

# 以下命令适用于MySQL8.0+
USE mysql;  #一定要使用mysql表,因为授权只能在这个表里授权。
select host,user from user; #查看当前用户的权限表
update user set host='%' where user='root'; #修改权限
flush privileges; # 刷新权限

# 如果是8.0以下,使用以下语句
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

All : 表示所有操作,比如select,update,insert等操作
*.* :表示所有库的所有表(test.*则表示test库的所有表)。
root :表示授权的用户名。
% :表示可以从任意地方登录,如改成192.168.0.999,则表示只能从ip地址为192.168.0.999的机器登录
123456 :表示授权的用户名的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# cluster.conf

这里要增加nacos的集群配置文件 cluster.conf

image-20221118154341456

可以看到conf文件夹里有一个cluster.conf.example文件,我们将它copy一份,名为cluster.conf

cp cluster.conf.example cluster.conf
1

编辑cluster.conf的内容:

192.168.0.112:3333
192.168.0.112:4444
192.168.0.112:5555
# ip是虚拟机的ip  后面的是nacos实例的端口
1
2
3
4

注意:这个ip不能是127.0.0.1,必须是Linux命令hostname -I能够识别的ip,执行这个命令后出现的第一个ip即是要填的ip

到这里cluster.conf已完成

# startup.sh脚本

这一步需要编辑nacos的启动脚本startup.sh,使它能够接受不同的启动端口

集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。 命令: bash startup.sh -p 3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。

在这里插入图片描述

在这里插入图片描述

#!/bin/bash

# Copyright 1999-2018 Alibaba Group Holding Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME

if [ -z "$JAVA_HOME" ]; then
  if $darwin; then

    if [ -x '/usr/libexec/java_home' ] ; then
      export JAVA_HOME=`/usr/libexec/java_home`

    elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
      export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
    fi
  else
    JAVA_PATH=`dirname $(readlink -f $(which javac))`
    if [ "x$JAVA_PATH" != "x" ]; then
      export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
    fi
  fi
  if [ -z "$JAVA_HOME" ]; then
        error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
  fi
fi

export SERVER="nacos-server"
export MODE="cluster"
export FUNCTION_MODE="all"
export MEMBER_LIST=""
export EMBEDDED_STORAGE=""
while getopts ":m:f:s:c:p:o:" opt
do
    case $opt in
        m)
            MODE=$OPTARG;;
        f)
            FUNCTION_MODE=$OPTARG;;
        s)
            SERVER=$OPTARG;;
        c)
            MEMBER_LIST=$OPTARG;;
        p)
            EMBEDDED_STORAGE=$OPTARG;;
        o)  
			PORT=$OPTARG;;
		?)
        echo "Unknown parameter"
        exit 1;;
    esac
done

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=`cd $(dirname $0)/..; pwd`
export CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/conf/

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
    if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
        JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
    fi
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

fi

if [[ "${FUNCTION_MODE}" == "config" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
elif [[ "${FUNCTION_MODE}" == "naming" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
fi

JAVA_OPT="${JAVA_OPT} -Dnacos.member.list=${MEMBER_LIST}"

JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
  JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
else
  JAVA_OPT_EXT_FIX="-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext"
  JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi

JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins,${BASE_DIR}/plugins/health,${BASE_DIR}/plugins/cmdb,${BASE_DIR}/plugins/selector"
JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}"
JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml"
JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"

if [ ! -d "${BASE_DIR}/logs" ]; then
  mkdir ${BASE_DIR}/logs
fi

echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}"

if [[ "${MODE}" == "standalone" ]]; then
    echo "nacos is starting with standalone"
else
    echo "nacos is starting with cluster"
fi

# check the start.out log output file
if [ ! -f "${BASE_DIR}/logs/start.out" ]; then
  touch "${BASE_DIR}/logs/start.out"
fi
# start
echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &

if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
  nohup "$JAVA" -Dserver.port=${PORT}  ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
else
  nohup "$JAVA" -Dserver.port=${PORT}  "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
fi

echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150

这里经过尝试 无论怎么都只能启动一个端口的实例,所以这里直接再拷贝两个nacos,分别启动startup.sh来启动集群

image-20221118165325245

这是startcluster.sh

#!/bin/bash

bash /usr/local/software/nacos/application/nacos/bin/startup.sh -o 3333
bash /usr/local/software/nacos/application/nacos4444/bin/startup.sh -o 4444
bash /usr/local/software/nacos/application/nacos5555/bin/startup.sh -o 5555
1
2
3
4
5

这里还是需要将startup.sh修改为能够指定端口启动后,再copy出来

这是shutdowncluster.sh

#!/bin/bash

bash /usr/local/software/nacos/application/nacos/bin/shutdown.sh
bash /usr/local/software/nacos/application/nacos4444/bin/shutdown.sh
bash /usr/local/software/nacos/application/nacos5555/bin/shutdown.sh
1
2
3
4
5

执行startcluster.sh后,进入任意一个节点的console可以看到集群节点情况

也可以使用ps -ef|grep nacos|grep -v grep | wc -l命令获取nacos的数量来查看

image-20221118170934651

# nginx配置

编辑nginx的配置,由它作为负载均衡器

  • 下载nginx

  • 压解tar -zxvf xxx.tar.gzr

  • 安装gcc环境yum install gcc-c++

  • 安装pcre pcre-devel yum install pcre pcre-devel

  • 安装zlib yum install zlib zlib-devel

  • 安装openssl yum install -y openssl openssl-devel

  • 使用默认配置,在nginx根目录下执行3个命令

    ./configure
    make
    make install
    
    1
    2
    3
  • 查找nginx安装目录 whereis nginx- /usr/local/nginx

    image-20221118174540927

现在来修改nginx配置文件:

image-20221118174940321

	upstream cluster{
        server 127.0.0.1:3333;
        server 127.0.0.1:4444;
        server 127.0.0.1:5555;
    }

    server {
        listen       1111;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://cluster;
        }

        #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;
        #}
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

主要是添加upstream,其中包含三个nacos实例的ip:端口;

然后是修改server监听的端口为1111,且修改location

location / { proxy_pass http://cluster; }

最后启动nginx:

  • 进入/usr/local/nginx/sbin目录,运行命令./nginx -c /usr/local/nginx/conf/nginx.conf

# 测试

到这里,3个nacos实例和nginx均已启动,我们通过nginx(1111端口)来访问nacos进行测试

访问:http://192.168.0.112:1111/nacos,发现是可以进入到的

image-20221118175837414

然后新增一个配置进行测试

image-20221118180158243

# 测试注册功能

将9002payment服务注册进nacos集群进行测试:server-addr: 192.168.0.112:1111 # nginx暴露

启动9002,查看控制台

image-20221118180610732

# 总结

image-20221118180701779

在 GitHub 上编辑此页 (opens new window)
#Nacos#SpringCloud Alibaba
最后更新: 2022/11/18, 18:11:00
Sleuth
Sentinel

← Sleuth Sentinel→

Theme by Vdoing | Copyright © 2022-2025 zdk | notes
湘ICP备2022001117号-1
川公网安备 51142102511562号
本网站由 提供CDN加速/云存储服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式