1. Nacos服务搭建
Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一个组件,是一个应用于服务注册与发现、配置管理的平台。 地址:https://nacos.io/zh-cn/docs/quick-start.html
1.1 安装Nacos
- windows 在官网下载
nacos-server-1.4.1.zip
并解压; - nacos 的默认端口是8848,若被占用则修改
nacos/conf/application.properties
文件; 启动Nacos,进入
nacos/bin
目录下:Lnux/Unix/Mac: 启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:bash startup.sh -m standalone
Windows: 启动命令(standalone代表着单机模式运行,非集群模式):startup.cmd -m standalone
报错:
或
说明 jdk 的环境变量有问题
解决方法:
编辑startup.cmd
文件,在其中手动指定 JAVA_HOME 的路径:
:::info
set JAVA_HOME=”D:\Java\jdk1.8.0_301”
if not exist “%JAVA_HOME%\bin\java.exe” echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1
set “JAVA=%JAVA_HOME%\bin\java.exe”
:::
- 启动成功
- 进入Nacos客户端
Nacos启动成功后会提示访问地址 访问地址:http://192.168.111.2:8848/nacos/index.html 账号:nacos 密码:nacos
- 关闭服务
Lnux/Unix/Mac:
sh shutdown.sh
Windows:shutdown.cmd
2. 服务注册
在父工程添加 spring-cloud-alibaba 管理依赖 :::info
<_dependency>
<_groupId_>com.alibaba.cloud
<_artifactId_>spring-cloud-alibaba-dependencies
<_version_>2.2.5.RELEASE
<_type_>pom
<_scope_>import
_ :::添加 Nacos 客户端依赖 :::info
<_dependency>
<_groupId_>com.alibaba.cloud
<_artifactId_>spring-cloud-starter-alibaba-nacos-discovery
_ :::修改
application.yml
文件配置spring:
application:
name: user-service # user-service的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
启动并测试
3. 服务多级存储模型
- 一级是服务,例如:user-service
- 二级是集群,例如:BeiJing 或 HangZhou
- 三级是实例,例如:北京机房的某台部署了 user-service 的服务器
配置集群,修改application.yml
文件配置
spring:
application:
name: user-service # user-service的服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos服务端地址
discovery:
cluster-name: BeiJing # 集群名称
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高 本地集群不可访问时,再去访问其他集群
4. 负载均衡
4.1 NacosRule
这个规则会优先寻找与自己同集群的服务,同集群内采用随机方式
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
注意将服务提供者的权重都设置为1,再测试
4.2 设置权重
在 Nacos 控制台设置实例的权重值,首先选中实例后面的编辑按钮
- 权重值在 0~1 之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为 0 则完全不会被访问
5. 环境隔离
Nacos 中服务存储和数据存储的最外层都是一个名为 命名空间namespace 的东西,用来做最外层隔离。 不同命名空间下的服务不可见
配置命名空间
- 在 Nacos 控制台新建命名空间
修改项目的配置文件
spring: application: name: user-service # user-service的服务名称 cloud: nacos: server-addr: localhost:8848 # nacos服务端地址 discovery: cluster-name: BeiJing # 集群名称 namespace: 6b084c59-6f93-4e96-bda8-167d71fd7b10 # 命名空间 ephemeral: true # 是否是临时实例
6. Nacos和Eureka对比
Nacos 与 Eureka 的共同点
- 都支持服务注册和服务拉取;
- 都支持服务提供者心跳方做健康检测;
- Nacos 与 Eureka 的区别
7.2 获取配置
项目获取配置流程:
引入 Nacos 的配置管理客户端依赖:
<!-- Nacos配置管理依赖依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
在项目的 resource 目录添加一个
bootstrap.yml
文件,该文件是引导文件,优先级高于**application.yml**
```yaml spring: application: name: userservice # 服务名 profiles: active: test # 环境 cloud: nacos: server-addr: localhost:8848 # Nacos地址 config:file-extension: yaml # 文件后缀
3. 编写测试代码
```java
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${lagou.message}")
private String message;
@GetMapping("getTime")
public String getTime() {
System.out.println(message);
return message;
}
}
- 测试
7.3 配置热更新
Nacos 中的配置文件更改后,通过两种配置,微服务无需重启就可以感知:
- 方式一:在
@Value
注入的变量所在类上添加注解@RefreshScope
- 方式二:使用
@ConfigurationProperties
注解
① 新建配置类
@Data
@Component
@ConfigurationProperties(prefix = "lagou")
public class LagouProperties {
private String message;
}
② 使用
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private LagouProperties lagouProperties;
@GetMapping("getValue")
public String getValue() {
return lagouProperties.getMessage();
}
}
7.4 多环境共享
微服务启动时会从 Nacos 读取多个配置文件
- [spring.application.name]-[spring.profiles-active].yaml,例如:userservice-test.yaml
- [spring.application.name].yaml,例如:userservice.yaml
无论 profile 如何变化,[spring.application.name].yaml 这个文件一定会加载,因此多环境共享配置可以写入这个文件。
多种配置的优先级:
服务名-profile.yaml > 服务名.yaml > 本地配置