Nacos

Nacos

1. 概述

nacos 是 alibaba开源的一个注册中心和配置中心

是分布式微服务的组件之一

2. 安装

2.1 下载

  • 官网地址
  • 选择版本:1.4.1
  • 解压到 linux服务器 tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local

2.2 启动

切换到nacos安装目录 cd /usr/local/nacos/bin

  • 单机启动

    • ./startup.sh -m standalone
      
  • 集群启动

    • ./startup.sh
      
  • 登录

    • 用户名:nacos
    • 密码:nacos
  • 关闭

    • ./shutdown.sh
      

3. 工程环境搭建

3.1 父工程

nacos-parent

pom.xml 管理依赖版本

<?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">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.moyu</groupId>
	<artifactId>cloud-parent</artifactId>
	<packaging>pom</packaging>
	<version>1.0-SNAPSHOT</version>
	<modules>
		<module>common</module>
		<module>nacos-provide</module>
	</modules>
	
	<dependencyManagement>
		<dependencies>
			<!--Spring Boot-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.3.2.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--spring cloud Netflix-->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Hoxton.SR9</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<!--spring cloud 阿里巴巴-->
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>2.2.6.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>


</project>

3.2 公共模块

common

实体类 User

package com.moyu.pojo;

public class User {

    private Integer id;

    private String name;

    private Integer age;

    public User() {
    }

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

4. 注册中心

4.1 作用

提供服务的注册(存放注册的服务的 ip 和 port)与发现

4.2 使用

  1. 创建服务提供者:nacos_porvider

    • pom.xml 引入依赖

      • <dependencies>
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-web</artifactId>
        		</dependency>
        		<dependency>
        			<groupId>com.alibaba.cloud</groupId>
        			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        		</dependency>
        		<dependency>
        			<groupId>com.moyu</groupId>
        			<artifactId>common</artifactId>
        			<version>1.0-SNAPSHOT</version>
        		</dependency>
        	</dependencies>
        
    • application.yml

      • server:
              port: 8081
        spring:
              application:
                    name: nacos-provide
              cloud:
                    nacos:
                          discovery:
                                server-addr: 192.168.40.132:8849
        
    • NacosProvideApp

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

      • @RestController
        @RequestMapping("/user")
        public class UserController {
        
            @Autowired
            private UserService userService;
        
            @GetMapping("/getUserById/{id}")
            public User getUserById(@PathVariable("id") Integer id) {
                return userService.getUserById(id);
            }
        }
        
  2. 创建服务消费者:nacos_consumer

    • pom.xml 引入依赖

      • <dependencies>
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-web</artifactId>
        		</dependency>
        		<dependency>
        			<groupId>com.alibaba.cloud</groupId>
        			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        		</dependency>
        		<dependency>
        			<groupId>com.moyu</groupId>
        			<artifactId>common</artifactId>
        			<version>1.0-SNAPSHOT</version>
        		</dependency>
        	</dependencies>
        
    • application.yml,注册服务

      • server:
              port: 80
        spring:
              application:
                    name: nacos-consumer
              cloud:
                    nacos:
                          discovery:
                                server-addr: 192.168.40.132:8849
        
    • NacosProvideApp,开启服务发现

      • @SpringBootApplication
        @EnableDiscoveryClient
        public class NacosProvideApp {
            public static void main(String[] args) {
                SpringApplication.run(NacosProvideApp.class, args);
            }
        }
        
    • BeanConfig,注入RestTemplate类

      • @Configuration
        public class BeanConfig {
            @Bean
            public RestTemplate restTemplate(){
                return new RestTemplate();
            }
        }
        
    • UserController,服务调用处理

      • @RestController
        @RequestMapping("/user")
        public class UserController {
        
            @Resource
            private RestTemplate restTemplate;
            @Resource
            private DiscoveryClient discoveryClient;
        
            @GetMapping("/getUserById/{id}")
            public User getUserById(@PathVariable("id") Integer id) {
                ServiceInstance service = discoveryClient.getInstances("nacos-provide").get(0);
                String url = "http://"+service.getHost()+":"+service.getPort()+"/user/getUserById/"+id;
                return restTemplate.getForObject(url, User.class);
            }
        
        }
        

5. 配置中心

5.1 作用

  • 项目所有配置集中存放统一管理
  • 配置中心文件更新时,对应服务同步获取新的配置内容

5.2 实时更新原理

当配置中心配置发生改变,则其对应的md5也会变化,则nacos向使用此配置文件的客户端发送更新消息,服务端收到消息则重新拉取配置文件

5.2 使用

  1. 新建工程

    • nacos-config

    • pom.xml,引入依赖

      • <dependencies>
        		<dependency>
        			<groupId>org.springframework.boot</groupId>
        			<artifactId>spring-boot-starter-web</artifactId>
        		</dependency>
        		<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>
        	</dependencies>
        
    • ConfigController,获取配置信息

      • @RestController
        @RequestMapping("/config")
        @RefreshScope //配置文件实时更新
        public class ConfigController {
            
            @Value("${spring.datasource.driver-class-name}")
            private String driverClassName;
        
            @Value("${spring.datasource.url}")
            private String url;
        
            @Value("${spring.datasource.username}")
            private String username;
        
            @Value("${spring.datasource.password}")
            private String password;
        
            @GetMapping("/getDBConfig")
            public String getDBConfig(){
                return driverClassName+"<br>"+url+"<br>"+username+"<br>"
                        +password+"<br>";
            }
        }
        
    • bootstrap.yml,配置文件,只需配置这一个配置文件即可,比application.yml 优先级更高,更先加载

      • spring:
        	cloud:
            	nacos:
                	discovery:
                    	server-addr: 192.168.40.132:8849
                    config:
                    	server-addr: 192.168.40.132:8849
                        prefix: nacos-config #配置文件的前缀,默认是spring.application.name
                        file-extension: yaml #配置文件的后缀,默认是properties
        #Data ID的语法:${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}
        
        
  2. 在nacos中新建配置文件

    • 配置列表 -> + -> 编辑配置文件 -> 发布

    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aECB6TU1-1665305934214)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009163750015.png)]

    • server:
          port: 8082
      spring:
          application:
              name: nacos-config
          nacos:
              discovery:
                  server-addr: 192.168.40.132:8849
          datasource:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
              username: root
              password: 123
      
  3. 测试

    1. 访问链接:localhost:8082/config/getDBConfig

      - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ka6yo1Au-1665305934215)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009164349952.png)]

    2. 修改配置文件:

      • spring:
        	username: user
            password: 555
        
    3. 再次访问链接:localhost:8082/config/getDBConfig

      - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9A7YXgf-1665305934216)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221009164456111.png)]

      • 可见配置已动态改变

5.3 配置隔离

5.3.1 概述

通过Namespace、group,DataId 可准确定位到某一配置

  • Namespace:环境级隔离,不同环境不同 Namespace,如public, dev, test…
  • Group:项目级隔离,更细粒度的隔离
  • DataId:工程级隔离,定位到某一配置文件

要准确定位到某一配置文件集需要指定:nacos服务地址,namespace(默认public),group(默认DEFAULT_GROUP),dataId

5.3.2 使用

  1. 新建命名空间 test, dev

    • - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cT6myflN-1665398274784)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143049866.png)]

    • 同理创建dev

  2. 切换到test空间

    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TyJB0skz-1665398274785)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143223670.png)]

  3. 新建配置文件,设置Data Id 为TestConfig,Group为TestGroup1

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mhWTWFiS-1665398274785)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143347822.png)]

    • server:
          port: 8082
      spring:
          application:
              name: nacos-config
      Namespace: test
      Group: TestGroup1
      DataId: TestConfig
      
  4. 克隆TestConfig

    • 到test.TestGroup2.TestConfig

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jF9z2sR7-1665398274786)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010143741405.png)]

      • 编辑TestGoup2中的TestConfig,修改Group为TestGroup2

    • 到dev.DevGroup.DevConfig

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pk7EgoHn-1665398274787)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010150053005.png)]

      • 编辑DevConfig

      • server:
            port: 8082
        spring:
            application:
                name: nacos-config
        Namespace: dev
        Group: DevGroup
        DataId: DevConfig
        
  5. 修改ConfigController

    • @RestController
      @RequestMapping("/config")
      @RefreshScope
      public class ConfigController {
      
          @Value("${Namespace}")
          private String namespace;
      
          @Value("${Group}")
          private String group;
      
          @Value("${DataId}")
          private String dataId;
      
          @GetMapping("/getConfig")
          public String getConfig() {
              return "Namespace: " + namespace + "<br>" + "<br>"
                      + "Group: " + group + "<br>"
                      + "Data Id: " + dataId + "<br>";
          }
      
      }
      
  6. 测试test.TestGroup1.TestConfig

    • 修改bootstrap.yml

      • spring:
        	cloud:
            	nacos:
            		discovery:
            			server-addr: 192.168.40.132:8849
                	config:
                        server-addr: 192.168.40.132:8849
                        namespace: test
                        group: TestGroup1
                        prefix: TestConfig #配置文件的前缀,默认是spring.application.name
                        file-extension: yaml #配置文件的后缀,默认是properties
        
    • 启动项目并访问链接:localhost:8082/config/getConfig

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8G8ckpg1-1665398274788)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010145448971.png)]
  7. 测试dev.DevGroup.DevConfig

    • 修改bootstrap.yml

      • spring:
        	cloud:
            	nacos:
            		discovery:
            			server-addr: 192.168.40.132:8849
                	config:
                        server-addr: 192.168.40.132:8849
                        namespace: dev
                        group: DevGroup
                        prefix: DevConfig #配置文件的前缀,默认是spring.application.name
                        file-extension: yaml #配置文件的后缀,默认是properties
        
    • 启动项目并访问链接:localhost:8082/config/getConfig

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzQg6KMG-1665398274789)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010150831881.png)]

6. 集群搭建

6.1 持久化

搭建集群需要统一数据库来统一数据

6.1.1 修改配置来切换数据库

修改 application.properties 文件

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

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

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

6.1.2 新建nacos数据库

新建nacos数据库并使用 nacos/config/nacos-mysql.sql 文件导入sql

6.2 创建nacos集群文件

  1. 进入nacos/config/,复制并修改cluster.conf文件

    • cp ./cluster.conf.example ./cluster.conf
      
    • 192.168.40.132:8848
      192.168.40.132:8849
      192.168.40.132:8850
      
  2. 复制三份nacos

    • cd /usr/local
      mkdir nacos-cluster
      cp -r nacos ./nacos-cluster/nacos-8848
      cp -r nacos ./nacos-cluster/nacos-8849
      cp -r nacos ./nacos-cluster/nacos-8850
      
  3. 分别修改nacos-8849和nacos-8850端口

    • vi /usr/local/nacos-cluster/nacos-8849/conf/application.properties
      vi /usr/local/nacos-cluster/nacos-8850/conf/application.properties
      
    • server.port=8849
      server.port=8850
      
  4. 分别启动数据库和三台nacos并访问

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rLJXaqP-1665398274792)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010162507834.png)]
  5. 新建命名空间dev,并创建组DevGroup,配置文件DevConfig,内容同上,则数据库出现数据

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StMmIcQb-1665398274795)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010175916633.png)]

6.3 nginx代理

6.3.1 安装nginx
  1. 安装nginx依赖库

    • yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
      
  2. 下载jar包

    • wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
      
  3. 解压

    • tar -zxvf nginx-1.12.0.tar.gz
      
  4. 配置nginx安装包

    • cd nginx-1.12.0
      
      ./configure --prefix=/usr/local/nginx
      
  5. 编译并安装

    • make && make install
      
6.3.2 修改配置文件

vi /usr/local/nginx/config/nginx.config

upstream nacos {
  server 192.168.40.132:8848;
  server 192.168.40.132:8849;
  server 192.168.40.132:8850;
}

server {
  listen 80;
  server_name  localhost;
  location / {
    proxy_pass http://nacos;
  }
}
6.3.3 启动
  • 启动nacos集群

    • /usr/local/nacos-cluster/nacos-8848/bin/startup.sh
      /usr/local/nacos-cluster/nacos-8849/bin/startup.sh
      /usr/local/nacos-cluster/nacos-8850/bin/startup.sh
      
  • 启动nginx代理

    • /usr/local/nginx/sbin/nginx
      
  • 修改bootstrap.yml并启动程序

    • spring:
      	cloud:
          	nacos:
          		discovery:
          			server-addr: 192.168.40.132
              	config:
                      server-addr: 192.168.40.132
                      namespace: dev
                      group: DevGroup
                      prefix: DevConfig #配置文件的前缀,默认是spring.application.name
                      file-extension: yaml #配置文件的后缀,默认是properties
      
  • 访问:localhost:8082/config/getConfig

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhbTlS4m-1665398274797)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221010175538249.png)]

7. Nacos开机自启动(单机版)

7.1 新建开机自启文件

  1. 新建 nacos.service 文件
vim /lib/systemd/system/nacos.service
  1. 编辑内容

此处nacos的安装目录为/usr/local/nacos,若不同请更改

[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

复制粘贴后,注意检查开头结尾是否缺少字母,补全

  1. 重新加载service
systemctl daemon-reload        #重新加载服务配置

7.2 修改nacos的startup.sh

vim /usr/local/nacos/bin/startup.sh

修改第一行为本地jdk安装路径,注释后三行

此处jdk安装路径为 /usr/local/jdk1.8.0_191,若不同请更改

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191 
#[ ! -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

7.3 设置开启自启

设置开机自启

systemctl enable nacos.service #设置为开机启动

其他命令

systemctl start nacos.service  #启动nacos服务
systemctl stop nacos.service   #停止nacos服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值