> 文章列表 > SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

Nacos注册中心

(一)认识和安装Nacos

1、认识Nacos

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

2、安装nacos

这里下载1.4.1版本

默认端口是8848

下载解压后,终端进入到nacos/bin下,bash startup.sh -m standalone
然后查看start.out文件得到一个网址就可以查看nacos的服务列表,http://10.10.20.18:8848/nacos/index.html

(二)快速入门

1、服务注册到Nacos

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
在父工程中将springcloud-alibaba的管理依赖引入进来,以后它有关的所有版本都不用操心了

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
1、首先找到父工程的pom,已经有了springcloud的管理依赖,springcloudalibaba比较特殊,是后来才加入的,所以它没有在springcloud-dependencies中,需要单独去引入。所以直接将这个依赖放到springcloud-dependencies的下一个

<!-- springCloud -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope>
</dependency>
<!--nacos的管理依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

2、接下来就可以改造服务了。
将userservice和orderservice的pom中的eureka的dependency注释掉,然后引入nacos客户端依赖包

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

3、修改yml文件
userservice和orderservice

将eureka的注释掉
往上找到spring这块,在spring的里面加上nacos的配置

userservice:

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driverapplication:name: userservice # user服务的服务名称cloud:nacos:server-addr: localhost:8848 # nacos服务端地址
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
#eureka:
#  client:
#    service-url: # eureka的地址信息
#      defaultZone: http://127.0.0.1:10086/eureka

orderservice

server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_order?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driverapplication:name: orderservice # order服务的服务名称cloud:nacos:server-addr: localhost:8848 # nacos服务端地址
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
#eureka:
#  client:
#    service-url: # eureka的地址信息
#      defaultZone: http://127.0.0.1:10086/eureka
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
ribbon:eager-load:enabled: true # 开启饥饿加载clients: # 指定饥饿加载的服务名称- userservice

其他都不需要改,包括ribbon

启动两个userservice和一个orderservice:
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
点击userservice详情:
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
使用order/101、order/102、…测试,发现仍然是userservice轮询,因此负载均衡没有问题

2、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

(三)服务多级存储模型

1、Nacos服务多级存储模型

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

之前是有两层概念,一层是服务,第二层就是实例。一个服务可以包含多个实例。

我们会将一个服务的多个实例部署到多个机房,就像把鸡蛋分散开了,这样就可以做到容灾
而Nacos服务多级存储模型就是引入了这样一个机房的概念,或者说地域的概念,它把存在一个机房的多个实例称为一个集群

2、服务跨集群调用问题

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
打开nacos中orderservice的详情,可以看到它集群名字为“DEFAULT”,也就是说没有集群。那下面我们就去学习如何配置实例的集群属性

3、服务集群属性

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
接下来我们要将UserApplication、UserApplication2放在hz集群,UserApplication3设置在sh集群

1、打开userservice的application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driverapplication:name: userservice # user服务的服务名称cloud:nacos:server-addr: localhost:8848 # nacos服务端地址discovery:cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州

然后启动UserApplication和UserApplication2
那如果想要UserApplication3是SH集群,就是把userservice的application.yml中刚才那个cluster-name换成SH,然后再启动它。这个时候不要重启UserApplication和UserApplication2

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

4、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
Nacos服务多级存储模型其实就是在原有分级上多做了一层,原来是两级,现在又把实例按照地域划分成了集群

(四)NacosRule负载均衡

1、服务集群属性

不过我们最终想要实现的是orderservice远程调用userserivce时优先选择本地集群,因此我们要给orderserivce也配置一个集群属性

orderservice中的application.yml,给它也是HZ集群,然后重启orderservice
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
然后我们在浏览器中访问order/101、order/102、order/103

然后回到IDEA中看到UserApplication、UserApplication2、UserApplication3都有输出sql语句,说明它们都被访问了,也就是说orderservice发起远程调用时没有优先选择同集群,依然是采用轮询方案
我们知道服务在选择实例时,它的规则全都是由负载均衡的规则来决定的,也就是IRule。现在我们没有配置IRule,因此默认的规则就是轮询

2、根据集群负载均衡

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
修改负载均衡的规则同样是在yml里面。之前已经配置过orderservice的userservice的ribbon里负载均衡的规则了,不过配的是随机,现在只需要替换它

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

然后重启order服务

然后我们在浏览器中访问order/101、order/102、order/103、…、order/107,发现全部都在UserApplication和UserApplication2,UserApplication3一个都没有
nacos特点:优先选择本地集群,在本地集群内的多个服务当中再采用随机方式进行负载均衡

此时如果把8081和8082停掉会怎么样呢?
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
会发现本地集群没有服务时也能访问,
order中会出现一个警告信息
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

3、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

(五)服务实例的权重设置

1、根据权重负载均衡

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
权重调为0时,就不会被访问!

2、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

(六)环境隔离namespace

1、环境隔离

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
环境隔离就是在对服务service做隔离
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
那么我们来设置命名空间
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
那么怎么样去修改一个服务的命名空间呢?这个就不是在控制台修改的了,需要在代码区域了

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
就是添加了一个namespace,注意到填的不是名称是id

namespace: d2afdd92-4e10-47ee-be86-1b080c1ec582 # 命名空间,填id

然后重启orderservice
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
此时它们就是两个世界的人了,隔离,因此再访问就报错了:
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

2、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

环境隔离是用namespace来做的

(七)Nacos和Eureka的对比

1、nacos注册中心细节分析

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

2、临时实例和非临时实例

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

将orderservice的修改:

spring:datasource:url: jdbc:mysql://localhost:3306/cloud_order?useSSL=falseusername: rootpassword: root123456driver-class-name: com.mysql.jdbc.Driverapplication:name: orderservice # order服务的服务名称cloud:nacos:server-addr: localhost:8848,localhost:8847,localhost:8849 # nacos服务端地址discovery:cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州namespace: d2afdd92-4e10-47ee-be86-1b080c1ec582 # 命名空间,填idephemeral: false # 设置为非临时实例

此时先关闭orderservice,去nacos控制台,就没有了
再次启动orderservice
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
再在IDEA中关闭orderservice,nacos控制台中orderservice还在,只是红色了
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
再等很久这个服务也不会被剔除,除非手动删除它,否则永远都在

3、总结

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

(八)Nacos配置管理-Nacos实现配置管理

1、统一配置管理

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
打开nacos控制台,
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
点击加号,新建配置
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)

切记这个配置内容不是把application.yml中一切内容都弄过来,只是有热更新需求的

(九)Nacos配置管理-微服务配置拉取

1、统一配置管理

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(nacos)
1、在userservice中引入nacos配置管理客户端依赖

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

2、bootstrap.yml

(十)Nacos配置管理-配置热更新

(十一)Nacos配置管理-多环境配置共享

(十二)Nacos配置管理-nacos集群搭建

路由器知识