2023-7-18Nacos学习

1 Nacos注册中心

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。

1.1 认识和安装Nacos

在这里插入图片描述

1.2 Windows安装

1.2.1下载安装包

在Nacos的GitHub页面,提供有下载链接,
可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases
在这里插入图片描述

1.2.2 解压

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

在这里插入图片描述

目录说明:

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

1.2.3 端口配置

Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
在这里插入图片描述
修改其中的内容:
在这里插入图片描述

1.2.3 启动

  1. 启动非常简单,进入bin目录,结构如下:

在这里插入图片描述

  1. 然后执行命令即可:
  • windows命令:以单服务器模式启动
startup.cmd -m standalone

3 执行后的效果如图:
在这里插入图片描述
4. 建议创建一个快捷方式,以后方便运行

在这里插入图片描述

1.2.5 访问

在浏览器输入地址:http://127.0.0.1:8848/nacos即可:
在这里插入图片描述

默认的账号和密码都是nacos,进入后:

在这里插入图片描述

1.3 服务注册到Nacos

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。

主要差异在于:

  • 依赖不同
  • 服务地址不同

1.3.1 引入依赖

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:

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

然后在子工程user-service和order-service中的pom文件中引入nacos-discovery依赖:

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

注意:子工程不要忘了注释掉eureka的依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.3.2 配置Nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

注意:不要忘了注释掉eureka的地址

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

1.3.3 重启

重启微服务后,登录nacos管理页面,可以看到微服务信息:

在这里插入图片描述

1.4 服务分级储存模型

一个服务可以有多个实例,例如我们的user-service,可以有:

  • 192.168.159.1:8081
  • 192.168.159.1:8082
  • 192.168.159.1:8083

假如这些实例分布于全国各地的不同机房,例如:

  • 192.168.159.1:8081,在上海机房
  • 192.168.159.1:8082,在上海机房
  • 192.168.159.1:8083,在杭州机房

Nacos就将同一机房内的实例 划分为一个集群

也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
在这里插入图片描述

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如
在这里插入图片描述
杭州机房内的order-service应该优先访问同机房的user-service。

1.4.1 给user-service配置集群

修改user-service的application.yml文件,添加集群配置:

8081和8082在HZ集群,8083在SH集群

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

重启两个userservice实例,点详情
在这里插入图片描述
在服务详情中查看集群
在这里插入图片描述
将8083的配置设置集群为SH,添加属性:

-Dserver.port=8083 
-Dspring.cloud.nacos.discovery.cluster-name=SH

配置如图所示:
在这里插入图片描述
启动UserApplication8083,后再次查看nacos详情:
在这里插入图片描述

1.4.2 同集群优先的负载均衡

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。

因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

1)给order-service配置集群信息

修改order-service的application.yml文件,添加集群配置,放在HZ这个集群中

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

2)修改负载均衡规则:修改order-service的application.yml文件,修改负载均衡规则:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 
  1. 重启OrderApplication,访问浏览器,刷新多次,发现所有的请求都在8081和8082这两个服务器。

    在这里插入图片描述

注:在本地集群中服务器的选择采用的是随机的负载均衡方式

  1. 将8081和8082的服务器关闭,这时同一个集群中所有的服务器都关了,只能访问其它集群了。
    在这里插入图片描述
    5 再访问会发现访问8083,同时OrderApplication控制台会有警告信息,说是出现了跨集群访问
    在这里插入图片描述

1.5 权重配置

实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在的机器设备性能较好,一部分较差,我们希望性能较好的机器承担更多的用户请求,但是默认情况下NacosRule实在同集群随机挑选,不会考虑机器性能,因此Nacos提供了权重设置,来控制访问的频率,权重越大访问的频率越高。

  1. 再次启动8081和8082服务器
    1. 在nacos控制台,找到userservice的实例列表,点击编辑,即可修改权重:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnRFs4E9-1689649672051)(assets/image-20211119115051111.png)]

  1. 在弹出的编辑窗口,修改权重:

在这里插入图片描述

  1. 再次访问,会发现8081被访问到的次数少得多,大约只有8082的五分之一。

    注:userservice微服务器重启以后,权重会还原

  2. 如果将8081权重修改为0,则该实例永远不会被访问。

应用场景:当系统升级时,可以将用户清除,升级之后再放入少量用户测试访问

1.6 环境隔离

Nacos既是注册中心,又是数据中心。为了便于管理,Nacos提供了namespace来实现环境隔离功能。用于进行租户级别的隔离,我们最常用的就是不同环境比如测试环境,线上环境进行隔离。

  • nacos中可以有多个namespace
  • namespace下可以有group等。业务相关性比较强的可以放在一组,比如:支付和订单
  • 不同namespace之间相互隔离,即不同namespace的服务互相不可见
    在这里插入图片描述

1.创建namespace

应用场景:基于不同的开发环境变化做隔离操作

默认情况下,所有service、group都在同一个namespace,名为public:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1aNecH1-1689650539480)(assets/image-20210714000414781.png)]

  1. 我们可以点击页面新增按钮,添加一个namespace:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwlYbh6r-1689650539483)(assets/image-20210714000440143.png)]

  1. 然后,填写数据:

  1. 能在页面看到一个新的namespace:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5bVZojG-1689650539484)(assets/image-20210714000522913.png)]

2.给微服务配置namespace

  1. 给微服务配置namespace只能通过修改配置来实现。

例如,修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
  1. 重启order-service后,查看管理页面,可以看到在public下没有orderservice服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggip8oxR-1689650539485)(assets/image-20211119120130689.png)]

  1. 点旁边的dev可以看到另一个空间的服务只有orderservice:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00bGoLEK-1689650539486)(assets/image-20211119120209170.png)]

  2. 此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vn0XeIxN-1689650539487)(assets/image-20211116120355133.png)]

  1. 修改user-service中的application.yml,把它的namespace也设置成同一个命名空间

    spring:
      application:
        name: userservice
    
      cloud:
        nacos:
          server-addr: localhost:8848
          discovery:
            cluster-name: HZ
            namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 
    
  2. 重启UserApplication8081的服务,查看nacos的服务列表

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2dXIVT7-1689650539488)(assets/image-20211119120601750.png)]

  3. 再次访问可以正常访问

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWIstLpX-1689650539489)(assets/image-20211119120639327.png)]

二、Nacos配置管理

1.统一配置管理

1.1.1.在nacos中添加配置文件

如何在nacos中管理配置呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rw5qnO9W-1689665358550)(assets/image-20210714164742924.png)]

然后在弹出的表单中,填写配置信息:

注:这里扩展名使用yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNsj4Sh2-1689665358551)(assets/image-20210714164856664.png)]

配置内容如下:

pattern: 
  dateformat: yyyy-MM-dd HH:mm.ss

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。通常是一些偶尔会变动的参数。

1.1.2.从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此Spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4rT63ZxK-1689665622021)(assets/image-20211119171739510.png)]

1)在user-service服务中,引入nacos-config的客户端依赖:

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

2)添加bootstrap.yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Gre9hSC-1689665589001)(assets/image-20211119171313055.png)]

然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

  1. 服务名为userservice,注:名字中间没有短横。
  2. 指定激活的配置dev
  3. 指定spring.cloud.nacos.server-addr的服务地址:localhost:8848
  4. 指定spring.cloud.nacos.config.file-extension配置文件的扩展名为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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnyQfpD7-1689665589006)(assets/image-20210714170845901.png)]

  1. 去掉application.yml中相关重复的配置

    application:
      name: userservice
    
    cloud:
      nacos:
        server-addr: localhost:8848
        discovery:
          cluster-name: HZ
          namespace: a8ace27d-a737-4122-9f3f-92f5ee795b62
    

4)读取nacos配置

在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:

完整代码:

package cn.itcast.user.web;

import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
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;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }

}

访问不同的服务页面,可以看到效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-809b9rhN-1689665589008)(assets/image-20211116153853593.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXvKwQJM-1689665589010)(assets/image-20211116153921669.png)]

2.配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

2.1 方式一

在@Value()所在类上面添加@RefreshScope

在这里插入图片描述
步骤
1 在UserController上添加@RefreshScope注解,这注解会重新加载在实例对象,并且使用新配置
2 重新启动UserController,让新代码起作用
3 编辑Nacos配置
在这里插入图片描述
4 在浏览器查看新配置
在这里插入图片描述

2.2 方式二

使用@ConfigurationProperties 代替@RefreshScope和@Value
1 去掉UserController上面的@RefreshScope和@Value

2 创建Pattrenproperties配置类
		在配置类添加@Component
    	添加@CongurationProperties(prefix=" pattern")
		添加String dateformat属性

在这里插入图片描述

3 在UserController使用这个类
在这里插入图片描述
4. 完整代码:

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
    private UserService userService;

    @Autowired
    private PatternProperties patternProperties;

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

}
  1. 重启UserApplication微服务
  2. 编辑Nacos配置
  3. 效果
    在这里插入图片描述

3.配置共享

1. 共享配置的说明

应用场景:某个配置在开发,测试,生产环境中的配置是一样的,就可以使用共享配置

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

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

  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

2. 测试配置共享

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

    pattern: 
      envSharedValue: 大家都可以用哦
    

    在这里插入图片描述
    2.这是有两个配置文件
    在这里插入图片描述
    3 在PatternProperties配置类添加String envSharedValue属性
    在这里插入图片描述
    4 在UserController重新写一个方法
    在这里插入图片描述
    5 运行两个UserAppcliation,使用不同的profiles
    在这里插入图片描述

6 重新启动UserController
7 查看浏览器效果
在这里插入图片描述

在这里插入图片描述

3. 配置共享的优先级

1. 优先级说明

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOjoYRJK-1689671218283)(assets/image-20210714174623557.png)]

服务器控制台显示:

 Located property source: [BootstrapPropertySource {name='bootstrapProperties-userservice-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-userservice.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-userservice,DEFAULT_GROUP'}]
2. 演示
  1. 在PatternProperties中添加新的username属性

    @Component
    @ConfigurationProperties(prefix = "pattern")
    @Data
    public class PatternProperties {
    
        private String dateformat;
        private String envSharedValue;
        private String username;
    }
    
  2. 在application.yml中添加新的username属性,查看浏览器运行效果

    pattern:
      username: 孙悟空
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6llcV3m-1689671218284)(assets/image-20211120094101427.png)]

  3. 在userservice.yaml中添加新的username属性,查看浏览器运行效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzUnthim-1689671218285)(assets/image-20211127094805191.png)]

  4. 在userservice-dev.xml中添加新的username属性,查看浏览器运行效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3dqeEvw-1689671218287)(assets/image-20211127094909429.png)]

4.配置Nacos集群

1.集群结构图

官方给出的Nacos集群图:

SLB:负载均衡器,负责将我们的请求分发到不同的nacos节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8MMJJgs-1689676062269)(assets/image-20210409210621117.png)]

其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

我们计划的集群结构:

三个nacos节点的地址:

节点换成实际服务器的IP地址port
nacos1192.168.159.18845
nacos2192.168.159.18846
nacos3192.168.159.18847

2.搭建集群

搭建集群的基本步骤:

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

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。

官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考黑马程序员的课程。这里我们以单点的数据库为例来讲解。

首先新建一个数据库,命名为nacos_config。这个表结构已经由官方提供了。

注:要使用mysql5.7以上的版本,5.5运行不了。

CREATE DATABASE IF NOT EXISTS nacos;
USE nacos;

CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
2.2.配置Nacos
  1. 创建一个目录名为:nacos-cluster
  2. 进入目录nacos-cluster目录,重新解压安装一份新的nacos
  3. 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncFRkJ9c-1689676062271)(assets/image-20210409212459292.png)]

  1. 然后添加内容,注意:此处的IP是你自己机器的IP地址,不要写成127.0.0.1(或localhost),否则会导致微服务注册失败
192.168.159.1:8845
192.168.159.1:8846
192.168.159.1:8847

在cmd下使用ipconfig来查看自己的IP地址(建议选择虚拟机网卡的ip,VMnet8)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lt7Y1Z0i-1689676062271)(assets/image-20211120094726926.png)]

  1. 然后修改application.properties文件,修改数据库配置。
# 由于nacos会动态读取当前电脑上任意网卡的ip导致集群环境失败,所以写死当前ip
nacos.inetutils.ip-address=192.168.90.105
# mysql的数据库集群
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=root

这里的数据库地址、用户名、密码请根据实际情况配置。

2.3.启动

将nacos改名成nacos1,并且复制两份,分别命名为:nacos2、nacos3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQTRyFFw-1689676062273)(assets/image-20210409213335538.png)]

然后分别修改三个文件夹中的application.properties,大约在21行

nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

修改内存使用使用,nacos默认内存使用2个G,修改为1个G,修改nacos/bin目录的startup.cmd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmJqmjS0-1689676062274)(../%E8%AE%B2%E4%B9%89/assets/1672029189009.png)]

然后打开三个cmd窗口,分别启动三个nacos节点,不需要带参数,默认是集群启动方式,也可以双击运行

startup.cmd

看到以下提示表示启动成功

INFO Nacos started successfully in cluster mode. use external storage
2.5.nginx反向代理
  1. 下载nginx安装包:

  2. 解压到任意非中文目录下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8EJZC3t-1689676062276)(assets/image-20210410103322874.png)]

  1. 修改conf/nginx.conf文件,配置如下

    这里使用127.0.0.1不影响

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 {
        proxy_pass http://nacos-cluster;
    }
}

粘贴到http元素的内部位置都可以,不用删除以前的server配置

  1. 在命令行下输入:start nginx.exe启动nginx服务器,也可以双击运行,运行后查看任务管理器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILVIUeUi-1689676062277)(assets/image-20211117084534147.png)]

  2. 在浏览器访问:http://localhost/nacos即可。

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

2.6. Java代码的修改
  1. 修改userservice服务的bootstrap.yaml文件配置如下:
spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址
  1. 重新启动UserApplication微服务

  2. 在nacos管理页面创建新的配置管理:userservice.yaml文件

  3. 浏览器上访问

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OyYCTtJ8-1689676062279)(assets/image-20211120100122488.png)]

  4. 就会在mysql的nacos库的config_info表中出现上面的配置信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kZJCRM8-1689676062280)(assets/image-20211120100150694.png)]

    最终调用逻辑图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pcazsuLU-1689676062282)(assets/1665994489918.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个用于生成并启动Nacos容器的Docker命令。命令如下: ``` docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /root/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server ``` 解释一下这个命令的各个部分: - `docker run`:运行一个新的容器。 - `-d`:以后台守护进程模式运行容器。 - `-p 8848:8848`:将主机的8848端口映射到容器的8848端口,这样可以通过主机的8848端口访问Nacos服务。 - `-e MODE=standalone`:设置Nacos的运行模式为standalone,即单机模式。 - `-e PREFER_HOST_MODE=hostname`:设置Nacos的主机模式为hostname,这样在集群环境下,Nacos将使用主机名作为节点标识。 - `-v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties`:将主机上的`custom.properties`文件挂载到容器内的相应位置,可以根据需要进行自定义配置。 - `-v /root/nacos/logs:/home/nacos/logs`:将主机上的日志目录挂载到容器内的相应位置,方便查看和管理日志文件。 - `--restart always`:设置容器始终自动重启。 - `--name nacos`:给容器指定一个名称为nacos。 - `nacos/nacos-server`:使用Nacos官方提供的镜像。 执行此命令后,Docker将下载并运行Nacos镜像,并将主机的8848端口映射到容器的8848端口。你可以通过访问`http://localhost:8848/nacos`来验证Nacos是否成功启动。 请注意,如果你已经有一个名为nacos的容器运行中,你需要先停止并删除它,然后再运行上述命令。可以使用以下命令停止和删除容器: ``` docker stop nacos docker rm nacos ``` 这样就可以生成并启动Nacos容器了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值