一、nacos安装启动
1,解压到英文目录
2,在配置文件选择一个合适的端口
3,在cmd命令行启动
startup.cmd -m standalone
二、服务注册到nacos
1,导入依赖
-
1,在父工程的pom.xml文件的
<dependencyManagement>
导入SpringCloudAlibaba的管理依赖<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
-
2,在服务的pom.xml文件中引入nacos-discovery依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
eureka与nacos依赖只能存在一个
2,配置nacos地址
-
在yml文件配置
- 在服务端添加nacos地址
spring: cloud: nacos: server-addr: localhost:8848 # nacos注册中心的ip与端口(地址)
-
也可以使用下面的
-
加了discovery表示这是一个注册
因为nacos即可以做注册中心也可以做配置中心
但是上下的效果是一样的
# 需要服务名称 spring: application: name: weatherservice cloud: nacos: discovery: # 加了discovery与上面效果一样 server-addr: localhost:8848
3,注解(可不要)
与eureka注解一样 @EnableDiscoveryClient
三,服务分级存储模型
1,why?
一般,服务会直接访问实例。但是随着实例越来越多,为了方便管理,会将服务分到不同的集群中。
2,好处
1,安全:我们可以将服务分到不同的地域,如杭州与上海,当一个地方出了问题,
另一个地方依然可以使用
2,快速:我们希望服务消费者可以优先访问距离更近的服务。相同集群的服务会优先访问,
相同集群没有才会访问别的集群
3,分级模型
4,给服务配置集群
-
在服务的yml配置文件配置 - 【cluster-name】
-
集群名称相同的服务会放在同一个集群
spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ # 集群名称
四、nacos权重配置
1,why?
因为不同的服务器性能有差异,所以我们我们希望性能好的服务器能够承担更多的访问。
但是默认情况下,NacosRule是集群优先但是同集群随机挑选服务器。
因此,nacos提供了权重配置来控制访问频率,权重越大访问频率越高。
2,设置权重
权重一般在0-1之间,权重越大被访问的频率就越高,权重为0则不被访问
五、命名空间(环境隔离)
1,创建命名空间
会自动生成命名空间的id(很重要)
2,配置服务的命名空间
在yml文件配置相关内容
spring: cloud: nacos: discovery: namespace: 9cdecb08-b35c-4619-a710-0d8243a8d760 # 开发环境id group: usergroup # 配置分组,不同组的也不能相互访问
3,注意
命名空间不同的两个服务是不能相互访问的。
同一个命名空间但是不同分组,也不能相互访问
命名空间需要在nacos里面创建获取对应的id,但分组可以直接给分组名
六、nacos注册中心分析
- 1,nacos的实例分为临时实例与非临时实例
- 临时实例:如Eureka一样,采用心跳监控。一旦不健康就会被剔除
- 非临时实例:nacos会主动询问。即便不健康也会被保留。
- 2,nacos会主动向服务消费者推送消息,当服务注册信息有变动时会主动推送新的注册信息。
- 3,Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
1,配置临时实例
nacos默认为临时实例
spring: cloud: nacos: discovery: ephemeral: false # 设置为非临时实例
七、统一配置管理
1,why?
当微服务集群配置的实例越来越多,达到数十甚至数百的时候,如果要一个个的更改每一个
微服务的配置,显得很憨。
我们希望能够有一个统一的配置,能够集中管理所以微服务的配置。
正好,nacos就可以做到。
但是建议不要将所有的配置都放在nacos里面,应该将需要频繁变动的配置放在nacos里面,
对于向数据库连接池这样一般不变的配置放在本地就可以了。
2,在nacos中添加配置文件
- 1,
- 2,
3,如何拉取nacos中的配置
-
1,原理
微服务需要先拉取nacos中的配置,然后读取application.yml文件的配置,二者合并后开始创建项目。
但是,拉取nacos的配置需要nacos服务的地址,但是nacos服务的地址在application.yml中,所以就很尴尬!
因此,出现了名为bootstrap.yml的配置文件,这个配置文件会在application.yml之前执行,在这个配置
文件配置nacos的地址信息,就可以解决上面的问题。
3.1,引入nacos-config依赖
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.2,添加bootstrap.yaml
注意上面在nacos添加配置文件时,文件的名称【userservice-dev.yaml】。
其实配置文件就是通过【服务名称 + " - " + 开发环境 + " . " + 文件后缀名】
在通过【Nacos地址】来寻找需要的配置文件的。
spring:
application:
name: userservice # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
3.3,读取nacos中的配置
@Value(“${pattern.dateformat}”)
private String dateformat;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
// ...略
}
八、配置的热更新
@ConfigurationProperties会自动热更新,@Value注入的变量所在类上添加注解@RefreshScope
1,方法一
-
@RefreshScope
在@Value注入的变量所在类上添加注解@RefreshScope
2,方法二(推荐)
- @ConfigurationProperties
推荐,因为可以自动热更新。
@Component @Data @ConfigurationProperties(prefix = "pattern") public class PatternProperties { private String dateformat; }
九、共享配置
其实微服务启动时,会去nacos读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml
[spring.application.name].yaml
,例如:userservice.yaml而
[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。
1,配置共享的优先级
nacos的配置优先于本地的配置
nacos的配置中,当前服务配置大于共享配置