Nacos注册中心
(一)认识和安装Nacos
1、认识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-alibaba的管理依赖引入进来,以后它有关的所有版本都不用操心了
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=false
username: root
password: root123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: userservice # user服务的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
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=false
username: root
password: root123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice # order服务的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
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:
点击userservice详情:
使用order/101、order/102、…测试,发现仍然是userservice轮询,因此负载均衡没有问题
2、总结
(三)服务多级存储模型
1、Nacos服务多级存储模型
之前是有两层概念,一层是服务,第二层就是实例。一个服务可以包含多个实例。
我们会将一个服务的多个实例部署到多个机房,就像把鸡蛋分散开了,这样就可以做到容灾
而Nacos服务多级存储模型就是引入了这样一个机房的概念,或者说地域的概念,它把存在一个机房的多个实例称为一个集群
2、服务跨集群调用问题
打开nacos中orderservice的详情,可以看到它集群名字为“DEFAULT”,也就是说没有集群。那下面我们就去学习如何配置实例的集群属性
3、服务集群属性
接下来我们要将UserApplication、UserApplication2放在hz集群,UserApplication3设置在sh集群
1、打开userservice的application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: root
password: root123456
driver-class-name: com.mysql.jdbc.Driver
application:
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
4、总结
Nacos服务多级存储模型其实就是在原有分级上多做了一层,原来是两级,现在又把实例按照地域划分成了集群
(四)NacosRule负载均衡
1、服务集群属性
不过我们最终想要实现的是orderservice远程调用userserivce时优先选择本地集群,因此我们要给orderserivce也配置一个集群属性,
orderservice中的application.yml,给它也是HZ集群,然后重启orderservice
然后我们在浏览器中访问order/101、order/102、order/103
然后回到IDEA中看到UserApplication、UserApplication2、UserApplication3都有输出sql语句,说明它们都被访问了,也就是说orderservice发起远程调用时没有优先选择同集群,依然是采用轮询方案
我们知道服务在选择实例时,它的规则全都是由负载均衡的规则来决定的,也就是IRule。现在我们没有配置IRule,因此默认的规则就是轮询
2、根据集群负载均衡
修改负载均衡的规则同样是在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停掉会怎么样呢?
会发现本地集群没有服务时也能访问,
order中会出现一个警告信息
3、总结
(五)服务实例的权重设置
1、根据权重负载均衡
权重调为0时,就不会被访问!
2、总结
(六)环境隔离namespace
1、环境隔离
环境隔离就是在对服务service做隔离
那么我们来设置命名空间
那么怎么样去修改一个服务的命名空间呢?这个就不是在控制台修改的了,需要在代码区域了
就是添加了一个namespace,注意到填的不是名称是id
namespace: d2afdd92-4e10-47ee-be86-1b080c1ec582 # 命名空间,填id
然后重启orderservice
此时它们就是两个世界的人了,隔离,因此再访问就报错了:
2、总结
环境隔离是用namespace来做的
(七)Nacos和Eureka的对比
1、nacos注册中心细节分析
2、临时实例和非临时实例
将orderservice的修改:
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
username: root
password: root123456
driver-class-name: com.mysql.jdbc.Driver
application:
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 # 命名空间,填id
ephemeral: false # 设置为非临时实例
此时先关闭orderservice,去nacos控制台,就没有了
再次启动orderservice
再在IDEA中关闭orderservice,nacos控制台中orderservice还在,只是红色了
再等很久这个服务也不会被剔除,除非手动删除它,否则永远都在
3、总结
(八)Nacos配置管理-Nacos实现配置管理
1、统一配置管理
打开nacos控制台,
点击加号,新建配置
切记这个配置内容不是把application.yml中一切内容都弄过来,只是有热更新需求的
(九)Nacos配置管理-微服务配置拉取
1、统一配置管理
1、在userservice中引入nacos配置管理客户端依赖
<!--nacos的配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、bootstrap.yml