代码编织梦想

SpringCloud Alibaba第十二章,升级篇,服务注册与配置中心Nacos

一、为什么SpringCloud Alibaba

1、为什么

有了spring cloud这个微服务的框架,为什么又要使用spring cloud alibaba这个框架了?最重要的原因在于spring 

cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装,同时也新增了一些其他框架。然而

Netflix的服务发现组件Eureka已经停止更新,同时Feign、Hystrix、Zuul等也都出于升级或停更进入维护阶段。

所以急需其他的一些替代产品,也就是spring cloud alibaba。

在这里插入图片描述

2、SpringCloud Alibaba能做什么

1、Nacos
阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

2、Sentinel
阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

3、RocketMQ
Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。

4、Dubbo
Apache Dubbo™ 是一款高性能 Java RPC 框架。

5、Seata
阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

6、Alibaba Cloud OSS
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储
服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

7、Alibaba Cloud SchedulerX
阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。

8、Alibaba Cloud SMS
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

3、官网和资料

https://github.com/alibaba/spring-cloud-alibaba

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

4、引用

cloud_2020项目总POM中引用:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

二、服务注册与配置中心Nacos

Nacos:Dynamic Naming + Configuration Service

Nacos就是注册中心+配置中心的组合 == 等价于Eureka+Config+Bus

官网:

https://nacos.io/zh-cn/

https://nacos.io/zh-cn/docs/quick-start.html

1、Nacos下载与安装(Server)

这里的nacos即 注册中心Server

下载地址:
https://github.com/alibaba/nacos/releases/tag/1.2.1

运行:
解压后bin目录下的start

浏览:
http://localhost:8848/nacos/#/login
	账号:nacos  密码:nacos

在这里插入图片描述

2、服务注册中心案例(client)

2.1、服务提供者provider-payment-9001

这里nacos,即注册中心client

新建module,cloudalibaba-provider-payment-9001

<parent>
    <artifactId>cloud_2020</artifactId>
    <groupId>com.lee.springcloud</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment-9001</artifactId>

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud_2020</artifactId>
        <groupId>com.lee.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment-9001</artifactId>

    <dependencies>

        <!--nacos discovery服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.lee.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

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

    </dependencies>

</project>

application.yml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos server地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类

@SpringBootApplication
@EnableDiscoveryClient //服务发现
public class PaymentMain9001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

业务类PaymentController(读取配置信息)

@RestController
@RequestMapping("/payment")
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id)
    {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}

测试:

1、启动nacos server 和 cloudalibaba-provider-payment-9001
2、访问:
http://localhost:9001/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
3、访问:
http://localhost:8848/nacos


在这里插入图片描述

2.2、服务提供者provider-payment-9002

为了后面测试方便,仿照cloudalibaba-provider-payment-9001创建9002

<parent>
    <artifactId>cloud_2020</artifactId>
    <groupId>com.lee.springcloud</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment-9002</artifactId>

application.yml

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos server地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

在这里插入图片描述

2.3、服务消费者consumer-order-83

新建module,cloudalibaba-consumer-order-83

<parent>
    <artifactId>cloud_2020</artifactId>
    <groupId>com.lee.springcloud</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>cloudalibaba-consumer-order-83</artifactId>

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud_2020</artifactId>
        <groupId>com.lee.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-consumer-order-83</artifactId>

    <dependencies>

        <!--  nacos服务发现    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.lee.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--  web组件      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #nacos server地址

主启动类

@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class OrderMain83 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain83.class,args);
    }
}

配置类

/**
 * 配置类
 */
@Configuration
public class ApplicationContextConfig {


    //标注此注解后,RestTemplate就具有了客户端负载均衡能力---因为使用了注册中心
    //必须添加此注解,否则java.net.UnknownHostException: NACOS-PAYMENT-PROVIDER
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

业务类

@RestController
@RequestMapping("/consumer")
public class OrderController {


    public static final String serverURL = "http://nacos-payment-provider";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id)
    {
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }

}

测试:

1、启动nacos-server、cloud-provider-payment-9001、cloud-provider-payment-9002、
cloud-consumer-order-83

2、访问:http://localhost:83/consumer/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
和G
nacos registry, serverPort: 9002 id1
轮询访问

3、访问 http://localhost:8848/nacos

在这里插入图片描述

结论:nacos内部整合了Ribbon

在这里插入图片描述

2.4、各注册中心比较

在这里插入图片描述

2.5、Nacos的AP和CP模式切换

CAP:C数据一致性、A可用写、P分区容错性

Nacos默认是AP模式,如下进行切换

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

何时选择何种模式

AP模式:
如果不需要存储服务级别的信息,且服务实例是通过nacos-client注册,并能够保持心跳上报,那么选择AP模式。
当前的主流服务如springcloud和dubbo都适用AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持
注册临时实例。

CP模式:
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用CP模式。
CP模式支持注册持久化实例,此时则是以raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则返回错误。

3、服务配置中心案例(client)

3.1、基础案例

创建cloudalibaba-provider-payment-9003

<parent>
    <artifactId>cloud_2020</artifactId>
    <groupId>com.lee.springcloud</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>cloudalibaba-provider-payment-9003</artifactId>

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud_2020</artifactId>
        <groupId>com.lee.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-provider-payment-9003</artifactId>

    <dependencies>
        <!--   nacos配置中心     -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--  nacos服务发现    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.lee.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


        <!--  web组件      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


</project>

application.yml

server:
  port: 9003

spring:
  profiles:
    active: dev

bootstrap.yml

spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置

主启动类

@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class PaymentMain9003 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9003.class,args);
    }
}

业务类

@RestController
@RefreshScope //实现配置的自动更新
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }

}

3.2、Nacos添加对应配置信息

3.2.1、data id配置规则

${prefix}-${spring.profile.active}.${file-extentsion}

prefix:
	默认值为:spring.application.name,也可以通过spring.cloud.nacos.config.prefix来配置

spring.profile.active:
	spring.profile.active不存在时,对应的连接符也将不存在。
	对应的data id拼接格式为:
	${prefix}.${file-extension}

file-extension:
	为配置内容的数据格式,可以通过spring.cloud.nacos.config.file-extension来配置。
	目前只支持properties和yaml类型

3.2.2、实操

根据cloudalibaba-provider-payment-9003的bootstrap.yml和application.yml两个配置文件的配置内容,配置如下:

nacos-payment-provider-dev.yaml

配置内容:

config: 
    info: "config info from nacos config center, nacos-payment-provider-dev.yaml,version:1"

在这里插入图片描述

3.3、测试

1、启动nacos-server、cloudalibaba-provider-payment-9003

2、浏览:http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:1

3、在nacos-server中修改配置文件version为2

4、浏览http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:2

结论:
	nacos自带动态刷新功能

3.4、分类配置

一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又会产生多个运行环境:开发环境、测试环境、正式环境等。

那么怎么对这些微服务配置进行管理呢?

nacos通过namespace+groupID+dataId三者对不同开发环境、不同微服务进行管理

namespace:划分部署环境DEV\TEST\PROD等,默认PUBLIC
group:划分微服务项目,如 order user cms等,默认DEFAULT_GROUP
dataID如上面的命名规则

相关配置:

spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID
        group: CMS #nacos对应的group

namespace配置:

在这里插入图片描述

group配置:

在这里插入图片描述

测试:

1、启动nacos-server和cloudalibaba-provider-payment-9003

2、访问:http://localhost:9003/config/info
结果:
namespace:DEV, Group:CMS, Data ID:nacos-payment-provider-dev.yaml. version:1

结论:
9003通过namespace + group + data ID三者定位配置文件的位置,从而读取配置文件

4、Nacos集群及持久化配置

在这里插入图片描述

这里我们只用1个Nginx服务器,3个Nacos, 1个Mysql, 3个Linux

4.1、Nacos集群安装及持久化切换

1、准备3台Linux虚拟机,它们的IP分别是192.168.0.111 -  192.168.0.107  -  192.168.0.112

2、3台服务器上各自下载nacos
wget   https://nacos的下载路径(在nacos.io官网上找)

3、在nacos的conf目录根据cluster.conf.example夫指出cluster.conf文件
cp cluster.conf.example cluster.conf

4、编辑cluster.conf文件内容
vi cluster.conf
############文件内容如下--将3台nacos的服务器地址copy上去即可--将原有内容都删除##########
192.168.0.111:8848
192.168.0.107:8848
192.168.0.112:8848

5、持久化nacos,修改conf目录下application.properties文件,将nacos的持久化数据库从内嵌的Derby切换成本地的MySQL数据库
vi application.properties
#######在文件底部添加如下--192.168.0.102是我本地windows的IP地址,即MySQL在我windows本地#######

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.0.102:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=admin123


6、关闭linux防火墙
systemctl stop firewalld
##查看防火墙状态
systemctl status firewalld

4.2、Mysql数据初始化

【我的mysql在windows本地上192.168.0.102,为了能让nacos和本地mysql连接,关闭本地的防火墙,开启mysql远程访问权限】
从nacos解压包的conf目录下找到nacos-mysql.sql文件

CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

use nacos_config;

将nacos-mysql.sql的文件内容运行一下OK

##本地mysql设置可以远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'admin123' WITH GRANT OPTION;
select user,host from user;

##关闭本地防火墙

在这里插入图片描述

4.3、Nginx配置

我的nginx服务安装在了192.168.0.107上,使用upstream。

nginx需要集成nginx_upstream_check_module模块,具体安装方法请看:
https://blog.csdn.net/weixin_30379625/article/details/87693818

在这里插入图片描述

4.4、修改cloudalibaba-provider-payment-9003

修改bootstrap.yml,将原来连接nacos的地址修改为NGINX的服务地址

spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        #server-addr: localhost:8848 #服务注册中心地址
        server-addr: 192.168.0.107:80 #NGINX的服务地址
      config:
        #server-addr: localhost:8848 #配置中心地址
        server-addr: 192.168.0.107:80 #NGINX的服务地址
        file-extension: yaml #指定yaml格式的配置
        #namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID #暂时关闭
        #group: CMS #nacos对应的group #暂时关闭

4.5、测试

1、启动3个nacos服务
cd /opt/software/nacos/bin
sh startup.sh

检测
可以通过查看日志:/opt/software/nacos/logs/start.out
也可以通过访问:
http://192.168.0.111:8848/nacos
http://192.168.0.107:8848/nacos
http://192.168.0.112:8848/nacos
(注意关闭防火墙)

2、启动NGINX服务
/usr/local/nginx-1.14.1/sbin/nginc -c /usr/local/nginx-1.14.1/conf/nginx.conf

检测
可以通过访问:
http://192.168.0.107:80/nacos
(注意关闭防火墙)

通过nginx进入nacos,创建配置文件nacos-payment-provider-dev.yaml

配置格式yaml,配置内容如下:
config: 
    info: "this is nacos cluster,version:1"

3、启动cloudalibaba-provider-payment-9003
访问:http://localhost:9003/config/info

结果:
this is nacos cluster,version:1

测试成功,nacos集群配置成功!

(在nacos集群管理可以看到各nacos的服务详情)

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/LeeDemoOne/article/details/105807347

求职字节跳动!一道简单的Java单例模式问题,问完我懵逼了...-爱代码爱编程

面试官:有用过单例模式吗? 我:有有有(自信满满)。 面试官:说说单例模式几种写法? 我:懒汉式和饿汉式,懒汉式巴拉巴拉,饿汉式巴拉巴拉。 面试官:我们都知道synchronized加锁是比较耗费资源的,你这种写法每次访问都需要获得锁(基础的懒汉式写法),效率比较低,有什么优化的方式吗? 我:沉思片刻,脑海灵光一现。可以采用双重检查加锁的方式,巴拉巴拉。(

【消息队列】如何保证MQ的高可用?-爱代码爱编程

面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识,高可用是必问的。上一讲提到,MQ 会导致系统可用性降低。所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ 的那些缺点怎么来解决了。 要是你傻乎乎的就干用了一个 MQ,各种问题从来没考虑过,那你就杯具了,面试官对你的感觉就是,只会简单使用一些技术,没任何思考

Spring Cloud 系列之 Sleuth 链路追踪(二)-爱代码爱编程

本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Sleuth 链路追踪(一) 本篇文章讲解 Sleuth 基于 Zipkin 存储链路追踪数据至 MySQL,Elasticsearch 以及使用 MQ 存储链路追踪数据至 MySQL,Elasticsearch。 存储追踪数据 Zipkin Server 默认

一文搞定,手撸Springboot + aop + Lua分布式限流的最佳实践-爱代码爱编程

一、什么是限流?为什么要限流? 不知道大家有没有坐过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤、列车的超载,存在一定的安全隐患。同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃。为了不出现最坏的崩溃情况,只能耽误

分布式 | DBLE 之 SQL 解析-爱代码爱编程

作者:路路 热爱技术、乐于分享的技术人,目前主要从事数据库相关技术的研究。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 数据库中间件与数据库有什么区别? 个人认为除了没做数据存储,其他的功能数据库中间件几乎一样不少,比如 SQL 解析、结果集处理、协议实现等。 SQL 解析

第九章 动态规划-1278:【例9.22】复制书稿(book)-爱代码爱编程

1278:【例9.22】复制书稿(book) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 现在要把m本有顺序的书分给k个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三和第四本书给同一个人抄写。 现在请你设计一种方案,使得复制时间最短。复制时

nacos1.1.4部署-google云的Debian和阿里云的Centos-爱代码爱编程

官网:https://nacos.io/zh-cn/ 国内源码下载:https://gitee.com/mirrors/Nacos 强烈建议直接用github下载安装包,本地打的包应该格式有问题,启动脚本一定有问题。 1.google云的Debian 1.1,下载,解压,启动: 下载,速度很快()     wget https://github

spring cloud 使用nacos配置中心-爱代码爱编程

创建NACOS配置 Data ID: 配置文件名,格式为 <spring.cloud.nacos.config.prefix>[-spring.profiles.active].<spring.cloud.nacos.config.file-extension>Group: 分组,<spring.cloud.nacos.co

Spring Cloud 2.2.2 源码之四十八nacos客户端触发服务刷新原理二-爱代码爱编程

Spring Cloud 2.2.2 源码之四十八nacos客户端触发服务刷新原理二 服务获取和刷新的流程图NacosServerList实例化ZoneAwareLoadBalancer实例化NacosServerList的getUpdatedListOfServers 服务获取和刷新的流程图 NacosServerList实例化 继续

Spring Cloud 2.2.2 源码之五十nacos服务端处理获取配置请求-爱代码爱编程

Spring Cloud 2.2.2 源码之五十nacos服务端处理获取配置请求 nacos服务端获取配置ConfigController的getConfigRequestUtil的getRemoteIp尽可能获取真实IPConfigServletInner的doGetConfig nacos服务端 其实nacos大致功能就两个,一个是配置中

Spring Cloud 2.2.2 源码之五十一nacos服务端处理监听配置请求一-爱代码爱编程

Spring Cloud 2.2.2 源码之五十一nacos服务端处理监听配置请求一 监听配置客户端的LongPollingRunnable服务端的ConfigController的listenerConfigServletInner的doPollingConfigLongPollingService的isSupportLongPolling是否支

Spring Cloud 2.2.2 源码之五十二nacos服务端处理监听配置请求二-爱代码爱编程

Spring Cloud 2.2.2 源码之五十二nacos服务端处理监听配置请求二 ClientLongPolling的run监听后台配置修改DataChangeTask的run ClientLongPolling的run 然后你会发现,又是一个调度任务,延迟时间29.5秒,就是最少挂起时间。然后会将对象放进监听集合里。 当挂起时间过后,开