介绍
什么是注册中心?
主要负责服务的注册与发现,确保服务之间的通信顺畅,具体来说,注册中心有以下主要功能:服务注册、服务发现、服务健康检查。
服务注册:
服务提供者在启动时会向注册中心注册自身服务的信息,包括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次
可以看出我们自己写的随机负载均衡生效了