乐趣区

关于java:Spring-Cloud-Alibaba-之-Nacos精讲

🍓 简介:java 系列技术分享 (👉继续更新中 …🔥)
🍓 初衷: 一起学习、一起提高、坚定不移
🍓 如果文章内容有误与您的想法不统一, 欢送大家在评论区斧正🙏
🍓 心愿这篇文章对你有所帮忙, 欢送点赞 👍 珍藏 ⭐留言 📝

一、Nacos 简介

官网 : http://nacos.io/

官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos 是 Alibaba 微服务生态组件中的重要组件之一,次要用它实现 利用的动静服务发现 配置管理 服务治理

Nacos 是 Dynamic Naming and Configuration Service 的首字母 简称,一个更易于构建云原生利用的动静服务发现、配置管理和服务治理平台。

Nacos 致力于帮忙您发现、配置和治理微服务。Nacos 提供了一组简略易用的个性集,帮忙您疾速实现动静服务发现、服务配置、服务元数据及流量治理。

Nacos 帮忙您更麻利和容易地构建、交付和治理微服务平台。Nacos 是构建以“服务”为核心的古代利用架构 (例如微服务范式、云原生范式) 的服务基础设施。

二、版本抉择

应用 spring cloud alibaba 时特地须要留神版本间的兼容关系
请查看 github 官网 wiki 首页的: 版本阐明文档

三、下载安装 nacos

下载 nacos-server:地址 https://github.com/alibaba/nacos/releases

  1. Windows 间接下载 zip 包
  2. Linux 下载 tar.gz 包
  3. docker 在线装置查看文档: Docker 如何装置 Nacos

Windows 目录如下:

bin : 存储的就是可执行文件
conf: 存储的是 nacos 的配置文件

启动

进入 nacos/bin 目录中, 执行如下命令启动

.\startup.cmd -m standalone  #以单机模式启动

输入 nacos is starting with standalone 即为胜利。

  • 进入可视化页面http://localhost:8848/nacos/,账号密码都是nacos,进行登录即可

搭建胜利,Linux 装置逻辑统一

四、注册核心

Nacos Discovery 文档

本人我的项目依据 版本抉择进行确定

首先申明 : 该文章的版本为:

  1. Spring Boot ————>2.6.3
  2. Spring Cloud ————>2021.0.1
  3. Spring Cloud-Alibaba———>2021.0.1.0

4.1 服务注册

4.1.1 父工程引入 Spirng-Cloud-Alibaba 的治理依赖 `

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/>
    </parent>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <!-- springCloud -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba 是阿里巴巴团体针对服务开发所提供的一套解决方案 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>

</project>

4.1.2 增加 Nacos 的客户端依赖

        <!-- nacos 作为注册核心的依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

application.yml: 增加配置

spring:
  application:
    name: consumer-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #nacos 注册核心的 IP 地址和端口号

服务调用可能会报如下谬误:

ERROR 7776 --- [io-20087-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://provider-server/provider/1": provider-server; nested exception is java.net.UnknownHostException: provider-server] with root cause

所以增加以下依赖:

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

4.1.3 注册胜利

4.1.4 测试接口近程调用

这里次要介绍 Nacos 所以应用 RestTemplate 进行近程调用, 后续会解说其余近程调用形式

        // 2 近程查问用户信息
        String url="http://provider-server/provider/"+order.getUserId();

        //2. 发动调用
        User user = restTemplate.getForObject(url, User.class);

消费者 这里应用服务名 provider-server 进行调用

  • 测试服务提供者:

  • 测试消费者

4.2 集群配置

大型利用, 可能存在多机房部署, 例如: 上海 深圳 杭州, 那么服务调用的规定是什么呢?

  • 跨集群提早高, 同集群不可拜访, 再拜访其余集群

默认状况下是 DEFAULT
配置集群属性

spring:
  cloud:
    nacos:
      discovery:
        cluster-name: HZ

启动后查看如下;

  • 服务调用还是采纳:轮训策略,
  • 要想实现同集群的负载平衡规定则需批改负载平衡策略, 如下

4.3 负载平衡

该负载平衡策略:优先选择与本人雷同集群的服务, 若该集群存在多个服务, 则采纳随机形式进行负载平衡

provider-server:       #给某个微服务配置负载平衡规定, 这里是 provider-server 服务
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载平衡规定

4.4 权重

权重配置来管制拜访频率, 权重越大则拜访频率越高, 范畴:0- 1 之间

设置为 0, 则不拜访

4.5 名称空间 / 环境隔离

  1. namespace 用来做环境隔离
  2. 每个名称空间有本人的惟一 ID
  3. 不同空间下的服务不可见
spring:
  cloud:
    nacos:
      discovery:
        namespace: 646ec6d4-03e4-40d1-a387-452ba9bae995 #名称空间 ID

4.6 Nacos 注册核心原理(长期实例和非长期实例)

长期实例和非长期实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false                               #设置为非长期实例

长期实例宕机, 会从 Nacos 的服务列剔除, 二非长期实例不会剔除

4.7 Nacos 与 Eureka 比照

相同点:

  1. 都反对服务住的和服务拉取
  2. 都反对服务提供者心跳形式做衰弱检测

不同点:

  1. Nacos 的状态检测:

    • 长期实例采纳心跳
    • 非长期实例采纳被动检测模式
  2. 长期实例心跳不失常会被剔除,非长期实例不会剔除
  3. Nacos 反对服务列表变更的音讯推送模式, 服务列表 更新更即时
  4. Nacos 集群 默认采纳 AP 形式 当集群中存在 非长期实例时, 采纳 CP 模式 Eureka 采纳AP 模式

五、配置核心

Nacos Config 文档

5.1 Nacos 增加配置信息

不是所有配置文件都增加到 nacos, 只需增加常常须要扭转的配置信息即可

ID 设置规定通常为:[服务名称]-[profile].yaml

5.2 读取配置信息步骤

5.2.1 引入 Nacos 的配置管理客户端依赖

    <!-- nacos 作为配置核心的依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

5.2.2 bootstrap.yml 增加配置

bootstrap.yml 文件配置, 优先级高于 application.yml

spring:
  application:
    name: provider-server #服务名称
  profiles:
    active: test #测试环境
  cloud:
    nacos:
      server-addr: localhost:8848  #Nacos 地址
      config:
        file-extension: yaml  #文件后缀名

启动发现 nacos 做配置核心读取不到配置,且启动类始终加载不进去,始终报错:
增加以下依赖即可

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

启动胜利

5.2.3 调用测试

@RestController
@RequestMapping("/provider")
public class ProviderController {

    @Autowired
    private ProviderService providerService;

    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }

}

5.3 主动刷新 - 热更新

Nacos 中配置文件更新后, 微服务无 需重启就能够感知

5.3.1 形式一

  • 通过 @Value 注解形式注入联合 @RefreshScope 进行刷新

    @RestController
    @RequestMapping("/provider")
    @RefreshScope
    public class ProviderController {@Value("${pattern.dateformat}")
        private String dateformat;
        
        @GetMapping("/now")
        public String now() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
        }
    }

    5.3.2 形式二

    通过 @ConfigurationProperties 注入, 主动刷新

  • 自定义读取配置文件对象

    @Data
    @ConfigurationProperties(prefix = "pattern")
    public class PatternProperties {private String dateformat;}
  • 配置类或者启动类减少@EnableConfigurationProperties(PatternProperties.class)
  • 对象注入

    @RestController
    @RequestMapping("/provider")
    public class ProviderController {
            @Autowired
               private PatternProperties patternProperties;
           
            @GetMapping("/now")
            public String now() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
            }
    }

    5.4 多环境配置共享

    微服务启动时会从 nacos 读取多个文件
    无论 profile 如何变动,[spring.application.name].yaml 文件肯定会加载, 因而多环境共享能够写入这个文件

优先级:

退出移动版