简介:java系列技术分享(继续更新中...)
初衷:一起学习、一起提高、坚定不移
如果文章内容有误与您的想法不统一,欢送大家在评论区斧正
心愿这篇文章对你有所帮忙,欢送点赞 珍藏 ⭐留言
一、Nacos简介
官网
: http://nacos.io/
官网文档
:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos是Alibaba微服务生态组件中的重要组件之一,次要用它实现利用的动静服务发现
、配置管理
、服务治理
。
Nacos
是 Dynamic Naming and Configuration Service的首字母简称
,一个更易于构建云原生利用的动静服务发现、配置管理和服务治理平台。
Nacos
致力于帮忙您发现、配置和治理微服务。Nacos 提供了一组简略易用的个性集,帮忙您疾速实现动静服务发现、服务配置、服务元数据及流量治理。
Nacos 帮忙您更麻利和容易地构建、交付和治理微服务平台。 Nacos 是构建以“服务”为核心的古代利用架构 (例如微服务范式、云原生范式) 的服务基础设施。
二、版本抉择
应用spring cloud alibaba
时特地须要留神版本间的兼容关系
请查看github官网wiki首页的: 版本阐明文档
三、下载安装 nacos
下载
nacos-server :地址 https://github.com/alibaba/nacos/releases
Windows间接下载zip包
Linux下载tar.gz包
docker在线装置查看文档
: Docker如何装置Nacos
Windows目录如下:
bin
: 存储的就是可执行文件conf
:存储的是nacos的配置文件
启动
进入nacos/bin
目录中,执行如下命令启动
.\startup.cmd -m standalone #以单机模式启动
输入nacos is starting with standalone
即为胜利。
- 进入可视化页面
http://localhost:8848/nacos/
,账号密码都是nacos
,进行登录即可
搭建胜利,Linux 装置逻辑统一
四、注册核心
Nacos Discovery文档
本人我的项目依据 版本抉择进行确定
首先申明
:该文章的版本为:
Spring Boot
------------>2.6.3Spring Cloud
------------>2021.0.1Spring Cloud-Alibaba
--------->2021.0.1.0
4.1 服务注册
4.1.1 父工程引入Spirng-Cloud-Alibaba的治理依赖`
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> </parent> <properties> <java.version>1.8</java.version> <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version> </properties> <dependencyManagement> <!-- springCloud --> <dependencies> <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> </dependencies> </dependencyManagement> <dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.2</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build></project>
4.1.2 增加Nacos的客户端依赖
<!-- nacos作为注册核心的依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
application.yml
:增加配置
spring: application: name: consumer-server cloud: nacos: discovery: server-addr: localhost:8848 #nacos注册核心的IP地址和端口号
服务调用可能会报如下谬误:
ERROR 7776 --- [io-20087-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 org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://provider-server/provider/1": provider-server; nested exception is java.net.UnknownHostException: provider-server] with root cause
所以增加以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
4.1.3 注册胜利
4.1.4 测试接口近程调用
这里次要介绍Nacos所以应用RestTemplate进行近程调用,后续会解说其余近程调用形式
//2近程查问用户信息 String url="http://provider-server/provider/"+order.getUserId(); //2. 发动调用 User user = restTemplate.getForObject(url, User.class);
消费者
这里应用服务名provider-server
进行调用
测试服务提供者:
测试消费者
4.2 集群配置
大型利用,可能存在多机房部署,例如:上海 深圳 杭州,那么服务调用的规定是什么呢?
- 跨集群提早高,同集群不可拜访,再拜访其余集群
默认状况下是 DEFAULT
配置集群属性
spring: cloud: nacos: discovery: cluster-name: HZ
启动后查看如下;
- 服务调用还是采纳:
轮训策略,
要想实现同集群的负载平衡规定则需批改负载平衡策略
,如下
4.3 负载平衡
该负载平衡策略:优先选择与本人雷同集群的服务,若该集群存在多个服务,则采纳随机形式进行负载平衡
provider-server: #给某个微服务配置负载平衡规定,这里是 provider-server 服务 ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载平衡规定
4.4 权重
权重配置来管制拜访频率,权重越大则拜访频率越高,范畴:0-1之间
设置为0,则不拜访
4.5 名称空间/环境隔离
- namespace 用来做环境隔离
- 每个名称空间有本人的惟一ID
- 不同空间下的服务不可见
spring: cloud: nacos: discovery: namespace: 646ec6d4-03e4-40d1-a387-452ba9bae995 #名称空间 ID
4.6 Nacos注册核心原理(长期实例和非长期实例)
长期实例和非长期实例:
spring: cloud: nacos: discovery: ephemeral: false #设置为非长期实例
长期实例宕机,会从Nacos的服务列剔除,二非长期实例不会剔除
4.7 Nacos与Eureka比照
相同点:
- 都反对服务住的和服务拉取
- 都反对服务提供者心跳形式做衰弱检测
不同点:
Nacos的状态检测:
- 长期实例采纳心跳
- 非长期实例采纳被动检测模式
- 长期实例心跳不失常会被剔除,
非长期实例不会剔除
- Nacos反对服务列表变更的音讯推送模式,服务列表
更新更即时
- Nacos集群
默认采纳AP形式
当集群中存在非长期实例时,采纳CP模式
Eureka采纳AP模式
五、配置核心
Nacos Config文档
5.1 Nacos增加配置信息
不是所有配置文件都增加到nacos,只需增加常常须要扭转的配置信息即可
ID设置规定通常为:[服务名称]-[profile].yaml
5.2 读取配置信息步骤
5.2.1 引入Nacos的配置管理客户端依赖
<!-- nacos作为配置核心的依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
5.2.2 bootstrap.yml增加配置
bootstrap.yml文件配置,优先级高于application.yml
spring: application: name: provider-server #服务名称 profiles: active: test #测试环境 cloud: nacos: server-addr: localhost:8848 #Nacos地址 config: file-extension: yaml #文件后缀名
启动发现nacos做配置核心读取不到配置,且启动类始终加载不进去,始终报错:
增加以下依赖即可
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
启动胜利
5.2.3 调用测试
@RestController@RequestMapping("/provider")public class ProviderController { @Autowired private ProviderService providerService; @Value("${pattern.dateformat}") private String dateformat; @GetMapping("/now") public String now() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); }}
5.3 主动刷新-热更新
Nacos中配置文件更新后,微服务无需重启就能够感知
5.3.1 形式一
通过@Value注解形式注入联合@RefreshScope进行刷新
@RestController@RequestMapping("/provider")@RefreshScopepublic class ProviderController { @Value("${pattern.dateformat}") private String dateformat; @GetMapping("/now") public String now() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat)); }}
5.3.2 形式二
通过
@ConfigurationProperties
注入,主动刷新自定义读取配置文件对象
@Data@ConfigurationProperties(prefix = "pattern")public class PatternProperties { private String dateformat;}
- 配置类或者启动类减少
@EnableConfigurationProperties(PatternProperties.class)
对象注入
@RestController@RequestMapping("/provider")public class ProviderController { @Autowired private PatternProperties patternProperties; @GetMapping("/now") public String now() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat())); }}
5.4 多环境配置共享
微服务启动时会从nacos读取多个文件
无论profile如何变动,[spring.application.name].yaml文件肯定会加载,因而多环境共享能够写入这个文件
优先级: