手把手学习Nacos

Nacos

Name Configuration Service,微服务中的服务注册中心、统一配置中心

1.下载和如何启动

下载地址:https://github.com/alibaba/nacos/releases

我这里使用的是2.0.3版本

image-20211031113506438

由于Github确实太慢,里面win、linux的nacos2.0.3都有,还有一个linux下1.4.2的nacos,大家选择下载,别整个文件下

链接:https://pan.baidu.com/s/1VwEU_q9c-X92RpcsmNDF3A
提取码:dddd

Windows、Linux如何启动?

Nacos官网:https://nacos.io/zh-cn/docs/quick-start.html

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

2.Linux安装Nacos

因为nacos是用springboot写的,所以需要java环境,jdk8及以上,

Linux安装jdk8:https://blog.csdn.net/qq_42682745/article/details/120896261

安装完jdk之后,将安装包上传解压即可:

tar -xvf 你的安装包名

即可,

因为我是用的阿里的服务器,所以需要开放8848端口,重启服务器(Nacos的web端口),虚拟机的话需要关闭防火墙

进入到nacosd的bin目录下。执行如下命令,单机模式启动

./startup.sh -m standalone

如何关闭?

./shutdown.sh

访问:ip+8848/nacos/

我的:http://47.99.112.38:8848/nacos/

image-20211031153021758

用户名、密码都是nacos

image-20211031155535624

ok!

3.写一个微服务注册到Nacos

我们首先应该创建一个module作为父项目,它不写任何代码,只是用来管理SpringBoot、cloud、cloud alibaba的版本:pom如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>


<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring.cloud-version>Hoxton.SR8</spring.cloud-version>
    <spring.cloud.aliyun-version>2.2.1.RELEASE</spring.cloud.aliyun-version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.aliyun-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

新建module,空module作为父项目,引入依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

编写配置:

spring.application.name=NACOSTEST
server.port=9998

#服务器的nacos总地址
spring.cloud.nacos.server-addr=47.99.112.38:8848

注意:

image-20211031162856246

上图中的配置才是注册地址的配置,可以看到它的默认值是spring.cloud.nacos.server-addr的值,所以我们配置spring.cloud.nacos.server-addr也可以。

image-20211031163109099

上图的配置才是指定向nacos注册的服务的名字,可以看到它默认值是spring.application.name的值,所以我们写spring.application.name也行

运行查看:

image-20211031162035314

注册成功

4.Nacos+OpenFeign实现服务间的调用

像上面一样再创建一个微服务,只是依赖需要加上openfeign

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <!--nacos-->    <dependency>        <groupId>com.alibaba.cloud</groupId>        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>    </dependency>    <!--openfeign-->    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-openfeign</artifactId>    </dependency></dependencies>

先启动两个服务:都注册到nacos了

image-20211031170618065

我们现在User调用Order服务,先给它两写接口:

image-20211031171104116

image-20211031171256171

用户服务使用OpenFeign调用订单服务:(两个启动类都加上@EnableFeignClients吧,它的作用是开启feign调用)

用户服务创建调用order的接口类:

image-20211031173333820

用户服务的接口:

image-20211031173444372

浏览器访问:

image-20211031173511251

完成

5.Nacos的统一配置

我们知道,nacos既是注册中心也是配置中心

所以我们还需要引入nacos config的依赖,之前的是服务注册的依赖:

依赖:

<dependencies>
    <!--nacos服务注册-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!--nacos配置-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

Nacos管理页面写配置

image-20211031212041024

image-20211031212317636

点击发布即可

服务的配置编写

因为我们要让服务启动时知道去哪拉取配置、拉取什么配置,所以该配置文件必须是bootstrap的

#配置在哪spring.cloud.nacos.server-addr=47.99.112.38:8848#哪个组spring.cloud.nacos.config.group=xp#哪个文件,即dataidspring.cloud.nacos.config.name=nacos-prod#文件的后缀spring.cloud.nacos.config.file-extension=properties

还有一种配置写法:

#配置在哪spring.cloud.nacos.server-addr=47.99.112.38:8848#哪个组spring.cloud.nacos.config.group=xp#文件前缀spring.cloud.nacos.config.prefix=nacos#激活的环境spring.profiles.active=prod#文件的后缀spring.cloud.nacos.config.file-extension=properties

个人是觉得第一种好一些

写一个测试接口

我们不是在nacos的配置中配置了一个name吗,所以该接口就使用这个name,看配置拿到没有

@Value("${name}")
private String name;

@GetMapping("/test")
public String test(){
return name;
}

启动,测试

image-20211031213457427

首先可以看到端口号是已经拿到了的,再看看name能不能拿到:

image-20211031213609547

确实也拿到了

6.统一配置中心的几个概念

配置文件的历史版本,在历史版本菜单,需要搜索才能看到,它不会查询所有

命名空间:

简单来说就是配置文件的隔离,不同项目应有不同的命名空间

nacos默认命名空间是publi

image-20211031215337013

新建了两个:

image-20211031215502664

不同命名空间进行项目的配置管理。

如果要拉取你自己定义的命名空间的配置,就需要在配置文件中新增命名空间:

#配置在哪
spring.cloud.nacos.server-addr=47.99.112.38:8848
#哪个命名空间
spring.cloud.nacos.config.namespace=
#哪个组
spring.cloud.nacos.config.group=xp
#哪个文件,即dataid
spring.cloud.nacos.config.name=nacos-prod
#文件的后缀
spring.cloud.nacos.config.file-extension=properties

它的默认值就是public

简单来说就是对项目的拆分进行隔离,比如一个项目有多个微服务,比如用户服务、订单服务,就可以通过组来隔离配置文件

Data Id

配置文件的名字

7.配置文件的导出导入

导出

image-20211031220627262

导出一个zip包

image-20211031220816180

导入

将导出的压缩包导入即可,

image-20211031220939831

选中压缩包即可

8.Nacos配置信息的数据持久化–mysql

image-20211101092942593

它要求mysql版本5.6.5+,我们可以看下服务器的数据库版本:mysql -V

image-20211101093112676

如果你的服务器没有mysql或者版本不够,可以参考我的linux安装mysql的文章:结尾附有如何彻底卸载mysql:https://blog.csdn.net/qq_42682745/article/details/120886092

(其中的命令请手动鼠标复制,不要点csdn的copy,那玩意复制后末尾自带换行符,粘贴到服务器上就直接执行了,不妥)

创建一个数据库,名字随意,必须为utf-8的编码

image-20211101094816919

数据库初始化nacos-mysql.sql文件

这个sql文件在哪呢?在nacos的安装目录里,conf目录下

image-20211101095106501

通过Xftp工具直接拖到本机上:

image-20211101095221372

数据库右键,Execute SQL File,选择刚刚下载的sql文件

image-20211101095409574

tables右键刷新即可:

image-20211101095610989

修改nacos配置文件

还记得吗,nacos是springboot应用,它的配置文件叫application.properties,还是在conf目录下

image-20211101095950352

vim application.properties

找到mysql的配置

image-20211101100412473

:set nu 开启行号

按下 i 或者insert键进入编辑模式

Esc退出编辑

:wq 保存并退出

:q 退出

image-20211101100948600

其余不用改,保存退出即可,重启nacos

image-20211101101403173

可以看到现在config_info的表是没有数据的,我们现在去nacos上添加一个配置看看

image-20211101101605318

image-20211101101639338

ok,确实保存到mysql了

Nacos集群搭建

前言:

这里是官网的一张图:

image-20211103090636834

DNS,不用说了吧域名服务器(域名----->ip)

SLB?Server Loadbalance 负载均衡服务器

为什么nacos集群需要这样架构呢?

image-20211103091041869

这里是我们要配置的nacos服务地址对吧,既然做了集群了,我们不可能在配置文件中写死一个地址啊,其它服务地址岂不是没用了。所以在集群环境下,上面的这个配置应该写负载均衡服务的地址,负载均衡简单呀,Nginx。好了既然是写负载均衡的地址,那我总能写ip+端口了吧?当然也可以,但是如果后续ip发生变化,就涉及到改代码了。所以最好的方式是这个配置写域名,这也是为什么要加DNS的原因。

集群条件:

image-20211103092030853

目前学习阶段满足框起来的3个即可

你需要准备的:

  1. 至少一个mysql服务
  2. 3台服务器或者起虚拟机(nacos占内存,一个大约要准备0.5G,可一个虚拟机开3个不同端口的Nacos),我这里就用三台服务器。
  3. 一个nginx服务

步骤:

  1. 准备好环境,一个mysql、nginx、跑三个nacos

  2. 删除最初的nacos数据库,重新执行sql文件,因为集群是要求不能有数据的

  3. 修改appliacation.properties配置文件的mysql,开启并修改为你的mysql(三个nacos都要改)

  4. 创建修改cluster.conf配置文件(这两个文件都在conf下),把所有的集群节点都写进去

    这是cluster.conf.example,示例:(该步骤同样三个nacos都要改)

    image-20211103104930760

我们只需要将这个文件复制、重命名即可,命令如下:

cp cluster.conf.example ./cluster.conf

image-20211103105141428

接下来修改配置:

vim cluster.conf

按 i 或者 insert键进入编辑模式、Esc退出编辑模式、非编辑模式输入 :wq 保存退出 :q 退出

vim下是不能使用小键盘的哦!

我们需要将三个nacos的地址都写在里面(ip+端口),根据你的地址来写,然后将这个复制到其它两台nacos的cluster.conf中即可

Ctrl+Insert 复制 Shift+Insert 粘贴

image-20211103154616550

  1. 启动nacos,如果已经启动请先关闭,再启动

现在我们启动nacos就不能使用 ./startup.sh -m standalone这种方式了,这种是单机启动,nacos默认是集群启动,所以

./startup.sh 

就行了,三个都启起来

两个G啊兄弟们,一台服务器只能跑一个集群模式的nacos,无奈,我只有把有台服务器的项目都停了

image-20211103155105171

卧槽,关到只剩mysql了(这台服务器附带跑MySQL,任务艰巨),都还是不行,没办法,服务器就只有2G内存,我们可以去Nacos的启动脚本看看,它的jvm参数:

进入nacos的bin目录

vim startup.sh

如图

image-20211103164010071

只能把它集群启动的堆大小改小一点了,哈哈,试试1.5g。2G只是nacos运行比较稳,我们也只是学习的时候用,2G肯定绰绰绰绰有余,改成1.5试试

image-20211103164708231

需要把g换算为m!!!!!!!!

-Xms、-Xmx 保持一致即可(至于为啥?可以搜一下),-Xmn新生代,根据你减少了多少堆内存做相应减少即可,2-----1.5 我把它从1变为了0.8,我们这也不是生产环境不必那么精细。

保存,启动

果然没跑起来,一直staring,估计还是内存问题,换成1G还是不行,算了,有机会再补上吧

B站视频:https://www.bilibili.com/video/BV1S5411c7hM?p=62

虽然有一台没有启动成功,但是集群我们是搭建成功了的,可以看

image-20211103214418033

它会在本机的cluster.conf里面自己加上内网地址

对了,nacos是部署到内网的,极极极其不推荐放到公网上,这里只是为了方便学习

猜你喜欢

转载自blog.csdn.net/qq_42682745/article/details/121131036