SpringCloud微服务学习笔记(一)【介绍,Eureka,Ribbon,Nacos】
微服务介绍#
用于开发大型项目时,将所有代码都放在一个项目中会增加压力,而且单体架构的并发数也有限,占用的线程多的时候就不行了。这时就需要用到微服务分布式开发。
单体架构(monolithic structure):顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单,
但随着项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题:
-
团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。
-
系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,往往一次发布需要数十分钟甚至数小时。
-
系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。
微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:
-
单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。
-
团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)
-
服务自治
目前SpringCloud最新版本为2022.0.x
版本,对应的SpringBoot版本为3.x
版本,但它们全部依赖于JDK17,目前在企业中使用相对较少。
SpringCloud版本 | SpringBoot版本 |
---|---|
3.0.x | |
2.6.x, 2.7.x (Starting with 2021.0.3) | |
2.4.x, 2.5.x (Starting with 2020.0.3) | |
2.2.x, 2.3.x (Starting with SR5) | |
2.1.x | |
2.0.x | |
1.5.x | |
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
父工程的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:下添加:
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 在生产环境下都是部署为集群状态的。
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载nacos安装包,修改nacos配置,启动nacos集群
- 启动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 添加以下内容:
- 127.0.0.1:8845
- 127.0.0.1.8846
- 127.0.0.1.8847
类似如下:
然后继续修改 conf/application.properties 文件,在文件内添加以下内容,配置数据库连接信息,如下:
- spring.datasource.platform=mysql
- db.num=1
- db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
- db.user.0=root
- db.password.0=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地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?