• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringCloud --- Nacos注册心、配置管理

武飞扬头像
乌云不要说话
帮助2

一、Nacos注册中心

1.1、认识和安装Nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

学新通

  

1.2、服务注册到nacos

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

主要差异在于:

  • 依赖不同

  • 服务地址不同

1)引入依赖


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

  1.  
    <dependency>
  2.  
    <groupId>com.alibaba.cloud</groupId>
  3.  
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  4.  
    <version>2.2.6.RELEASE</version>
  5.  
    <type>pom</type>
  6.  
    <scope>import</scope>
  7.  
    </dependency>

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

  1.  
    <dependency>
  2.  
    <groupId>com.alibaba.cloud</groupId>
  3.  
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4.  
    </dependency>

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


2)配置nacos地址


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

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    server-addr: localhost:8848

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


3)重启


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

学新通

1.3、服务分级存储模型

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

  • 127.0.0.1:8081

  • 127.0.0.1:8082

  • 127.0.0.1:8083

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

  • 127.0.0.1:8081,在上海机房

  • 127.0.0.1:8082,在上海机房

  • 127.0.0.1:8083,在杭州机房

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

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

学新通

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如: 学新通 

杭州机房内的order-service应该优先访问同机房的user-service。  

1.3.1、给user-service配置集群

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

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    server-addr: localhost:8848
  5.  
    discovery:
  6.  
    cluster-name: HZ # 集群名称

重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

学新通

我们再次复制一个user-service启动配置,添加属性:  

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

配置如图所示:

学新通

启动UserApplication3后再次查看nacos控制台:

学新通

1.3.2、同集群优先的负载均衡

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

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

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

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

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    server-addr: localhost:8848
  5.  
    discovery:
  6.  
    cluster-name: HZ # 集群名称

  

2)修改负载均衡规则

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

  1.  
    userservice:
  2.  
    ribbon:
  3.  
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

1.4、权重配置

实际部署中会出现这样的场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

学新通

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

学新通

注意:如果权重修改为0,则该实例永远不会被访问

1.5、环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace

  • namespace下可以有group、service等

  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见

学新通

1.5.1、创建namespace

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

学新通

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

学新通

然后,填写表单:

学新通

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

学新通

1.5.2、给微服务配置namespace

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

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

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    server-addr: localhost:8848
  5.  
    discovery:
  6.  
    cluster-name: HZ
  7.  
    namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

 重启order-service后,访问控制台,可以看到下面的结果:

学新通

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

学新通

1.6、Nacos与Eureka的区别

Nacos的服务实例分为两种l类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    discovery:
  5.  
    ephemeral: false # 设置为非临时实例

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

学新通

Nacos与eureka的共同点

  • 都支持服务注册和服务拉取

  • 都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别

  • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

  • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除

  • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

二、Nacos配置管理

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

2.1、统一配置管理

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

学新通

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

2.1.1、在nacos中添加配置文件

如何在nacos中管理配置呢?

学新通

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

学新通

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

2.1.2、从微服务拉取配置

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

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

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

学新通

1)引入nacos-config依赖


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

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

2)添加bootstrap.yaml


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

  1.  
    spring:
  2.  
    application:
  3.  
    name: userservice # 服务名称
  4.  
    profiles:
  5.  
    active: dev #开发环境,这里是dev
  6.  
    cloud:
  7.  
    nacos:
  8.  
    server-addr: localhost:8848 # Nacos地址
  9.  
    config:
  10.  
    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配置:

学新通

完整代码:  

  1.  
    package cn.itcast.user.web;
  2.  
     
  3.  
    import cn.itcast.user.pojo.User;
  4.  
    import cn.itcast.user.service.UserService;
  5.  
    import lombok.extern.slf4j.Slf4j;
  6.  
    import org.springframework.beans.factory.annotation.Autowired;
  7.  
    import org.springframework.beans.factory.annotation.Value;
  8.  
    import org.springframework.web.bind.annotation.*;
  9.  
     
  10.  
    import java.time.LocalDateTime;
  11.  
    import java.time.format.DateTimeFormatter;
  12.  
     
  13.  
    @Slf4j
  14.  
    @RestController
  15.  
    @RequestMapping("/user")
  16.  
    public class UserController {
  17.  
     
  18.  
    @Autowired
  19.  
    private UserService userService;
  20.  
     
  21.  
    @Value("${pattern.dateformat}")
  22.  
    private String dateformat;
  23.  
     
  24.  
    @GetMapping("now")
  25.  
    public String now(){
  26.  
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
  27.  
    }
  28.  
    // ...略
  29.  
    }
学新通

在页面访问,可以看到效果:

学新通

2.2、配置热更新

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

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

方式一


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

学新通


方式二


使用@ConfigurationProperties注解代替@Value注解。

在user-service服务中,添加一个类,读取patterrn.dateformat属性:

  1.  
    package cn.itcast.user.config;
  2.  
     
  3.  
    import lombok.Data;
  4.  
    import org.springframework.boot.context.properties.ConfigurationProperties;
  5.  
    import org.springframework.stereotype.Component;
  6.  
     
  7.  
    @Component
  8.  
    @Data
  9.  
    @ConfigurationProperties(prefix = "pattern")
  10.  
    public class PatternProperties {
  11.  
    private String dateformat;
  12.  
    }

在UserController中使用这个类代替@Value:

学新通

完整代码:

  1.  
    package cn.itcast.user.web;
  2.  
     
  3.  
    import cn.itcast.user.config.PatternProperties;
  4.  
    import cn.itcast.user.pojo.User;
  5.  
    import cn.itcast.user.service.UserService;
  6.  
    import lombok.extern.slf4j.Slf4j;
  7.  
    import org.springframework.beans.factory.annotation.Autowired;
  8.  
    import org.springframework.web.bind.annotation.GetMapping;
  9.  
    import org.springframework.web.bind.annotation.PathVariable;
  10.  
    import org.springframework.web.bind.annotation.RequestMapping;
  11.  
    import org.springframework.web.bind.annotation.RestController;
  12.  
     
  13.  
    import java.time.LocalDateTime;
  14.  
    import java.time.format.DateTimeFormatter;
  15.  
     
  16.  
    @Slf4j
  17.  
    @RestController
  18.  
    @RequestMapping("/user")
  19.  
    public class UserController {
  20.  
     
  21.  
    @Autowired
  22.  
    private UserService userService;
  23.  
     
  24.  
    @Autowired
  25.  
    private PatternProperties patternProperties;
  26.  
     
  27.  
    @GetMapping("now")
  28.  
    public String now(){
  29.  
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
  30.  
    }
  31.  
     
  32.  
    // 略
  33.  
    }
学新通

2.3、配置共享

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

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

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

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

下面我们通过案例来测试配置共享

添加一个环境共享配置


我们在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、服务本地同时出现相同属性时,优先级有高低之分:

学新通

2.4、搭建Nacos集群

Nacos生产环境下一定要部署为集群状态,部署方式:

1、集群结构图


官方给出的Nacos集群图:

学新通

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

我们计划的集群结构:

学新通 

三个nacos节点的地址:

节点 ip port
nacos1 192.168.150.1 8845
nacos2 192.168.150.1 8846
nacos3 192.168.150.1 8847

2、搭建集群


搭建集群的基本步骤:

  • 搭建数据库,初始化数据库表结构

  • 下载nacos安装包

  • 配置nacos

  • 启动nacos集群

  • nginx反向代理


2.1、初始化数据库

 

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

官方推荐的最佳实践是使用带有主从的高可用数据库集群

这里我们以单点的数据库为例来讲解。

首先新建一个数据库,命名为nacos,而后导入下面的SQL:

  1.  
    CREATE TABLE `config_info` (
  2.  
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  3.  
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  4.  
    `group_id` varchar(255) DEFAULT NULL,
  5.  
    `content` longtext NOT NULL COMMENT 'content',
  6.  
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  7.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  8.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  9.  
    `src_user` text COMMENT 'source user',
  10.  
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  11.  
    `app_name` varchar(128) DEFAULT NULL,
  12.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  13.  
    `c_desc` varchar(256) DEFAULT NULL,
  14.  
    `c_use` varchar(64) DEFAULT NULL,
  15.  
    `effect` varchar(64) DEFAULT NULL,
  16.  
    `type` varchar(64) DEFAULT NULL,
  17.  
    `c_schema` text,
  18.  
    PRIMARY KEY (`id`),
  19.  
    UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
  20.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
  21.  
     
  22.  
    /******************************************/
  23.  
    /* 数据库全名 = nacos_config */
  24.  
    /* 表名称 = config_info_aggr */
  25.  
    /******************************************/
  26.  
    CREATE TABLE `config_info_aggr` (
  27.  
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  28.  
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  29.  
    `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  30.  
    `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  31.  
    `content` longtext NOT NULL COMMENT '内容',
  32.  
    `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  33.  
    `app_name` varchar(128) DEFAULT NULL,
  34.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  35.  
    PRIMARY KEY (`id`),
  36.  
    UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
  37.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
  38.  
     
  39.  
     
  40.  
    /******************************************/
  41.  
    /* 数据库全名 = nacos_config */
  42.  
    /* 表名称 = config_info_beta */
  43.  
    /******************************************/
  44.  
    CREATE TABLE `config_info_beta` (
  45.  
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  46.  
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  47.  
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  48.  
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  49.  
    `content` longtext NOT NULL COMMENT 'content',
  50.  
    `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  51.  
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  52.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  53.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  54.  
    `src_user` text COMMENT 'source user',
  55.  
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  56.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  57.  
    PRIMARY KEY (`id`),
  58.  
    UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
  59.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
  60.  
     
  61.  
    /******************************************/
  62.  
    /* 数据库全名 = nacos_config */
  63.  
    /* 表名称 = config_info_tag */
  64.  
    /******************************************/
  65.  
    CREATE TABLE `config_info_tag` (
  66.  
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  67.  
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  68.  
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  69.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  70.  
    `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  71.  
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  72.  
    `content` longtext NOT NULL COMMENT 'content',
  73.  
    `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  74.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  75.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  76.  
    `src_user` text COMMENT 'source user',
  77.  
    `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  78.  
    PRIMARY KEY (`id`),
  79.  
    UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
  80.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
  81.  
     
  82.  
    /******************************************/
  83.  
    /* 数据库全名 = nacos_config */
  84.  
    /* 表名称 = config_tags_relation */
  85.  
    /******************************************/
  86.  
    CREATE TABLE `config_tags_relation` (
  87.  
    `id` bigint(20) NOT NULL COMMENT 'id',
  88.  
    `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  89.  
    `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  90.  
    `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  91.  
    `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  92.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  93.  
    `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  94.  
    PRIMARY KEY (`nid`),
  95.  
    UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  96.  
    KEY `idx_tenant_id` (`tenant_id`)
  97.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
  98.  
     
  99.  
    /******************************************/
  100.  
    /* 数据库全名 = nacos_config */
  101.  
    /* 表名称 = group_capacity */
  102.  
    /******************************************/
  103.  
    CREATE TABLE `group_capacity` (
  104.  
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  105.  
    `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  106.  
    `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  107.  
    `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  108.  
    `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  109.  
    `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  110.  
    `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  111.  
    `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  112.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  113.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  114.  
    PRIMARY KEY (`id`),
  115.  
    UNIQUE KEY `uk_group_id` (`group_id`)
  116.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
  117.  
     
  118.  
    /******************************************/
  119.  
    /* 数据库全名 = nacos_config */
  120.  
    /* 表名称 = his_config_info */
  121.  
    /******************************************/
  122.  
    CREATE TABLE `his_config_info` (
  123.  
    `id` bigint(64) unsigned NOT NULL,
  124.  
    `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  125.  
    `data_id` varchar(255) NOT NULL,
  126.  
    `group_id` varchar(128) NOT NULL,
  127.  
    `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  128.  
    `content` longtext NOT NULL,
  129.  
    `md5` varchar(32) DEFAULT NULL,
  130.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  131.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  132.  
    `src_user` text,
  133.  
    `src_ip` varchar(50) DEFAULT NULL,
  134.  
    `op_type` char(10) DEFAULT NULL,
  135.  
    `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  136.  
    PRIMARY KEY (`nid`),
  137.  
    KEY `idx_gmt_create` (`gmt_create`),
  138.  
    KEY `idx_gmt_modified` (`gmt_modified`),
  139.  
    KEY `idx_did` (`data_id`)
  140.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
  141.  
     
  142.  
     
  143.  
    /******************************************/
  144.  
    /* 数据库全名 = nacos_config */
  145.  
    /* 表名称 = tenant_capacity */
  146.  
    /******************************************/
  147.  
    CREATE TABLE `tenant_capacity` (
  148.  
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  149.  
    `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  150.  
    `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  151.  
    `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  152.  
    `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  153.  
    `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  154.  
    `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  155.  
    `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  156.  
    `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  157.  
    `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  158.  
    PRIMARY KEY (`id`),
  159.  
    UNIQUE KEY `uk_tenant_id` (`tenant_id`)
  160.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
  161.  
     
  162.  
     
  163.  
    CREATE TABLE `tenant_info` (
  164.  
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  165.  
    `kp` varchar(128) NOT NULL COMMENT 'kp',
  166.  
    `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  167.  
    `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  168.  
    `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  169.  
    `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  170.  
    `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  171.  
    `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  172.  
    PRIMARY KEY (`id`),
  173.  
    UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  174.  
    KEY `idx_tenant_id` (`tenant_id`)
  175.  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
  176.  
     
  177.  
    CREATE TABLE `users` (
  178.  
    `username` varchar(50) NOT NULL PRIMARY KEY,
  179.  
    `password` varchar(500) NOT NULL,
  180.  
    `enabled` boolean NOT NULL
  181.  
    );
  182.  
     
  183.  
    CREATE TABLE `roles` (
  184.  
    `username` varchar(50) NOT NULL,
  185.  
    `role` varchar(50) NOT NULL,
  186.  
    UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
  187.  
    );
  188.  
     
  189.  
    CREATE TABLE `permissions` (
  190.  
    `role` varchar(50) NOT NULL,
  191.  
    `resource` varchar(255) NOT NULL,
  192.  
    `action` varchar(8) NOT NULL,
  193.  
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
  194.  
    );
  195.  
     
  196.  
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
  197.  
     
  198.  
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
学新通

2.2、下载nacos

 

nacos在GitHub上有下载地址:Tags · alibaba/nacos · GitHub,可以选择任意版本下载。

本例中才用1.4.1版本:

学新通


2.3、配置Nacos

 

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

学新通

目录说明:

  • bin:启动脚本

  • conf:配置文件

进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf: 学新通 

然后添加内容:

  1.  
    127.0.0.1:8845
  2.  
    127.0.0.1.8846
  3.  
    127.0.0.1.8847

然后修改application.properties文件,添加数据库配置

  1.  
    spring.datasource.platform=mysql
  2.  
     
  3.  
    db.num=1
  4.  
     
  5.  
    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
  6.  
    db.user.0=root
  7.  
    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文件,配置如下:

  1.  
    upstream nacos-cluster {
  2.  
    server 127.0.0.1:8845;
  3.  
    server 127.0.0.1:8846;
  4.  
    server 127.0.0.1:8847;
  5.  
    }
  6.  
     
  7.  
    server {
  8.  
    listen 80;
  9.  
    server_name localhost;
  10.  
     
  11.  
    location /nacos {
  12.  
    proxy_pass http://nacos-cluster;
  13.  
    }
  14.  
    }

而后在浏览器访问:http://localhost/nacos即可。

代码中application.yml文件配置如下:

  1.  
    spring:
  2.  
    cloud:
  3.  
    nacos:
  4.  
    server-addr: localhost:80 # Nacos地址

2.6、优化

  • 实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.

  • Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiaigic
系列文章
更多 icon
同类精品
更多 icon
继续加载