nacos实战

spring cloud是一系列框架的有序集合,是分布式系统构建工具

服务领域模型

不同的组(group)之间不能调用,只能进行组内调用

namespace=》group/service=》cluster=》instance

没有nacos的时候

微服务调用,可以直接使用RestTemplate进行调用。

但是服务量增大,一个服务需要部署在多台服务器上时,使用nginx做负载均衡

springboot与spring cloud alibaba版本对应

版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

注册中心

nacos注册中心集成springboot

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在启动类上加注解

@EnableDiscoveryClient

添加配置

server:
  port: 8081
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        service: order-service

使用RestTemplate依赖spring-boot-starter-web

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

启动项目后,nacos中

 服务调用(RestTemplate)

调用双方的服务都注册到nacos中

调用方

在启动类中添加RestTemplate

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

Controller,其中,stock-service是被调用方的服务名

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("order/create")
    public String createOrder(){
        return restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
    }

添加依赖(好像没有这个依赖也可以调用)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

注册中心原理

1. 服务启动时,将服务注册到注册中心中(服务名:实例)

2. 注册中心有心跳机制,定时检测服务是否存活

3. 客户端调用时,会查询注册中心的服务列表

4. 客户端定时拉取注册中心的服务列表,以防服务信息发生改变

5. 当检测到服务发生变化时,注册中心会发送UDP协议进行更新(UDP是不可靠的传输)

nacos注册中心的入口是NacosNamingService

通过Raft协议和Disro协议进行数据同步

AP:Disro协议

CP:Raft协议


nacos集群 

内置的derby改成mysql

使用nacos集群的时候,需要修改nacos的数据源,内置的数据库会导致各个节点数据不一致

 nacos对应的mysql脚本在源码的distribution中

 使用mysql需要修改nacos的配置文件application.properties

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

修改cluster.conf

使用nacos集群,需要修改cluster.conf中的相应配置,修改成集群的ip和端口

nginx对集群进行负载均衡

 application.yml中对应的服务地址也需要添加

集群启动命令

startup.cmd -m cluster

 

配置中心

常用的配置中心

Apollo(阿波罗、国产)

1.统一管理不同环境、不同集群的配置2.配置修改实时生效(热发布)
3版本发布管理
4.灰度发布
5.权限管理、发布审核、操作审计
6.提供开放平台API

Disconf(百度,用的较少)

Spring cloud Config

基于git存储配置,缺少可视化界面

naocs 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

nacos集成springboot

添加依赖

       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

nacos作为配置中心不需要在启动类在添加@Enablexxx注解

修改配置文件

需要在bootstrap.properties或者bootstrap.yml中配置,不能在application.xxx中配置

因为bootstrap是应用程序引导执行,早于application执行

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        username: nacos
        password: nacos

读取配置

在nacos的配置列表中添加spring.application.name同名的配置,在代码中能够直接读取配置

    @Value("${name}")
    private String name;

    @RequestMapping("getName")
    public String getName(){
        return name;
    }

 通过这段代码,可以拿到配置中的name值

在controller上添加@RefreshScope,可以实现修改修改后拿到最新的配置值(配置自动更新、实时更新)

 没有指定配置文件时,没有写扩展名时,#{spring.application.name}.properties文件会覆盖#{spring.application.name}文件中的配置

例:stock-app.properties中配置了name=zhangsan,stock-app中配置了name=lisi

最终读取到的name是zhangsan

如果指定了扩展名,那么会读取对应扩展名下的配置(stock-app.yaml

 

还可以指定环境,此时读取stock-app-test.yaml

 

还可以指定命名空间,此时读取命名空间是ns1下的配置文件

 

shared-configs可以添加共享配置,优先级最低

extension-configs支持一个应用有多个dataId配置

优先级

共享配置 < 扩展配置 < stock-app < stock-app.yaml < stock-app-dev.yaml

配置动态刷新的原理

动态监听:

push

请求发送到服务端后推送给客户端

需要维护客户端和服务端之间的长链接

pull

客户端定时从服务端拉取变更

时间间隔不好把控

动态刷新:长轮询机制

1. 客户端定时发送请求从服务端拉取变更

2. http请求的超时时间是30s,如果配置没有变更,把http请求封装成ClientLongPoll对象,放在队列中

3. 同时启动一个线程,29.5s后执行

3.1 如果在29.5s中配置没有任务变化,直接返回http对象

3.2 如果在29.5s中配置发生变更,变更的事件会循环队列,找到是哪个请求对应的变更,返回结果,取消延迟线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值