简介:java系列技术同享(继续更新中…)
初衷:一同学习、一同前进、持之以恒
假如文章内容有误与您的主意不一致,欢迎大家在评论区纠正
希望这篇文章对你有所协助,欢迎点赞 保藏 ⭐留言

Spring Cloud Alibaba 之 Nacos

一、Nacos简介

官网 : nacos.io/

官方文档:nacos.io/zh-cn/docs/…

Spring Cloud Alibaba 之 Nacos

Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它完成运用的动态服务发现装备办理服务办理

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生运用的动态服务发现、装备办理和服务办理渠道。

Nacos 致力于协助您发现、装备和办理微服务。Nacos 供给了一组简单易用的特性集,协助您快速完成动态服务发现、服务装备、服务元数据及流量办理。

Nacos 协助您更灵敏和容易地构建、交付和办理微服务渠道。 Nacos 是构建以“服务”为中心的现代运用架构 (例如微服务范式、云原生范式) 的服务基础设施。

二、版别挑选

运用spring cloud alibaba时特别需求注意版别间的兼容联系 请检查github官网wiki首页的: 版别说明文档

Spring Cloud Alibaba 之 Nacos

三、下载安装 nacos

下载 nacos-server :地址 github.com/alibaba/nac…

  1. Windows直接下载zip包

  2. Linux下载tar.gz包

  3. docker在线安装检查文档: Docker怎么安装Nacos

Spring Cloud Alibaba 之 Nacos
Windows目录如下:

Spring Cloud Alibaba 之 Nacos
bin : 存储的便是可履行文件 conf:存储的是nacos的装备文件

发动

进入nacos/bin目录中,履行如下指令发动

.\startup.cmd -m standalone  #以单机形式发动

输出nacos is starting with standalone 即为成功。

Spring Cloud Alibaba 之 Nacos

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

Spring Cloud Alibaba 之 Nacos
Spring Cloud Alibaba 之 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 注册成功

Spring Cloud Alibaba 之 Nacos
Spring Cloud Alibaba 之 Nacos

4.1.4 测验接口长途调用

这儿主要介绍Nacos所以运用RestTemplate进行长途调用,后续会解说其他长途调用方法

        //2长途查询用户信息
        String url="http://provider-server/provider/"+order.getUserId();
        //2. 建议调用
        User user = restTemplate.getForObject(url, User.class);

消费者这儿运用服务名provider-server进行调用

  • 测验服务供给者:

    Spring Cloud Alibaba 之 Nacos

  • 测验消费者

    Spring Cloud Alibaba 之 Nacos

4.2 集群装备

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

  • 跨集群延迟高,同集群不行拜访,再拜访其他集群

默许情况下是 DEFAULT

Spring Cloud Alibaba 之 Nacos
装备集群属性

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

发动后检查如下;

Spring Cloud Alibaba 之 Nacos

  • 服务调用还是选用:轮训战略,
  • 要想完成同集群的负载均衡规矩则需修正负载均衡战略,如下

4.3 负载均衡

该负载均衡战略:优先挑选与自己相同集群的服务,若该集群存在多个服务,则选用随机方法进行负载均衡

provider-server:       #给某个微服务装备负载均衡规矩,这儿是 provider-server 服务
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规矩

4.4 权重

**权重装备来控制拜访频率,权重越大则拜访频率越高,范围:0-1之间 **

设置为0,则不拜访

Spring Cloud Alibaba 之 Nacos
![在这儿刺进图片描绘](img-blog.csdnimg.cn/d71e01530ae… =400×400)
Spring Cloud Alibaba 之 Nacos

4.5 称号空间/环境阻隔

  1. namespace 用来做环境阻隔
  2. 每个称号空间有自己的唯一ID
  3. 不同空间下的服务不行见

Spring Cloud Alibaba 之 Nacos
Spring Cloud Alibaba 之 Nacos
Spring Cloud Alibaba 之 Nacos
Spring Cloud Alibaba 之 Nacos

spring:
  cloud:
    nacos:
      discovery:
        namespace: 646ec6d4-03e4-40d1-a387-452ba9bae995 #称号空间 ID

4.6 Nacos注册中心原理(暂时实例和非暂时实例)

Spring Cloud Alibaba 之 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,只需添加经常需求改变的装备信息即可

Spring Cloud Alibaba 之 Nacos
ID设置规矩一般为:[服务称号]-[profile].yaml
Spring Cloud Alibaba 之 Nacos

Spring Cloud Alibaba 之 Nacos

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做装备中心读取不到装备,且发动类一向加载不出来,一向报错:

Spring Cloud Alibaba 之 Nacos
添加以下依靠即可

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

发动成功

Spring Cloud Alibaba 之 Nacos

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));
    }
}

Spring Cloud Alibaba 之 Nacos

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文件一定会加载,因而多环境同享能够写入这个文件

优先级:

Spring Cloud Alibaba 之 Nacos

Spring Cloud Alibaba 之 Nacos