Spring Cloud——注册中心

介绍

什么是注册中心?

主要负责服务的注册与发现,确保服务之间的通信顺畅,具体来说,注册中心有以下主要功能:‌服务注册、服务发现、服务健康检查。

服务注册:

服务提供者在启动时会向注册中心注册自身服务的信息,包括IP地址和端口等。这样,其他服务就可以通过注册中心找到并连接到这些服务,并且定期向注册中心发送心跳,来确保自己的健康状态。

服务发现:

服务消费者在启动时会向注册中心订阅所需的服务,注册中心会将服务节点列表返回给消费者,消费者将这些信息缓存在本地内存中,并根据需要选择服务进行调用,服务发现分为两种方式:客户端服务发现、服务器服务发现。

  • 客户端服务发现: 

客户端的服务发现流程是:首先在服务提供者启动的时候都会向注册中心注册自己的服务信息,服务消费者启动时也会向注册中心,待消费者想要使用注册中心的服务实例时,注册中心会返回给服务消费者服务实例列表,然后服务消费者再根据自己指定的负载均衡算法,例如轮询、加权轮询、随机、IP 哈希 等方式,从列表里选定一个具体的服务实例,之后才向这个选定的服务实例发起实际的服务请求。

  • 服务器服务发现:

 服务器端的服务发现流程是:当服务消费者想要使用某项服务时,它把请求发送给负载均衡器(或者 API 网关)。随后,负载均衡器向注册中心发起服务发现请求,查询对应的服务实例列表。注册中心收到请求后,返回匹配的服务实例列表给负载均衡器。接着,负载均衡器利用诸如轮询、加权轮询、随机、一致性哈希等负载均衡算法,从实例列表里选出一个合适的服务实例,最终将服务消费者的请求转发到该具体的服务实例上。

 服务健康检查:

注册中心会定期接收来自服务提供者的心跳信息,以确认服务的存活状态。如果服务提供者发生故障或下线,注册中心会将该服务从服务注册表中移除并及时通知服务消费者,确保服务的可用性。

常用的微服务注册中心

  • Eureka

    • 简介:Netflix 开源的一款服务治理框架,基于 RESTful API 构建,具备高可用、分区容错的特性。它采用了客户端拉取的方式,服务实例定时向 Eureka Server 发送心跳包,维持自己的 “存活” 状态,服务消费者从 Eureka Server 拉取服务实例列表,实现服务发现。

    • 优势:使用简单,社区生态丰富,和 Netflix 的其他微服务框架集成度高,适合快速搭建微服务体系,对中小规模项目十分友好。

  • Consul

    • 简介:由 HashiCorp 推出,功能极为丰富,集服务发现、配置管理、健康检查于一体。它支持多数据中心,使用 Raft 一致性算法来保证数据的一致性和高可用性 ,既可以采用服务端推送的方式通知服务消费者,也支持客户端主动查询。

    • 优势:因其强大的多数据中心支持能力,特别适合大型分布式系统,尤其是跨地域、跨机房部署的复杂业务场景,安全性与稳定性表现出色。

  • ZooKeeper

    • 简介:Apache 的老牌分布式协调服务项目,基于 ZAB(ZooKeeper Atomic Broadcast)协议保障数据一致性。众多开源项目都依赖它进行分布式场景下的节点协调、选举、配置同步等工作,微服务注册中心只是其应用场景之一。

    • 优势:成熟稳定,历经大量生产环境的考验,有着庞大的社区基础,在分布式系统协调领域底蕴深厚,不过相对而言,使用门槛稍高。

  • Nacos

    • 简介:阿里巴巴开源的一站式微服务解决方案中的重要组件,融合了服务发现、配置管理等功能。它支持 AP 和 CP 两种模式切换,具备动态配置更新、流量治理等特性,能轻松对接 Spring Cloud 等主流微服务框架。

    • 优势:对国内开发者更友好,中文文档齐全,和阿里系技术适配度高,上手快,尤其适合基于 Spring Cloud 生态搭建的微服务项目。

Nacos的安装

环境:Linux:Centos7 MySQL8.X

由于我们的Nacos注册中心需要存储服务实例,所以我们要先再Docker里面配置mysql,并为其设置容器网络,因为Nacos需要和我们的Mysql再同一个网络里,要不然启动会报错。

1在Docker安装MySQL

如果已经安装了MySQL的可以跳过此步骤

首先再虚拟机的root目录下创建一个mysql文件夹,然后再这个文件夹里面创建conf和init文件夹,用于Docker的目录挂载,或者也可以再物理机上创建这个文件夹配置好了再上传到虚拟机。

然后在conf文件夹里面创建my.cnf文件,再次文件内写入一下内容:

[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

接着到init目录下创建test.sql脚本,填写下面内容:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;USE `test`;

然后用MobaXterm上传到虚拟机

然后我们创建一个通用网络,注意:需确保Docker已经按照,并且正常启动!!!

#创建网络
docker network create nacos-net
#查看是否创建成功
docker network list

使用下面的命令来安装MySQL,并创建MySQL容器,设置容器的网络

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v /root/mysql/data:/var/lib/mysql \-v /root/mysql/conf:/etc/mysql/conf.d \-v /root/mysql/init:/docker-entrypoint-initdb.d \--network nacos-net\mysql

然后在我们的物理端连接MySQL,如果你是复制的我的docker创建mysql容器命令的话:用户是root,密码是123,主机填写虚拟机的IP,注意:如果有防火墙的话可以开放3306端口,或者关闭防火墙

可以看到,我这里已经正常连接,并且初始化数据库也成功了

2.在Docker里安装Naocs

2.1在我们第一步安装的MySQL中导入Nacos数据库

在我们物理机上执行以下命令,或者可以在Nacos官网复制初始化Nacos数据库的脚本命令:Nacos使用自定义数据库的初始化脚本

-- 导出 nacos 的数据库结构
DROP DATABASE IF EXISTS `nacos`;
CREATE DATABASE IF NOT EXISTS `nacos` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `nacos`;-- 导出  表 nacos.config_info 结构
DROP TABLE IF EXISTS `config_info`;
CREATE TABLE IF NOT EXISTS `config_info` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin DEFAULT NULL,`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,`type` varchar(64) COLLATE utf8_bin DEFAULT NULL,`c_schema` text COLLATE utf8_bin,`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info';-- 正在导出表  nacos.config_info 的数据:~0 rows (大约)
DELETE FROM `config_info`;-- 导出  表 nacos.config_info_aggr 结构
DROP TABLE IF EXISTS `config_info_aggr`;
CREATE TABLE IF NOT EXISTS `config_info_aggr` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',`content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='增加租户字段';-- 正在导出表  nacos.config_info_aggr 的数据:~0 rows (大约)
DELETE FROM `config_info_aggr`;-- 导出  表 nacos.config_info_beta 结构
DROP TABLE IF EXISTS `config_info_beta`;
CREATE TABLE IF NOT EXISTS `config_info_beta` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_beta';-- 正在导出表  nacos.config_info_beta 的数据:~0 rows (大约)
DELETE FROM `config_info_beta`;-- 导出  表 nacos.config_info_tag 结构
DROP TABLE IF EXISTS `config_info_tag`;
CREATE TABLE IF NOT EXISTS `config_info_tag` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_id',`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',`md5` varchar(32) COLLATE utf8_bin 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 COLLATE utf8_bin COMMENT 'source user',`src_ip` varchar(50) COLLATE utf8_bin 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=utf8mb3 COLLATE=utf8_bin COMMENT='config_info_tag';-- 正在导出表  nacos.config_info_tag 的数据:~0 rows (大约)
DELETE FROM `config_info_tag`;-- 导出  表 nacos.config_tags_relation 结构
DROP TABLE IF EXISTS `config_tags_relation`;
CREATE TABLE IF NOT EXISTS `config_tags_relation` (`id` bigint NOT NULL COMMENT 'id',`tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`nid` bigint 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=utf8mb3 COLLATE=utf8_bin COMMENT='config_tag_relation';-- 正在导出表  nacos.config_tags_relation 的数据:~0 rows (大约)
DELETE FROM `config_tags_relation`;-- 导出  表 nacos.group_capacity 结构
DROP TABLE IF EXISTS `group_capacity`;
CREATE TABLE IF NOT EXISTS `group_capacity` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int 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=utf8mb3 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';-- 正在导出表  nacos.group_capacity 的数据:~0 rows (大约)
DELETE FROM `group_capacity`;-- 导出  表 nacos.his_config_info 结构
DROP TABLE IF EXISTS `his_config_info`;
CREATE TABLE IF NOT EXISTS `his_config_info` (`id` bigint unsigned NOT NULL,`nid` bigint unsigned NOT NULL AUTO_INCREMENT,`data_id` varchar(255) COLLATE utf8_bin NOT NULL,`group_id` varchar(128) COLLATE utf8_bin NOT NULL,`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',`content` longtext COLLATE utf8_bin NOT NULL,`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`src_user` text COLLATE utf8_bin,`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL,`op_type` char(10) COLLATE utf8_bin DEFAULT NULL,`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',`encrypted_data_key` text COLLATE utf8_bin NOT NULL 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=utf8mb3 COLLATE=utf8_bin COMMENT='多租户改造';-- 正在导出表  nacos.his_config_info 的数据:~0 rows (大约)
DELETE FROM `his_config_info`;-- 导出  表 nacos.permissions 结构
DROP TABLE IF EXISTS `permissions`;
CREATE TABLE IF NOT EXISTS `permissions` (`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`resource` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,`action` varchar(8) COLLATE utf8mb4_general_ci NOT NULL,UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表  nacos.permissions 的数据:~0 rows (大约)
DELETE FROM `permissions`;-- 导出  表 nacos.roles 结构
DROP TABLE IF EXISTS `roles`;
CREATE TABLE IF NOT EXISTS `roles` (`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表  nacos.roles 的数据:~1 rows (大约)
DELETE FROM `roles`;
INSERT INTO `roles` (`username`, `role`) VALUES('nacos', 'ROLE_ADMIN');-- 导出  表 nacos.tenant_capacity 结构
DROP TABLE IF EXISTS `tenant_capacity`;
CREATE TABLE IF NOT EXISTS `tenant_capacity` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',`max_history_count` int 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=utf8mb3 COLLATE=utf8_bin COMMENT='租户容量信息表';-- 正在导出表  nacos.tenant_capacity 的数据:~0 rows (大约)
DELETE FROM `tenant_capacity`;-- 导出  表 nacos.tenant_info 结构
DROP TABLE IF EXISTS `tenant_info`;
CREATE TABLE IF NOT EXISTS `tenant_info` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',`tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',`tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint NOT NULL COMMENT '创建时间',`gmt_modified` bigint 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=utf8mb3 COLLATE=utf8_bin COMMENT='tenant_info';-- 正在导出表  nacos.tenant_info 的数据:~0 rows (大约)
DELETE FROM `tenant_info`;-- 导出  表 nacos.users 结构
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,`password` varchar(500) COLLATE utf8mb4_general_ci NOT NULL,`enabled` tinyint(1) NOT NULL,PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 正在导出表  nacos.users 的数据:~1 rows (大约)
DELETE FROM `users`;
INSERT INTO `users` (`username`, `password`, `enabled`) VALUES('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;

 2.2.创建一个nacos文件夹,然后在你们创建一个custom.env的文件,我们在这个文件里面配置一些Nacos与MySQL连接的一些信息

注意:此文件需要把host设置成你自己的,其他的也是,如果跟我不一样的地方

PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=192.168.181.32
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

 配置好之后上传到虚拟机上面,还是上传到/root下,并且操作的时候自己所在的目录也是/root

2.3使用Docker命令安装并创建Nacos容器

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
--network nacos-net \
nacos/nacos-server:v2.1.0-slim

2.4查看nacos是否启动成功

docker logs -f nacos

2.5在物理机的浏览器上访问Nacos,访问的地址是:你的IP地址:8848/nacos

注意:默认账号密码都是nacos

下图就是登录进来的页面

 Spring Cloud融合Nacos使用

服务注册

1.创建项目,直接创建spring boot项目,什么都不用选创建就行

2.删除不必要的src,因为我们创建的是微服务项目

3.修改pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.waitforme</groupId><!--这个换成你自己的--><artifactId>nacosDemo</artifactId><!--这个换成你自己的--><packaging>pom</packaging><version>1.0</version><name>nacosDemo</name><description>nacosDemo</description><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><org.projectlombok.version>1.18.20</org.projectlombok.version><spring-cloud.version>2021.0.3</spring-cloud.version><spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version><hutool.version>5.8.11</hutool.version></properties><!-- 对依赖包进行管理 --><dependencyManagement><dependencies><!--spring cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring cloud alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency></dependencies></dependencyManagement><dependencies><!-- lombok 管理 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source> <!-- depending on your project --><target>17</target> <!-- depending on your project --></configuration></plugin></plugins></pluginManagement></build></project>

 4.创建几个微服务模块,模拟多模块

 按照这个方式多创建几个子模块

5.在创建的所有子模块中添加Nacos依赖

直接在properties节点后面填入一下代码

<dependencies><!--引入父模块--><dependency><groupId>com.waitforme</groupId><!--这个换成你自己的父模块位置--><artifactId>nacosDemo</artifactId><!--这个换成你自己的父模块名--><version>1.0</version><!--这个换成你自己的父模块版本--></dependency><!--web--><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></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

6.先为一个子模块创建启动类并编写application.yaml文件

启动类:

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

yaml配置:

server:port: 8081 #服务启动的端口
spring:application:name: cloudDemo1 #微服务名称cloud:nacos:server-addr: 192.168.181.31:8848 #这里配置你自己的所在nacos虚拟机的IP地址,端口号默认是8848,如果你改了这里也要改
logging:level:com.waitforme: debug #日志级别pattern:dateformat: HH:mm:ss:SSS #日期格式file:path: "logs/${spring.application.name}" #日志文件保存目录

 注意:yaml配置文件有严格的缩进要求,如果多一个空格少一个空格都会报错

7.启动测试

添加启动方式

下滑找到spring boot点击

 

 编写服务启动项的一些东西

 启动服务,如果没有报错就在Nacos控制台查看服务是否已经注册上去

 8.为其他几个子模块按照上面的步骤进行配置,然后把各个子模块全部启动

注意:我们在为其他几个模块编写启动类和yaml配置的时候需要把他们区分开来,如:yaml中的服务名,端口号,java下面的包名,以及启动类名等等

编写完之后我不不用再手动添加服务启动项,之间点击右边的maven刷新一下就能出来了

再者我们为CloudDemo1这个服务复制一份,模拟一个服务多个实例的场景,右击CloudDemo1Application服务启动项选择Copy Configuration

配置好之后再次启动所有服务刷新Nacos控制台查看服务注册列表

服务发现

此处选择CloudDemo1作为服务提供者CloudDemo2作为服务消费者来演示这个案例,因为我们两个CloudDemo1的服务实例,所以还会演示负载均衡

注意:以下配置都是在CloudDemo2进行的

1.导入依赖

<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--hutool工具包-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>
</dependency>

2.配置Nacos地址

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

 3.实现服务发现并调用服务

接下来,服务消费者就可以去订阅CloudDemo1服务了。不过CloudDemo1有多个实例,而真正发起调用时只需要知道一个实例的地址,所以,服务消费者必须利用负载均衡的算法,从多个实例中挑选一个去访问。常见的负载均衡算法有:随机、轮询、IP的hash、最少访问等等,这里我们可以选择最简单的随机负载均衡。

3.1为CloudDemo1编写service和controller

service

package com.waitforme.clouddemo1.service;import java.util.List;public interface CloudDemo1Service {public List<Object> demo1List();
}

serviceImpl

package com.waitforme.clouddemo1.service.impl;import com.waitforme.clouddemo1.service.CloudDemo1Service;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
@Service
public class CloudDemo1ServiceImpl implements CloudDemo1Service {@Overridepublic List<Object> demo1List() {List<Object> list = new ArrayList<>();list.add("你好");list.add("你好,nacos");list.add("你好,微服务");return list;}
}

controller

package com.waitforme.clouddemo1.controller;import com.waitforme.clouddemo1.service.CloudDemo1Service;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/cloudDemo1")
@RequiredArgsConstructor
public class CloudDemo1Controller {private final CloudDemo1Service cloudDemo1Service;@GetMapping("/list")public List<Object> cloudDemoList() {System.out.println("我被调用了");return cloudDemo1Service.demo1List();}
}

3.2为cloudDemo2编写serivce和controller

service

package com.waitforme.clouddemo2.service;import java.util.List;public interface CloudDemo2Service {public List<Object> getDemo1List();
}

serviceImpl

package com.waitforme.clouddemo2.service.impl;import cn.hutool.core.util.RandomUtil;
import com.waitforme.clouddemo2.service.CloudDemo2Service;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.List;@Service
@RequiredArgsConstructor//为必要的类成员变量生成构造函数
public class CloudDemo2ServiceImpl implements CloudDemo2Service {private final RestTemplate restTemplate;private final DiscoveryClient discoveryClient;@Overridepublic List<Object> getDemo1List() {//发现cloudDemo1服务实例列表List<ServiceInstance> instances = discoveryClient.getInstances("cloudDemo1");//通过负载均衡,挑选其中一个服务实例ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));//发送请求获取cloudDemo1的数据ResponseEntity<List<Object>> response = restTemplate.exchange(instance.getUri() + "/cloudDemo1/list",//请求地址HttpMethod.GET,//请求方式null,//请求体new ParameterizedTypeReference<List<Object>>() {}//返回类型);System.out.println("服务消费者得到的响应:" + response.toString());//处理结果List<Object> list = null;if (response.getStatusCode().is2xxSuccessful()) {list = response.getBody();}return list;}
}

controller

package com.waitforme.clouddemo2.controller;import com.waitforme.clouddemo2.service.CloudDemo2Service;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/cloudDemo2")
@RequiredArgsConstructor
public class CloudDemo2Controller {private final CloudDemo2Service cloudDemo2Service;@GetMapping("/getDemo1")public Object get() {return cloudDemo2Service.getDemo1List();}
}

并在启动类上添加RestTemplate

@SpringBootApplication
public class CloudDemo2Application {public static void main(String[] args) {SpringApplication.run(CloudDemo2Application.class);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

3.3编写完配置之后启动,在浏览器访问测试

启动之后先把三个服务项的控制台清空

然后再浏览器访问cloudDemo2的接口:http://localhost:8082/cloudDemo2/getDemo1

 多刷新几次然后查看后台的输出,如:刷新3次

可以看出我们自己写的随机负载均衡生效了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS基础入门【2】

目录 一、知识复习 二、权重问题深入 2.1 同一个标签&#xff0c;携带了多个类名&#xff0c;有冲突&#xff1a; 2.2 !important标记 2.3 权重计算的总结 三、盒模型 3.1 盒子中的区域 3.2 认识width、height 3.3 认识padding 3.4 border 作业&#xff1a; 一、知识…

捋一捋相关性运算,以及DTD和NLP中的应用

捋一捋相关性运算&#xff0c;以及DTD和NLP中的应用 相关性和相干性,有木有傻傻分不清相关性数字信号的相关运算同维度信号的相关理解 相关--互相关--相干 回声消除过程如何套用这些知识相关性/相干性检测在DT中的应用时域的标量与向量结合的互相关方法适合block处理的频域相干…

Elasticsearch:normalizer

一、概述 ‌Elastic normalizer‌是Elasticsearch中用于处理keyword类型字段的一种工具&#xff0c;主要用于对字段进行规范化处理&#xff0c;确保在索引和查询时保持一致性。 Normalizer与analyzer类似&#xff0c;都是对字段进行处理&#xff0c;但normalizer不会对字段进…

go语言的成神之路-筑基篇-对文件的操作

目录 一、对文件的读写 Reader?接口 ?Writer接口 copy接口 bufio的使用 ioutil库? 二、cat命令 三、包 1. 包的声明 2. 导入包 3. 包的可见性 4. 包的初始化 5. 标准库包 6. 第三方包 ?7. 包的组织 8. 包的别名 9. 包的路径 10. 包的版本管理 四、go mo…

【入门】拐角III

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 用例输入 1 5 用例输出 1 5 5 5 5 55 4 4 4 45 4 3 3 35 4 3 2 25 4 3 2 1 来源 二维数组…

攻防世界 ics-06

开启场景 可以交互的按钮不是很多&#xff0c;没有什么有用信息&#xff0c;查看页面源代码找到了index.php &#xff0c;后面跟着“报表中心” 传参访问 /index.php 看到了参数 id1&#xff0c;用 burp 抓包爆破&#xff08;这里应该不是 sql 注入&#xff09; 2333 的长度与众…

VMware虚拟机安装银河麒麟操作系统KylinOS教程(超详细)

目录 引言1. 下载2. 安装 VMware2. 安装银河麒麟操作系统2.1 新建虚拟机2.2 安装操作系统2.3 网络配置 3. 安装VMTools 创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄袭…

ByConity BSP 解锁数据仓库新未来

文章目录 前言BSP 模式简介基于 TPC-DS 的 ELT 活动测试环境登录 ECS数据查询配置 执行 02.sqlsql解释&#xff1a;1. 第一步&#xff1a;创建 wscs 临时表2. 第二步&#xff1a;创建 wswscs 临时表3. 第三步&#xff1a;对比 2001 年和 2002 年的数据子查询 1&#xff1a;提取…

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 王志豪&#xff0c;厦门大学博士生 刘诗雨&#xff0c;厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型&#xff08;LLMs&#xff…

Android OpenGl(二) Shader

一、Shader 1、什么是Shader&#xff0c;为什么要使用Shder &#xff08;1&#xff09;shader运行在gpu上的小程序 &#xff08;2&#xff09;以前使用固定管线&#xff0c;但缺点是灵活度不够&#xff0c;无法满足复杂需求&#xff0c;为了解决固定管线的缺点&#xff0c;出…

软考:系统架构设计师教材笔记(持续更新中)

教材中的知识点都会在。其实就是将教材中的废话删除&#xff0c;语言精练一下&#xff0c;内容比较多&#xff0c;没有标注重点 系统架构概述 定义 系统是指完成某一特定功能或一组功能所需要的组件集&#xff0c;而系统架构则是对所有组件的高层次结构表示&#xff0c;包括各…

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…

虚拟机桥接模式

主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单&#xff1a;编辑>虚拟机网络编辑&#xff0c;点击“更改设置”&#xff0c;可以看到三个网卡&#xff0c;这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0&#xff0c;如果没看到这个网卡&…

游戏开发线性空间下PS工作流程

前言 使用基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui 在游戏引擎中的渲染结果与 PS 中的不一致&#xff1a; PS&#xff08;颜色空间默认是sRGB伽马空间&#xff09;&#xff1a…

MAC M4安装QT使用国内镜像源在线安装

MAC M4安装QT使用国内镜像源在线安装 一、下载安装包1. 访问[https://www.qt.io/](https://www.qt.io/)下载在线安装包2. 下载结果 二、创建QT账户&#xff0c;安装的时候需要三、安装1. 终端打开安装包2. 指定安装源3. 运行安装完的QT 一、下载安装包 1. 访问https://www.qt.…

Linux应用软件编程-多任务处理(线程)

线程&#xff1a;轻量级的进程&#xff0c;线程的栈区独立&#xff08;8M&#xff09;&#xff0c;与同一进程中的其他线程共用进程的堆区&#xff0c;数据区&#xff0c;文本区。 进程是操作系统资源分配的最小单位&#xff1b;线程是cpu任务调度的最小单位。 1. 线程的创建…

BFS中的多源BFS、最小步数模型和双端队列广搜

多源BFS 多源BFS时有从多个源点出发的bfs算法,只需要将多个源点都连一条边权为0的边到虚拟源点,那么问题就等价于从虚拟源点开始BFS。 一开始直接将所有源点加入BFS的队列即可. 173. 矩阵距离 给定一个 N N N 行 M M M 列的 01 01 01 矩阵 A A A&#xff0c; A [ i ] […

分布式版本管理工具——git 中忽略文件的版本跟踪(初级方法及高级方法)

git工具忽略指定文件的版本跟踪 一、简单方式实现二、复杂方式实现&#xff08;模式匹配&#xff09;1. 相关规则2. 应用案例a) 忽略所有内容b) 忽略所有目录&#xff08;不忽略当前目录的具体文件&#xff09;c)忽略指定目录下的所有文件&#xff0c;但排除某文件d&#xff09…

1225. 报告系统状态的连续日期 - 力扣(LeetCode)

目录 1. 力扣链接 2. 题目 3. 分析 4. 代码实现 5. 代码验证 6. 总结 1. 力扣链接 1225. 报告系统状态的连续日期 - 力扣&#xff08;LeetCode&#xff09; 2. 题目 表&#xff1a;Failed ----------------------- | Column Name | Type | -----------------------…

jenkins集成工具(一)部署php项目

目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…