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启动就可以了(这里可用把之前的环境变量 单点启动 删了,使用默认的集群启动):

需要注意的是:
Nacos在启动时会占用四个接口,除了本身服务的接口外,还占用
raft port: ${server.port} – 1000
grpc port: ${server.port} + 1000
grpc port for server: ${server.port} + 1001
因此,当我们单机开启多个服务时需要注意端口占用,不然会报错,如8848服务和8847服务不能一起使用,存在端口冲突

同时,还需要注意,在单个机器上启动集群,服务间的ip使用的内网地址

接着我们需要添加一个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;
        }
}

就可以使用了