Nacos注册中心
认识nacos:nacos是阿里巴巴的产品,现在是spring cloud 的一个组件,相对于eureka功能更加丰富,在国内欢迎程度更高。
一、服务注册到nacos
- 在cloud-demo父工程中添加spring-cloud-alibaba的依赖:
<!--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>
- 在user服务和order服务pom文件中把eureka依赖换成nacos依赖:
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 在user和order服务中配置文件换成nacos:
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=UTC&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: order-service
#直接在spring底下配置就可以
cloud:
nacos:
server-addr: localhost:8848 # nacos默认端口地址为8848
- 把order和user服务都启动起来后,去nacos注册中心查看,发现已成功注册。
启动nacos命令:startup.cmd -m standalone
二、服务分级存储模型
通常在部署项目时,假如order和user服务为一个集群,则会在不同的服务器上部署很多集群。
一级是服务,例如user-service;
二级是集群,例如深圳或北京;
三级是实例,例如深圳机房的某台服务器部署了user-service的服务器。
我们随便启动一个服务order,在我们的nacos注册中心发现这个服务默认没有集群:
示例:添加user服务的集群
- 修改配置文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=UTC&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: user-service
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
#配置集群
discovery:
cluster-name: sz #配置集群名称,也就是机房名称,例如:sz(深圳)
- 启动实例,先启动sz,修改集群名字为bj过后再启动一个实例,这时在nacos发现已存在sz和bj的集群:
- 再修改order服务的集群为sz后启动oder服务:
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=UTC&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: sz
- 当通过order服务远程调用user服务时,优先调用本地服务。
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=UTC&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: sz
user-service:
ribbon:
#负载均衡规则:优先访问本地集群
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
这时order服务远程调用user服务时,会优先调用sz,因为order的集群也在sz。
注:当sz集群有多个user服务时,order调用user采用的是随机的方式;当sz集群没有user服务时,order才会去访问bj集群
三、根据权重负载均衡
实际生产中的场景:服务器性能存在差异,部分机器性能较好,另一些较差,我们希望性能好的机器能承担更多的用户请求!
而nacos也提供了权重配置来控制访问效率,权重越大则访问频率越高。
- 在nacos控制台可以设置实例的权重
权重小的访问少,权重大的访问多!权重1是权重0.1的十倍,如果权重为0,则不会被访问.
#### 四、环境隔离-namespace
- nacos控制台->服务列表默认为public,点击左侧命名控制也默认只有public
- 点击右上角新建,编号不填默认生成
- 然后在order服务的配置文件中添加namespace:
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_order?serverTimezone=UTC&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
discovery:
cluster-name: sz
#dev环境,填id
namespace: a927c950-a56f-4756-a311-10573ef81a52
- 重启order服务,发现order服务在dev列表下,这时相当于之前的user和order已不在同一世界,再次用order调用user发现报错,无法调用,即不同namespace底下的服务不可见。
五、nacos配置管理(公共配置文件)
统一配置管理:记录微服务中一些核心的配置,微服务启动的时候会读取配置管理的配置和本地的配置来启动使用,并且后期配置修改后,会自动完成热更新,不需要重新启动,就能生效。
配置获取的步骤:
在nacos控制台配置管理->配置列表->右上角+号新建配置
此处填写的内容为有修改需求的配置,并不是任何配置都写在这里面,比如端口号,一般是固定的,不必写在这里,比如日期格式,可能会有变化,可以配置在这里。
实际项目中实现的步骤:
- 在user服务中引入nacos的配置管理依赖:
<!-- nacos的配置管理依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 由于bootstrap.yml(公共配置文件)的优先级比application.yml高,因此我们将nacos中的配置文件放在bootstrap.yml中。因此新建bootstrap.yml:
spring:
application:
name: user-service
profiles:
active: dev #环境
cloud:
nacos:
server-addr: nacos:8848 #nacos地址
config:
file-extension: yaml #文件后缀名
namespace: a927c950-a56f-4756-a311-10573ef81a52
六、nacos配置管理热更新(公共配置文件)
nacos配置文件变更后,微服务无需重启就可以感知。
方式一:加注解
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope //公共配置文件修改热更新
public class UserController {
方式二:ConfigurationProperties:创建新类->PatternProperties(推荐使用)
PatternProperties.java
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
private String envSharedValue;
private String name;
}
controller类
@Autowired
private PatternProperties properties;
@GetMapping("/prop")
public PatternProperties properties(){
return properties;
}
nacos中的配置列表:ser-service-dev.yaml
pattern:
dateformat: yyyy年-年MM月-月dd日-日 HH:mm:ss
name: zhangsan
这时启动user-service,访问:user/prop即可访问配置的信息。
配置文件优先级:服务名-profile > 服务名称.yaml > 本地配置
nacos中的配置文件优先级高于本地配置文件。