Nacos安装指南

1.Windows安装

开发阶段采用单机安装即可。

1.1.下载安装包

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
如图:
image.png
采用1.4.1.版本的Nacos,课前资料已经准备了安装包:
windows版本使用nacos-server-1.4.1.zip包即可。

1.2.解压

将这个包解压到任意非中文目录下,如图:
目录说明:

  • bin:启动脚本
  • conf:配置文件

    1.3.端口配置

    Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
    如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
    修改其中的内容:
    image.png

    1.4.启动

    启动非常简单,进入bin目录,结构如下:
    然后执行命令即可:

  • windows命令:startup.cmd -m standalone

    1.5.访问

    在浏览器输入地址:http://127.0.0.1:8848/nacos即可:
    默认的账号和密码都是nacos,进入后:
    image.png

    2.Linux安装

    Linux或者Mac安装方式与Windows类似。

    2.1.安装JDK

    Nacos依赖于JDK运行,索引Linux上也需要安装JDK才行。
    上传jdk安装包:
    上传到某个目录,例如:/usr/local/
    然后解压缩:
    tar -xvf jdk-8u144-linux-x64.tar.gz
    然后重命名为java
    配置环境变量:
    export JAVA_HOME=/usr/local/java
    export PATH=$PATH:$JAVA_HOME/bin
    设置环境变量:
    source /etc/profile

    2.2.上传安装包

    如图:
    image.png
    也可以直接使用课前资料中的tar.gz:
    上传到Linux服务器的某个目录,例如/usr/local/src目录下:
    image.png

    2.3.解压

    命令解压缩安装包:
    tar -xvf nacos-server-1.4.1.tar.gz
    然后删除安装包:
    rm -rf nacos-server-1.4.1.tar.gz
    目录中最终样式:
    目录内部:
    image.png

    2.4.端口配置

    与windows中类似

    2.5.启动

    在nacos/bin目录中,输入命令启动Nacos:
    sh startup.sh -m standalone

    3.Nacos的依赖

    父工程:

    com.alibaba.cloud
    spring-cloud-alibaba-dependencies
    2.2.5.RELEASE
    pom
    import

    客户端:
    com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

1.Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用。

1.1.统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

1.1.1.在nacos中添加配置文件

如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

1.1.2.从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)引入nacos-config依赖
首先,在user-service服务中,引入nacos-config的客户端依赖:


com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config

2)添加bootstrap.yaml
然后,在user-service中添加一个bootstrap.yaml文件,内容如下:
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。
本例中,就是去读取userservice-dev.yaml:
3)读取nacos配置
在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:
完整代码:
package cn.itcast.user.web;

import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping(“/user”)
public class UserController {

  1. @Autowired<br /> private UserService userService;
  2. @Value("${pattern.dateformat}")<br /> private String dateformat;<br /> <br /> @GetMapping("now")<br /> public String now(){<br /> return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));<br /> }<br /> // ...略<br />}<br />在页面访问,可以看到效果:

1.2.配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新
要实现配置热更新,可以使用两种方式:

1.2.1.方式一

在@Value注入的变量所在类上添加注解@RefreshScope:

1.2.2.方式二

使用@ConfigurationProperties注解代替@Value注解。
在user-service服务中,添加一个类,读取patterrn.dateformat属性:
package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = “pattern”)
public class PatternProperties {
private String dateformat;
}
在UserController中使用这个类代替@Value:
完整代码:
package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping(“/user”)
public class UserController {

@Autowired<br />    private UserService userService;

@Autowired<br />    private PatternProperties patternProperties;

@GetMapping("now")<br />    public String now(){<br />        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));<br />    }

// 略<br />}

1.3.配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。
下面我们通过案例来测试配置共享

1)添加一个环境共享配置

我们在nacos中添加一个userservice.yaml文件:

2)在user-service中读取共享配置

在user-service服务中,修改PatternProperties类,读取新添加的属性:
在user-service服务中,修改UserController,添加一个方法:

3)运行两个UserApplication,使用不同的profile

修改UserApplication2这个启动项,改变其profile值:
这样,UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test。
启动UserApplication和UserApplication2
访问http://localhost:8081/user/prop,结果:
访问http://localhost:8082/user/prop,结果:
可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。

4)配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有高低之分:
image.png

Nacos集群搭建

官方给出的Nacos集群图:
image.png
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:
image.png

2.搭建集群

搭建集群的基本步骤:

  • 搭建数据库,初始化数据库表结构
  • 下载nacos安装包
  • 配置nacos
  • 启动nacos集群
  • nginx反向代理

    2.1.初始化数据库

    Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。
    官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考传智教育的后续高手课程。
    这里我们以单点的数据库为例来讲解。
    首先新建一个数据库,命名为nacos,而后导入下面的SQL:
    / 数据库全名 = nacos_config // 表名称 = config_info_aggr // 表名称 = config_info_beta /
    / 表名称 = config_info_tag // 表名称 = config_tags_relation /~~~~

    2.2.下载nacos

    nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。
    本例中才用1.4.1版本:

    2.3.配置Nacos

    将这个包解压到任意非中文目录下,如图:
    目录说明:

  • bin:启动脚本

  • conf:配置文件

进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
然后添加内容:
127.0.0.1:8845
127.0.0.1:8846
127.0.0.1:8847
注意:此处的IP是你自己服务的IP,不一定要按照我的来!
可以在单节点运行时,到nacos控制台查看自己的节点IP,那么这里就配置一样的IP:
image.png
然后修改application.properties文件,添加数据库配置
spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
这里的数据库地址、用户名、密码请根据实际情况配置。

2.4.启动

将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的application.properties,
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
然后分别启动三个nacos节点:
startup.cmd

2.5.nginx反向代理

找到nginx安装包: 解压到任意非中文目录下:
修改conf/nginx.conf文件,配置如下:
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}

server {
listen 80;
server_name localhost;

location /nacos {<br />        proxy_pass http://nacos-cluster;<br />    }<br />}<br />而后在浏览器访问:[http://localhost/nacos](http://localhost/nacos)即可。<br />代码中application.yml文件配置如下:<br />spring:<br />  cloud:<br />    nacos:<br />      server-addr: localhost:80 # Nacos地址