SpringCloud(一)微服务介绍
SpringCloud(二)【单体服务及远程调用】
SpringCloud(三)【Eureka注册中心】
SpringCloud(四)【Ribbon】
Nacos注册中心
一、Nacos的Windows安装
(一)安装包下载
(二) Ncos官网
Nacos官网
(三)windows中nacos的安装和搭建
- 打开Nacos官网,点击“进入gitHub下载”,选择相应的版本进行下载。此处使用
1.4.1
- 解压
注意需要是英文路径
- 配置端口
默认端口是8848
,如果已经被占用,则可以进行更改
进入application.properties进行端口更改
- 启动
- ① win+R进入命令行,cd到
bin
对应的路径
- ② 执行命令
单机模式
startup.cmd -m standalone
5. 打开控制台
右上交红框部分的console对应的为网址。
默认账号:nacos
默认密码:nacos
二、使用nacos实现负载均衡和服务的发现与注册
-
SpringCloud父工程
更改父工程的pom.xml
<!-- 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>
-
服务的改造
- 引入依赖
注意:Eureka和nacos不能同时使用
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 修改yml文件
注意:Eureka和nacos不能同时使用
3. 启动服务
启动服务,可以看到服务实例信息。
三、服务多级存储模型
服务调用尽量调本地的服务实例,减少跨集群的调用可以减少延迟;当本地的服务不可调用时,才去调用别的集群的服务。
- 配置服务集群属性
对userService服务进行配置,其中8081和8082在HZ
集群,8083在SH
集群。
spring:
cloud:
nacos:
server-addr: localhost:8848 #nacos服务地址
discovery:
cluster-name: SH #可自定义-上海
- 查看配置结果
四、NacosRule负载均衡
配置完集群之后,希望优先选择本地集群,再进行跨集群访问。
总体规则:
- 优先选择同集群服务实例列表;
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告;
- 确定了可用实例列表后,再采用随机负载均衡挑选实例。
首先需要配置orderService的集群,然后需要配置它的负载均衡规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
当在本地集群找不到提供者,再去进行跨集群访问,还会发出警告:
11-27 15:26:56:042 WARN 16276 — [nio-8080-exec-3] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId=‘192.168.21.1#8083#SH#DEFAULT_GROUP@@userservice’, ip=‘192.168.21.1’, port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName=‘SH’, serviceName=‘DEFAULT_GROUP@@userservice’, metadata={preserved.register.source=SPRING_CLOUD}}]
五、根据权重负载均衡
可以根据机器设备的性能等参数对不同服务器配置不同的权重,再根据权重进行负载均衡。
总体规则:
- Nacos控制台可以设置实例的权重值,0~1之间同集群内的多个实例;
- 权重越高被访问的频率越高;
- 权重设置为0则完全不会被访问。
设置权重步骤:
特殊应用场景:
如果将一个服务实例的权重调整为0,则不会访问该实例,此时可以对服务进行“平滑升级”。
六、环境隔离
Nacos可以进行服务存储和数据存储,而这两者的最外层都有一个叫做namespace的东西用来做外层隔离。
总体规则:
- 每个namespace都有唯—id;
- 服务设置namespace时要写id而不是名称不同namespace下的服务互相不可见。
如果要要配置不同的环境(开发环境 / 测试环境 / 生产环境)如何实现?
4. 在nacos控制台新建namespace
- 在orderService的配置文件中配置namespace信息
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: b47b494b-da3e-4cb8-b348-78213cfe0e77 #配置namespace
- 配置结果
userService在public
下,而orderService在dev
下。
4.如果此时进行访问,发现namespacedev
下没有userService实例,会报错。
11-27 16:10:28:608 ERROR 13272 — [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for userservice] with root cause
七、Eureka和Nacos的异同
-
临时实例和非临时实例的区别?
临时实例宕机时,会从nacos的服务列表中剔除;
非临时实例宕机时,不会从nacos的服务列表中剔除。 -
如何配置临时实例和非临时实例?
默认是临时实例
,ephemeral为true表示:是临时实例。
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ #集群名称
namespace: b47b494b-da3e-4cb8-b348-78213cfe0e77 #配置namespace
ephemeral: false #是否是临时实例
-
Nacos与eureka的异同?
Nacos与eureka的共同点:
- 都支持服务注册和服务拉取;
- 都支持服务提供者心跳方式做健康检测。
Nacos与Eureka的区别:
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式;
- 非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除;
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时;
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式,Eureka采用AP方式。
八、Nacos配置管理
(一)统一配置管理
SpringCloud中SpringCloudConfig、Nacos可以用作配置管理(同时Nacos还是注册中心)。
获取配置步骤:
将配置管理交给Nacos管理的步骤:
-
在Nacos中添加配置文件
-
在微服务中引入nacos的config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时nacos去读取哪个文件
spring:
application:
name: userservice #服务名称-需要保证和nacos配置名称一致
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 #Nacos地址
config:
file-extension: yaml #文件后缀名
namespace: b47b494b-da3e-4cb8-b348-78213cfe0e77 #namespace的id
注意:需要删除/注释application.yml文件的对应配置
注意:
由于之前新建了一个名为“dev”的命名空间,在bootstrap.yml时,也需要配置命名空间,且application.yml的命名空间配置需保留,否则实例会到public下。
- 访问now接口,验证配置是否生效
(二)配置热更新
经过(一),已经将部分配置交给Nacos来统一管理,但是此时更新Nacos配置信息,并没有实现配置的热更新。
配置热更新的两种方式:
@RefreshScope注解
如果是通过@Value注解注入,则使用该注解。
方式:在@Value注入的变量所在类上添加注解。
@ConfigurationProperties注解
通过@ConfigurationProperties注入,可以实现自动刷新
注意:
- 不是所有的配置都适合放到配置中心,维护起来比较麻烦
- 可以将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
经过验证,经过配置之后都可以实现配置热更新。
(三)配置共享
多环境通用配置共享优先级:
[服务名]-[环境].yaml > [服务名].yaml > 本地配置
微服务启动时会从nacos读取多个配置文件:
[spring.application.name]-[spring.profiles.active].yaml,例如:uesrservice-dev.yaml;
[spring.application.name].yaml,例如:userservice.yaml。
无论profiles如何变化,[spring.application.name].yaml
文件一定会加载,因此多环境共享配置写入这个文件。
其中,userservice-dev.yml
pattern:
dateformat: MM-dd HH:mm:ss:SSS
userservice.yml
pattern:
date: yyyy-MM-dd
envShareProp: 共享配置
端口8081按照dev环境启动,端口8082按照test环境启动,由于没有test环境配置,所以8082端口启动的接口获取的到的配置中dateformat
为null,但是可以获取共享配置envShareProp
(四)搭建Nacos集群
整理完引用文章。