简介: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")@RefreshScopepublic 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文件肯定会加载,因而多环境共享能够写入这个文件

优先级: