练竹园何平安

SpringCloud微服务学习笔记(一)【介绍,Eureka,Ribbon,Nacos】

Toretto·2023-09-24 17:07·141 次阅读

SpringCloud微服务学习笔记(一)【介绍,Eureka,Ribbon,Nacos】

微服务介绍#

用于开发大型项目时,将所有代码都放在一个项目中会增加压力,而且单体架构的并发数也有限,占用的线程多的时候就不行了。这时就需要用到微服务分布式开发。

单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单,当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。

但随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:

  • 团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。

  • 系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。

  • 系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。

 

微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:

  • 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。

  • 团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)

  • 服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响

 

SpringCloud依托于SpringBoot的自动装配能力,大大降低了其项目搭建、组件使用的成本。对于没有自研微服务组件能力的中小型企业,使用SpringCloud全家桶来实现微服务开发可以说是最合适的选择了! Spring Cloud

目前SpringCloud最新版本为2022.0.x版本,对应的SpringBoot版本为3.x版本,但它们全部依赖于JDK17,目前在企业中使用相对较少。

SpringCloud版本 SpringBoot版本
2022.0.x aka Kilburn 3.0.x
2021.0.x aka Jubilee 2.6.x, 2.7.x (Starting with 2021.0.3)
2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3)
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

因此,我们推荐使用次新版本:Spring Cloud 2021.0.x以及Spring Boot 2.7.x版本。JDK为11

微服务的一些模块:

本项目的源文件使用的是黑马程序员的2021版SpringCloud微服务教程的资料!!!springcloud版本为Hoxton,springboot版本为2.3.9

一个查看自己项目springboot和spring版本的测试类:

public class App {
    public static void main(String[] args) {
        String springVersion = SpringVersion.getVersion();
        String springBootVersion = SpringBootVersion.getVersion();
        System.out.println("Spring版本:"+springVersion+"\nSpringBoot版本:"+springBootVersion);
    }
 
}

服务拆分#

原则:

跨模块的查询不同数据库的例子:

通过在order里查询orderid返回order的数据,其中包括user的数据,然而user-server的数据库和模块都是与order-server单独分开的,这时就需要用到RestTemplate和它的getForObject方法了。

OrderApplication:

/**
     * 创建RestTemplate并注入bean
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

OderService:

public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发送http请求,查询用户
        String url= "http://userservice/user/"+ order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

Eureka#

 Eureka与消费者和提供者的关系

Eureka 采用 CS(Client/Server,客户端/服务器) 架构,它包括以下两大组件:

  • Eureka Server:Eureka 服务注册中心,主要用于提供服务注册功能。当微服务启动时,会将自己的服务注册到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到。
  • Eureka Client:Eureka 客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒),这就确保了调用服务的稳定安全性,确认那个server服务没有死。

搭建Eureka服务#

新建一个Maven项目模块(eureka-server),在pom文件里添加eureka服务端的坐标:

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

再在main里面创建一个启动类,启动类上加上@EnableEurekaServer和@SpringBootApplication注解:

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

添加application.yml配置文件:

server:
  port: 10086
spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

这时启动eureka启动类,在浏览器输入localhost:10086展示出spring Eureka的网站搭建成功

Eureka注册中心#

在user-service和order-service项目模块里的pom里添加client的坐标:

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

user-service和order-service里的application.yml添加配置:

spring:
  application:
    name: user/orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

再复制一个UserApplication,在修改选项里找到添加VM选项,输入-Dserver.port=8082,意思就是把它的端口号设置为8082,这是IDEA的高级功能。

这时Spring Eureka的网站上实例的UserService的数量就变成2了:

服务发现

直接在RestTemplate上添加@LoadBalanced注解

Ribbon#

原理#

使用#

方法一:针对order服务的全部

在OrderApplication里添加负载均衡的方法:

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }

这时再去多次访问查询功能,可以发现UserApplication的两个实例都有被访问的日志。

方法二:针对特定服务

在application.yml里添加:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则

饥饿加载#

Ribbon的默认为懒加载,第一次加载后会存在内存中,之后再加载就不用加载了。而饥饿加载会在项目启动时就加载了,第一次访问都不用加载了。

在application.yml里添加

ribbon:
  eager-load:
    enabled: true #开启饥饿加载
    clients:  #指定服务名称
      - userservice

Nacos#

安装和入门#

Eureka的升级版,而且还是阿里巴巴的产品,支持国产~github上可以下载,黑马的资料里也有,我选用的版本是2.2.3

nacos会占用8848端口(当然也可以修改)

进入bin目录,然后执行命令即可:

startup.cmd -m standalone

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

更详细的教程参考:Nacos 安装教程(史上最详细保姆级教程)_nacos安装-CSDN博客

父工程的pom里引入nacos:

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

客户端(user-server和order-server)引入客户端依赖,并去掉原来的eureka依赖

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改application.yml:将原来的eureka配置注释掉,再在spring:下添加配置:

  cloud:
    nacos:
      server-addr: localhost:8848

修改完后记得重新编译运行下pom.xml,然后再启动项目,进入localhost:8848:

服务集群,Nacos负载均衡和环境隔离#

通常一个服务端口断了都是先在本地替换另一个服务,而不是去其他ip调用服务,这时就需要使用集群来区别不同的地域IP了。添加服务集群属性:

在nacos:下添加:

discovery:
  cluster-name: SH

这时这个项目集群就属于SH了。

有了集群就可以修改负载均衡了,我要想order的集群向user对应的集群优先请求(比如我的order配置的集群为重庆,那我发送的请求就优先从重庆集群的user中获取)。将order/application.yml原来的ribbon配置修改为:

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

根据权重负载均衡,有些性能好的端口服务就可以多承担几次请求,差的就少一些,这时就需要设置权重了。在Nacos控制台里服务实例里的详细找到一个端口服务的编辑,里面可以修改权重:

环境隔离,就是隔离不同版本和服务的东西,设计中可以用可以不用。先新建一个命名空间,(Nacos默认会生成一个public的命名空间):

然后再在order的application.yml里配置命名空间ID:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos ip
      discovery:
        cluster-name: CQ
        namespace: devKaiFaHuanJing

这时用order再去请求就会报错,因为它们已经是两个世界的人了......

Nacos注册中心原理

Nacos配置管理#

简单说就是方便管理配置,假如以后要修改 application的配置,就不要一个一个去修改了,直接统一修改而且还不需要重启,直接就是热更新。

在Nacos配置管理的配置列表里新建一个配置并发布:(ID命名也是有规矩的,看等下的代码就知道了)

对了上图的dateformat前面的空格打多了,只有两个,我找了一下午的bug。

配置获取步骤:

所以先在recoures创建bootstrap.yml,启动springboot时配置文件的优先级会高于application.yml(PS:在springcloud 的版本高于2020.x时会默认禁用bootstrap,需要先在pom里引入spring-cloud-alibaba-bootstrap 的依赖)。先在userservice 里引入maven坐标:

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

然后再在bootstrap.yml里配置:

spring:
  application:
    name: userservice
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
      config:
        file-extension: yaml #文件后缀名

然后在UserController里面编写一段时间显示的接口:

@Value("${pattern.dateformat}")
    private String dateformat;

@GetMapping("/now")
    public String now(){
        //格式化返回当前时间
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }

通过@Value 读取配置时实现热更新:如果是通过 @Value 来读取配置的,此时只需在使用 @Value 注入的变量所在类上添加注解 @RefreshScope 即可,此时你在 nacos 配置中心修改配置并发布后,可以发现服务能自动接收到一些更新信息,类似下图,此时也就实现了配置热更新,此时再访问微服务的接口,可以看到返回的信息已经发生了改变。或者使用 @ConfigurationProperties 来读取配置时,微服务读取配置中心的配置可以自动实现热更新,无需进行其他操作。

nacos 集群搭建#

在测试环境下可以以单体模式启动 nacos ,但是 Nacos 在生产环境下都是部署为集群状态的。

搭建集群的基本步骤:

  1. 搭建数据库,初始化数据库表结构
  2. 下载nacos安装包,修改nacos配置,启动nacos集群
  3. 启动nginx作为反向代理

下面我们搭建一个以 Nginx 作为负载均衡,nacos 有三个节点的集群,三个nacos节点的 ip 都是 127.0.0.1,端口分别为8845、8846、8847。架构图如下:

Nacos 默认是将数据存储在内嵌数据库 Derby 中的,该数据库不属于生产可用的数据库,官方推荐的最佳实践是使用带有主从的高可用数据库集群。

下面我们只以单点的数据库为例来搭建。首先新建一个 mysql 数据库,命名为nacos,而后导入下面的SQL:

MySQL
 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   */
/*   表名称 = 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   */
/*   表名称 = 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   */
/*   表名称 = 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   */
/*   表名称 = 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_config   */
/*   表名称 = 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_config   */
/*   表名称 = 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_config   */
/*   表名称 = 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');

配置 nacos#

下载 nacos 安装包并解压后即安装完成,下面进行 nacos 集群的配置。

进入 nacos 安装目录的 conf 目录下,复制配置文件 cluster.conf.example 并重命名为 cluster.conf,给文件 cluster.conf 添加以下内容:

  1. 127.0.0.1:8845
  2. 127.0.0.1.8846
  3. 127.0.0.1.8847

类似如下:

 

然后继续修改 conf/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=123456
复制代码

以此一个 nacos 节点就已经配置完成,只需将 nacos 复制三份,然后分别修改三个文件夹中的application.properties,将 server.port 分别修改为 8845、8846、8847 即可。

分别启动这三个 nacos 节点即可,直接双击 bin/startup.cmd 文件即可启动,启动结果如下:

 

 

启动Nginx作为反向代理#

上述步骤中启动 nacos 集群后,即可启动一个 Nginx 作为反向代理,nacos 客户端需要访问连接 nacos 服务端时,只需访问 Nginx 的服务即可。

Nginx 配置如下:

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://localhost/nacos 即可访问到 nacos 集群,Nginx 会将接收到的请求负载均衡到三个 nacos 节点当中。

比如 nacos 节点需访问 nacos 集群时,项目配置文件如下:

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址

 

 

posted @   何平安  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
浏览器标题切换end
点击右上角即可分享
微信分享提示
目录