一、Nacos的概述

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,是阿里巴巴的新开源项目 。

Nacos主要提供三种功能:服务注册与发现、动态配置服务、动态DNS服务。

二、Nacos的安装和启动

1.下载

Nacos下载地址:Tags · alibaba/nacos · GitHub

2.安装

将下载好的Nacos安装包上传到到linux服务上,使用xshell进行安装包上传。

[root@localhost ~]# rz                                                     #上传命令
[root@localhost ~]# mv  nacos-server-1.4.1.tar.gz   /usr/local             #移动安装包

[root@localhost local]# tar -zxvf nacos-server-1.4.1.tar.gz                #解压安装包

[root@localhost local]# rm -rf nacos-server-1.4.1.tar.gz                   #删除安装包

3.启动

[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone            #非集群模式启动

[root@localhost bin]# ./startup.sh -m standalone
/usr/local/jdk1.8.0_191/bin/java  -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/usr/local/jdk1.8.0_191/jre/lib/ext:/usr/local/jdk1.8.0_191/lib/ext -Xloggc:/usr/local/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /usr/local/nacos/logs/start.out

4.测试

浏览器访问:http://192.168.238.132:8848/nacos,默认用户名/密码为: nacos/nacos

注意:此网址为自己安装nacos虚拟机的ip地址;

          如果Linux开启了防火墙的话需要把8848端口给放行,这样才能通过外网访问该端口。

//开放防火墙
systemctl start firewalld

//关闭防火墙 
systemctl stop firewalld

//开放nacos端口
//命令含义:
// --zone #作用域
// --add-port=8848/tcp  #添加端口,格式为:端口/通讯协议
// --permanent  #永久生效,没有此参数重启后失效
firewall-cmd --zone=public --add-port=8848/tcp --permanent

# 重启防火墙
firewall-cmd --reload

# 查看防火墙启动端口情况
firewall-cmd --list-all
# 如果显示了该8848端口则为启动成功。

 

5.关闭

[root@localhost bin]# ./shutdown.sh
The nacosServer(8166) is running...
Send shutdown request to nacosServer(8166) OK

三、Nacos注册中心入门

1.什么是Nacos注册中心

注册中心主要有三部分组成:

         Nacos-Server:注册中心

                提供服务的注册和发现。

         Nacos-Provider:服务提供方

                把自身的服务实例注册到 Nacos Server 中

         Nacos-Consumer:服务调用方

                通过 Nacos Server 获取服务列表,消费服务。

2.代码案例

案例结构:

父工程pom.xml

        <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>

springcloud_common模块

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

    <artifactId>springcloud_common</artifactId>

</project>

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;
    }
}

nacos_provider模块

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wrs</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 9090

启动器

@SpringBootApplication
@EnableDiscoveryClient   //向注册中心注册该服务,并可以获取其他服务的调用地址
public class NacosProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApp.class);
    }
}

service层

public interface UserService {
    User getUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {

    @Override
    public User getUserById(Integer id) {
        return new User(id,"张三",18);
    }
}

controller控制层

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @Autowired
    private UserService userService;
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

nacos_consumer模块

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wrs</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

application.yml

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848 #nacos服务的地址
  application:
    name: nacos-provider #向注册中心注册的名字

启动器

@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApp.class);
    }
}

config配置层

@Configuration
public class ConfigBean {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

controller控制层

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
	
	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private DiscoveryClient discoveryClient; //发现服务的工具类

	@RequestMapping(value="/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		//获取nacos中注册的所有服务信息
		List<String> serviceList = discoveryClient.getServices();
		for (String service : serviceList) {
			System.out.println(service);
		}
		//获取nacos中注册的指定服务信息
		ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
		String serviceUrl = instance.getHost() + ":" + instance.getPort();

		String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

测试:

通过两个模块的启动,进行注册,注册到服务中心,如下图:

3. 为什么要使用注册中心?

因为不使用注册中心:1.地址硬编码

                                    2.不能负载均衡

四、配置中心

1.配置中心入门

微服务架构下关于配置文件的一些问题:

  • 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

  • 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

  • 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

基于上面这些问题,我们就需要配置中心的加入来解决这些问题, 配置中心的思路是:

  1. 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。

  2. 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

  3. 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

nacos配置中心的作用:

    系统配置的集中管理(编辑、存储、分发)、动态更新不重启回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。

创建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>
    </dependencies>

bootstrap.yml

        添加一个比application.yml文件优先级更高的配置文件 bootstrap.yml

        bootstrap/application的应用场景:

  • bootstrap.yml 比 application.yml 优先加载,应用于系统级别参数配置,一般不会变动;
  • application.yml 应用于 SpringBoot 项目的自动化配置;
spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件扩展名只支持properties和yaml
        prefix: nacos-config #文件名,默认是spring.application.name
    

添加配置:

  • 在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:

    ${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}

  • 说明:

    • spring.cloud.nacos.config.prefix:默认是当前服务的服务名称

    • spring.cloud.nacos.config.file-extension:配置文件的格式(后缀),目前只支持yaml和properties

  • 在nacos中创建配置文件
    •  Data ID:prefix.file-extension
    •  配置格式:yaml或properties

 controller控制器:

在配置内容中添加:

 datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/health?characterEncoding=UTF-8
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

可利用controller层进行读取,将所添加的内容显示到页面上

@RefreshScope  作用:在修改配置文件后则重新生成bean,能够实时更新配置内容

@RestController
@RefreshScope   //修改配置文件后则重新生成bean
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;
    @Value("${spring.datasource.type}")
    private String type;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        System.out.println(this);
        String configInfo=driverClassName+"<br>"+url+"<br>"+username+"<br>"
                +password+"<br>"+type;
        return configInfo;
    }

}

启动器

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

动态实时更新配置原理:

当启动时加载配置文件

修改配置文件后nacos监听到MD5有变化则推送消息给客户端(实际上就是调用客户端),客户端收到消息后会拉去最新配置

MD5相当于UUID,每次配置文件修改后,都会生成一个新版本,生成一个新的MD5,然后通知客户端,给客户端发送信息,客户端拉去更新后的配置信息

nacos会在本地缓存一份配置文件,当需要时能够直接从本地获取使用,如果配置文件有改动,则会从新获取一份,缓存到本地

一般会缓存到以下目录中

 可以通过浏览器访问:http://127.0.0.1/config/info  查看配置信息

为什么要用配置中心:

因为配置中心可以:1. 集中管理配置文件
                                 2.动态更新配置文件

2.配置中心隔离

1.配置管理模型

对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。

Namespace Group DataId介绍:

  • Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等

  • Group: 可以代表某个项目, 如XX医疗项目, XX电商项目

  • DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件

获取配置集需要指定:

        1.nacos服务地址,必须指定

        2.namespace,如不指定默认public

        3.group,如不指定默认为DEFAULT_GROUP

namespace隔离

命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。

新建namespace

 建立好namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡,如下图:

克隆配置文件

点击左下角“克隆”按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。

 选择中一个要克隆到的目标空间,也可以对克隆的配置文件进行Data ID,Group 名称修改,不修改则是默认被克隆的配置文件的Data ID,Group的名称,点击“开始克隆”,

 点击克隆后,则是将被克隆的配置文件的内容全部克隆过来。

在bootstrap.yml中添加namesspace属性,例如:“namespace: dev”,依旧可以进行动态配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件扩展名只支持properties和yaml
        prefix: nacos-config #文件名,默认是spring.application.name
        namespace: dev #开发环境

Group隔离

1.新建配置文件并修改Group名

2.不同的配置分组下可以有相同的配置 ,相当于一个大文件夹(dev)有两个小文件夹(group)

 bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.238.132:8848 #配置中心得地址
        file-extension: yaml #配置文件扩展名只支持properties和yaml
        prefix: nacos-config #文件名,默认是spring.application.name
        namespace: dev #开发环境
        group: NACOS_GROUP #项目名

服务隔离

nacos_provider模块中application.yml

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848 #nacos服务的地址
        namespace: dev
        group: NACOS_GROUP
  application:
    name: nacos-provider #向注册中心注册的名字

在dev环境下能够看到nacos-provider,group为NACOS_GROUP

 在public环境下能够看到nacos-consumer,group为DEFAULT_GROUP

 进行调用时,找不到数据,前端报500错误,后端报“下标越界异常”说明了服务的隔离性 ,只有它们两个在同一环境下,才能正常的调用

五、Nacos集群和持久化

Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql

1.持久化

切换数据库

修改usr/local/nacos/conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)

可以在linux图形化界面中,使用文本编译器打开

也可以使linux命令打开

[root@localhost bin]# cd /usr/local/nacos
[root@localhost nacos]# cd conf
[root@localhost conf]# vim application.properties

 进到application.properties文件的编辑页面,找到下图中所圈的内容,将注释“#”删掉

 并将第三个框中的内容进行修改,修改为自己的mysql数据库所在的ip地址,用户名和密码也要修改为自己的mysql数据库的用户和密码,如下图所示:

 修改完成后,保存并退出,重启nacos;

初始化数据库

 找到nacos-mysql.sql文件,将nacos-mysql.sql文件导入到数据库中;

新建配置文件:将Data ID、Group以及配置内容和配置格式填好并保持:

 打开nacos数据库,查看config_info表,就能看到刚新创建的配置文件的数据了

2.集群

集群搭建

1.在usr/local/nacos中找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下:

这里ip地址之所以一样,是因为在同一台服务器linux上部署了三个nacos,是为了节省空间,真实的部署是分别部署在三台服务器上,ip地址各不相同;

# ip:port
192.168.238.132:8848
192.168.238.132:8849
192.168.238.132:8850

也可以通过linux命令找并修改:

[root@localhost ~]# cd /usr/local/nacos/conf
[root@localhost conf]# cp cluster.conf.example cluster.conf
[root@localhost conf]# vim cluster.conf

2.创建一个nacos_cluster文件夹,复制三份Nacos,并进行命名

[root@localhost ~]# cd /usr/local
[root@localhost local]# mkdir nacos_cluster
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost local]# cp -r nacos nacos_cluster/nacos_8850

3.分别进到上边复制并重新命名的三个文件夹中将conf/appplication.properties中的端口号分别改为,因为有一个是端口是8845,是默认的,所以不用修改:

[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8849/conf/application.properties:
server.port=8849

[root@localhost ~]# vim /usr/local/nacos_cluster/nacos_8850/conf/application.properties:
server.port=8850

4.分别启动三个nacos

[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh

5.分别在浏览器上访问三个nacos

http://192.168.238.132:8848/nacos
http://192.168.238.132:8849/nacos
http://192.168.238.132:8850/nacos

6.启动一个服务,注册进去,进行测试,可以看到能够在三个nacos服务中显示出来,这里只截取一个图进行显示

7.随机选择一个nacos查看“节点列表”:

 8.点开“节点元数据”,可以根据里面的内容判断哪个是“老大”;

老大的作用:是进行数据的同步,当老大死了,也就是挂了,就会推出来一个新的老大,是根据“投票机制”选出老大

 

 配置代理服务

 1.安装nginx的依赖库(c语言环境)

[root@localhost ~]# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

2.下载nginx

[root@localhost ~]# cd /usr/upload
[root@localhost upload]# wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

3.解压安装包

[root@localhost upload]# tar -zxvf nginx-1.12.0.tar.gz

4. 配置安装路径

[root@localhost upload]# cd nginx-1.12.0

[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx

5.编译并安装

[root@localhost nginx-1.12.0]# make && make install

6.配置nginx代理nacos

首先找到nginx.conf文件,并打开进行修改

[root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf

7.将图中圈中的地方替换为:

location / {
    proxy_pass http://nacos;
  }

8.在图中圈中的上方添加以下内容:

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

9.修改后为下图所示:

 10.nginx的命令

[root@localhost conf]# cd ..
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ./nginx             #启动
[root@localhost sbin]# ./nginx -s stop     #关闭
[root@localhost sbin]# ./nginx -s reload   #重启

11.启动nginx后,同时也要保持nacos集群的启动,这时启动一个服务进行测试

要启动的服务需要对application.yml进行改动,将端口号去掉

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132 #nacos服务的地址
  application:
    name: nacos-provider #向注册中心注册的名字

在服务启动后,随机访问一个nacos:http://192.168.238.132/nacos/ 可以看到网址中的端口号已经没有了,测试结果如下:


 

 六、Nacos开机启动

这里的开机启动是指:当打开安装的有nacos的linx系统时,nacos它会自动启动,不用人为启动,它启动的是单机启动,不是集群启动,主要是方便日常的使用。

1.添加nacos.service文件

[root@localhost ~]# vim /lib/systemd/system/nacos.service

2.在文件中添加以下内容:

[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

3.修改nacos的starup.sh文件

[root@localhost ~]# vim /usr/local/nacos/bin/startup.sh

 将下面内容直接复制到里面

[ ! -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

4.设置开机自起

[root@localhost ~]# systemctl start nacos.service  #启动nacos服务
[root@localhost ~]# systemctl daemon-reload        #重新加载服务配置
[root@localhost ~]# systemctl enable nacos.service #设置为开机启动

如有错误请私聊或评论指正!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐