SpringCloud进阶(2)–Nacos基础2
集群分区
在一个分布式应用中,一个相同的服务可能会在不同的机器、位置上启动,当我们一个服务去调用另一个服务,如果被调用的服务存在多个分布式,我们应该优先选择调用方同一区域的服务进行调用,使得响应速度更快。
因此我们需要对不同机房部署的服务进行分区,而Nacos默认的分区是DEFAULT分区。
注:Eureka也存在集群分区如:
这里写入的就是集群分区
在Nacos中我们通过配置文件来实现:
spring:
application:
name: borrowservice
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 修改为重庆地区的集群
cluster-name: Chongqing
当然我们也可以在启动配置中直接写入环境变量spring.cloud.nacos.discovery.cluster-name
之后就可以看到服务被划分到不同的集群了:
之后,我们需要开启Nacos的负载均衡才能实现区域优先调用机制,配置文件:
spring:
application:
name: borrowservice
cloud:
nacos:
discovery:
server-addr: localhost:8848
cluster-name: Chengdu
# 将loadbalancer的nacos支持开启,集成Nacos负载均衡
loadbalancer:
nacos:
enabled: true
除了根据区域优先调用之外,同一个区域内的实例也可以单独设置权重,Nacos会优先选择权重更大的实例进行调用,我们可以直接在管理页面中进行配置,也可以在配置文件进行配置:
spring:
application:
name: borrowservice
cloud:
nacos:
discovery:
server-addr: localhost:8848
cluster-name: Chengdu
# 权重大小,越大越优先调用,默认为1
weight: 0.5
配置中心
如同Erueka支持配置中心远程加载配置,Nacos也有配置中心的功能。
我们在管理页面的配置管理中可以添加配置信息,注意Data ID的格式跟之前一样,应用名称-环境.yml
,如果只编写应用名称,那么代表此配置文件无论在什么环境下都会使用,然后每个配置文件都可以进行分组,也算是一种分类方式:
之后我们在项目中引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
然后就可以配置bootstrap.yml
(在application.yml之前加载,可以实现配置文件远程获取)了:
同时,Nacos还支持配置文件热更新,我们只需要使用注解@RefreshScope
如:
@RestController
@RefreshScope //添加此注解就能实现自动刷新了
public class TestController {
@Value("${test.txt}")
String txt;
@RequestMapping("/test")
public String test(){
return txt;
}
}
这样该Controller的信息就会随着配置文件改变而热更新了。
命名空间
我们还可以将配置文件或是服务实例划分到不同的命名空间中,其实就是区分开发、生产环境或是引用归属之类的:
我们在不同的命名空间下,实例和配置都是相互之间隔离的,我们也可以在配置文件中指定当前的命名空间。
实现高可用
就像Eureka可用搭建集群来实现高可用,Nacos也可用实现集群。
官方方案:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式
我们来看看它的架构设计,它推荐我们在所有的Nacos服务端之前建立一个负载均衡,我们通过访问负载均衡服务器来间接访问到各个Nacos服务器。实际上就,是比如有三个Nacos服务器做集群,但是每个服务不可能把每个Nacos都去访问一次进行注册,实际上只需要在任意一台Nacos服务器上注册即可,Nacos服务器之间会自动同步信息,但是如果我们随便指定一台Nacos服务器进行注册,如果这台Nacos服务器挂了,但是其他Nacos服务器没挂,这样就没办法完成注册了,但是实际上整个集群还是可用的状态。
所以这里就需要在所有Nacos服务器之前搭建一个SLB(服务器负载均衡),这样就可以避免上面的问题了。但是我们知道,如果要实现外界对服务访问的负载均衡,我们就得用比如之前说到的Gateway来实现,而这里实际上我们可以用一个更加方便的工具:Nginx,来实现(之前我们没讲过,但是使用起来很简单,放心后面会带着大家使用)
关于SLB最上方还有一个DNS,这个是因为SLB是裸IP,如果SLB服务器修改了地址,那么所有微服务注册的地址也得改,所以这里是通过加域名,通过域名来访问,让DNS去解析真实IP,这样就算改变IP,只需要修改域名解析记录即可,域名地址是不会变化的。
最后就是Nacos的数据存储模式,在单节点的情况下,Nacos实际上是将数据存放在自带的一个嵌入式数据库中:
而这种模式只适用于单节点,在多节点集群模式下,肯定是不能各存各的,所以,Nacos提供了MySQL统一存储支持,我们只需要让所有的Nacos服务器连接MySQL进行数据存储即可,官方也提供好了SQL文件。
现在就可以开始了,第一步,我们直接导入数据库即可,文件在conf目录中:
将其导入到mysql数据库中即可,之后我们需要修改配置文件application.properties
修改包括MySQL服务器信息:
### Default web server port:
server.port=8801
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://cloudstudy.mysql.cn-chengdu.rds.aliyuncs.com:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
然后进行集群配置,在nacos目录下存在cluster.conf.example
文件,我们将其example后缀删掉就可以拿来使用了。记得更改内部ip(为各个Nacos服务地址)
最后我们修改一下Nacos的内存分配以及前台启动,直接修改startup.cmd
(这部分不是很懂,以后搞懂了再写)
复制一份新的那cos,修改端口,将两个nacos启动就可以了(这里可用把之前的环境变量 单点启动 删了,使用默认的集群启动):
需要注意的是:
同时,还需要注意,在单个机器上启动集群,服务间的ip使用的内网地址
Nacos在启动时会占用四个接口,除了本身服务的接口外,还占用
raft port: ${server.port} – 1000
grpc port: ${server.port} + 1000
grpc port for server: ${server.port} + 1001
因此,当我们单机开启多个服务时需要注意端口占用,不然会报错,如8848服务和8847服务不能一起使用,存在端口冲突
接着我们需要添加一个SLB,这里我们用Nginx做反向代理(这里我直接使用他人结果):
我们使用nginx作为SLB,添加配置:
#添加我们在上游刚刚创建好的两个nacos服务器
upstream nacos-server {
server 192.168.100.1:8848;
server 192.168.100.1:8846;
}
server {
listen 80;
server_name 127.0.0.1;
location /nacos {
proxy_pass http://nacos-server;
}
}
就可以使用了