Nacos单机&集群&持久化&Nginx代理配置

Nacos是什么

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

本质:Nacos = Eureka+Config+Bus

可以替代原本SpringCloud中Eureka、Config、Bus组件

官方介绍

注册中心对比

image-20230220153038716

环境搭建

官网地址

环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;[下载&配置]

Nacos下载

下载地址(2023/02/20最新稳定版为2.2.0)

运行单机测试

image-20230220161647788

 sh startup.sh -m standalone

访问

http://10.20.30.227:8848/nacos

登录页面

image-20230220161759434

帐号密码默认为nacos

官方配置文档

特性一:注册中心

消费者项目

POM

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>3.0.2</version>
        </dependency>

    </dependencies>

YML

server:
  port: 8888
spring:
  application:
    name: service-consumer #注册到nacos的消费者名称
  cloud:
    nacos:
      discovery:
        server-addr: 10.20.30.227:8848

配置类

@Configuration
public class ApplicationContextBean
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

控制类

@RestController
public class CustomerController {
    public static final String URL = "http://service-provider";//生产者注册的服务名称
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/customer/getMethod")
    public String getMethod(String val){
        String result = restTemplate.getForObject(URL+"/producer/getMethod?val="+val, String.class);//生产者暴漏的路径
        return result;
    }
}

启动类

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

两个生产者项目

POM

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>3.0.2</version>
        </dependency>

    </dependencies>

YML

server:
  port: 6601 #一个生产者端口6601一个为6602
spring:
  application:
    name: service-provider #注册到nacos的生产者名称
  cloud:
    nacos:
      discovery:
        server-addr: 10.20.30.227:8848


控制类

@RestController
public class NacosProducerController {

    @GetMapping("/producer/getMethod")
    public String getMethod(String val){
        return "生产者6601"+val;
    }
}

启动类

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

验证

启动三个项目,登录Nacos页面会查到相应的服务

image-20230220171743710

并且消费者发出请求,默认负载均衡为轮询转发

特性二:配置中心

修改上面customer项目

YML

新增配置bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: 10.20.30.227:8848 #nacos配置中心
        file-extension: yaml #指定配置文件格式是yaml

POM

<!--新增坐标-->        
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

新增配置类

@RestController
@RequestMapping("/config")
@RefreshScope //@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能
public class ConfigController {

    @Value("${ip.name}")//要读取的配置
    private String ipName;

    @RequestMapping("/get")
    public String get() {
        return ipName;
    }
}

Nacos页面新增配置

  1. 访问http://10.20.30.227:8848/

  2. 配置管理->配置列表->创建配置

    image-20230220174317030

  3. 内容如下

    image-20230220174452985

  4. DataID结构解析

    service-consumer-dev.yaml

    “service-consumer” 为上面配置的spring.application.name

    "dev"为上面配置的spring.profiles.active

    附官方图:

    image-20230220174819820

  5. 每次提交配置,通过url查看,可发现配置自动更新了

配置分组

  1. nacos页面添加配置时设置Group

image-20230220175703104

  1. 修改上面项目的bootstrap.yml

    spring:
      cloud:
        nacos:
          config:
            server-addr: 10.20.30.227:8848 #nacos配置中心
            file-extension: yaml #指定配置文件格式是yaml
            group: MY_GROUP1 #设置的分组名
    
    

配置命名空间

  1. nacos页面添加配置时设置NameSpace

    image-20230220180051871

  2. nacos页面在新的命名空间下添加配置

    image-20230220180128974

  3. 修改上面项目的bootstrap.yml

    spring:
      cloud:
        nacos:
          config:
            server-addr: 10.20.30.227:8848 #nacos配置中心
            file-extension: yaml #指定配置文件格式是yaml
            group: MY_GROUP1 #设置的分组名
            namespace: 7ec90e54-85e3-4c04-b345-bf91fc26394f #设置的命名空间ID,此IP命名空间添加后自动生成或者指定
    

Nacos数据持久化

环境要求

MySQL5.6.5+

为什么要修改持久化

Nacos自带数据库为derby,如果单机使用没问题,如果集群部署,那么就涉及到数据一致性问题,所以需要将内置derby修改为外部数据库MySQL

创建数据库

数据库sql脚本在下载的Nacos包中,具体路径见下图

image-20230221155752712

修改Nacos配置

修改解压后目录/usr/local/nacos/nacos/conf/application.properties文件中如下配置

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://10.20.30.13:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=www
db.password.0=123456

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

image-20230221162021262

验证

  1. 启动Nacos

  2. 创建一个配置文件

    image-20230221162128779

  3. 去MySQL中查询,配置已经存储到外部数据库

image-20230221163223561

Nacos服务高可用(集群部署)

官方部署文档

集群架构图

image-20230221144730794

环境要求

请确保是在环境中安装使用:

  1. 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
  2. 64 bit JDK 1.8+;[下载&配置]
  3. Maven 3.2.x+;下载.配置
  4. 3个或3个以上Nacos节点才能构成集群。

集群搭建前准备

  1. 预计搭建后架构样子

    1个Nginx+3个Nacos注册中心

  2. 定义端口号

    正常是多台物理机,用虚拟机就一台虚拟三个Nacos服务

    8848、8748、8648

复制解压出的nacos文件夹到下面三个目录中

重命名为Nacos8848\Nacos8748\Nacos8748,表示我要启动三个Nacos做集群

(就是上面单机版解压缩后的文件夹)

修改每个文件夹中Nacos配置文件

  1. 将/usr/local/nacos/conf/cluster.conf.example复制一份,起名为cluster.conf

  2. 修改cluster.conf,配置内容如下(三个都)

    注意:我是本机搭建三台Nacos模拟集群,所以此处端口号不可设置为8848\8847\8846等连号,因为Nacos集群使用grpc来通信,启动会默认占用三个端口,例如:8848启动后会默认启动8848、9848、9849

    10.20.30.227:8848
    10.20.30.227:8748
    10.20.30.227:8648
    

    注意:配置ip必须是通过hostname -i可查到的

image-20230221164604400

  1. 修改application.properties

    注意:server.port要更改,并且要和第二步cluster.conf配置中的一致

    ### Default web server port:
    server.port=8848
    
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://10.20.30.13:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=www
    db.password.0=123456
    

Nacos以集群模式启动

sh startup.sh

下图为官方文档说明

image-20230221165321303

验证集群验证结果

  1. 打开Nacos页面

  2. 查看集群管理->节点列表

    image-20230222113114006

Nginx代理Nacos集群

Nginx配置文件

    #此处配置上面集群Nacos地址
    upstream nacos_cluster{
        server 10.20.30.227:8848;
        server 10.20.30.227:8748;
        server 10.20.30.227:8648;
    }

    server {
        listen       9999;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
	       proxy_set_header Host $http_host;
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://nacos_cluster;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

访问Nginx验证代理结果

http://10.20.30.227:9999/nacos

将服务通过Nginx代理注册进Nacos

修改项目Yml文件,如下:

server:
  port: 8888
spring:
  profiles:
    active: dev #读取dev的配置
  application:
    name: service-consumer #注册到nacos的消费者名称
  cloud:
    nacos:
      discovery:
        server-addr: 10.20.30.227:9999 #修改为Nginx代理地址
posted @ 2023-02-22 17:20  RollBack2010  阅读(571)  评论(0编辑  收藏  举报