简介:java系列技术分享(持续更新中…)
初衷:一起学习、一起进步、坚持不懈
如果文章内容有误与您的想法不一致,欢迎大家在评论区指正
希望这篇文章对你有所帮助,欢迎点赞 收藏 ⭐留言更多文章请点击
官网
: 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-server :地址 https://github.com/alibaba/nacos/releases
Windows直接下载zip包
Linux下载tar.gz包
docker在线安装查看文档
: Docker如何安装Nacos
bin
: 存储的就是可执行文件
conf
:存储的是nacos的配置文件
启动
进入nacos/bin
目录中,执行如下命令启动
.\startup.cmd -m standalone #以单机模式启动
输出nacos is starting with standalone
即为成功。
http://localhost:8848/nacos/
,账号密码都是nacos
,进行登录即可Nacos Discovery文档
自己项目根据 版本选择进行确定
首先声明
:该文章的版本为:
Spring Boot
------------>2.6.3Spring Cloud
------------>2021.0.1Spring Cloud-Alibaba
--------->2021.0.1.0
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.3version>
<relativePath/>
parent>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>2021.0.1spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0spring-cloud-alibaba.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.4.2version>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
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.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
这里主要介绍Nacos所以使用RestTemplate进行远程调用,后续会讲解其他远程调用方式
//2远程查询用户信息
String url="http://provider-server/provider/"+order.getUserId();
//2. 发起调用
User user = restTemplate.getForObject(url, User.class);
消费者
这里使用服务名provider-server
进行调用
大型应用,可能存在多机房部署,例如:上海 深圳 杭州,那么服务调用的规则是什么呢?
spring:
cloud:
nacos:
discovery:
cluster-name: HZ
轮训策略,
要想实现同集群的负载均衡规则则需修改负载均衡策略
,如下该负载均衡策略:优先选择与自己相同集群的服务,若该集群存在多个服务,则采用随机方式进行负载均衡
provider-server: #给某个微服务配置负载均衡规则,这里是 provider-server 服务
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
**权重配置来控制访问频率,权重越大则访问频率越高,范围:0-1之间
**
spring:
cloud:
nacos:
discovery:
namespace: 646ec6d4-03e4-40d1-a387-452ba9bae995 #名称空间 ID
临时实例和非临时实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false #设置为非临时实例
临时实例宕机,会从Nacos的服务列剔除,二非临时实例不会剔除
相同点:
不同点:
非临时实例不会剔除
更新更即时
默认采用AP方式
当集群中存在非临时实例时,采用CP模式
Eureka采用AP模式
Nacos Config文档
不是所有配置文件都添加到nacos,只需添加经常需要改变的配置信息即可
ID设置规则通常为:[服务名称]-[profile].yaml
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
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.cloudgroupId>
<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>
@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));
}
}
Nacos中配置文件更新后,微服务无需重启就可以感知
通过@Value注解方式注入结合@RefreshScope进行刷新
@RestController
@RequestMapping("/provider")
@RefreshScope
public class ProviderController {
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
通过@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()));
}
}
微服务启动时会从nacos读取多个文件
无论profile如何变化,[spring.application.name].yaml文件一定会加载,因此多环境共享可以写入这个文件