1、介绍

①概要

官网:home (nacos.io)

Nacos:Dynamic Naming and Configuration Service(动态命名和配置服务)

你可以看为:Eureka(注册中心)+Config(配置中心)+Bus(消息总线)

Nacos的支持模式:AP或者CP

②用处

  1. 替代Eureka作为注册中心
  2. 替代Config作为配置中心

2、安装

下载安装Nacos,我使用2.2.0。教学视频还在使用1.x版本,官网已经将2.x标为推荐了

安装包地址:

Releases · alibaba/nacos (github.com)

我使用docker进行安装:

docker网站:nacos/nacos-server - Docker Image | Docker Hub

docker pull nacos/nacos-server

docker运行Nacos:

docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

查看Nacos控制台:

账号和密码都是nacos

http://服务器ip:8848/nacos/#/login

3、Nacos做注册中心

①版本问题

我们之前使用的Springboot都是2.2.2版本:

Springcloud Alibaba对于版本有着清晰的描述:

所以我们使用2.1.xRELEASE

如果你的版本不同,可以参考下面的网址:

版本说明 · alibaba/spring-cloud-alibaba Wiki (github.com)

②Provider

新建模块cloudalibaba-provider-payment9001

依赖:

<dependencies>
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

yml:

server:
port: 9001 spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: Nacos安装ip:8848 #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址) #actuator
management:
endpoints:
web:
exposure:
include: '*'

启动类:

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

Controller:

@RestController
public class PaymentController { @Value("${server.port}")
private String serverPort; @GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort: " + serverPort + "\t id: " + id;
} }

启动Provider,测试:

搭建另一个个Provider吧,端口为9002,后面要用到

③Consumer(Ribbon)

新建模块cloudalibaba-consumer-nacos-order83

依赖:

<dependencies>
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>cn.zko0.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

yml:

server:
port: 83 spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 101.43.244.40:8848 #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址) #消费者要访问的微服务名称(成功注册进nacos的服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider

启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}

这里我们还是用RestTemplate,后面再整合Feign:

注:新的Nacos已经不整合ribbon,所以如果新版本要使用,需要Loadbalance依赖,或者使用openFeign

使用Ribbon需要加上@LoadBalanced

@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

Controller:

@Slf4j
@RestController
public class OrderNacosController { @Resource
private RestTemplate restTemplate; //从配置文件里读取serverURL
@Value("${service-url.nacos-user-service}")
private String serverUrl; @GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id")Long id){
return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
} }

启动,测试:

④Consumer(Feign)

将上面的Consuemr更改为Feign的调用方式:

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

注掉config类中的Configuration类,不使用RestTemplate

主启动类:

@EnableFeignClients,激活feign

Service接口:

@Component
@FeignClient(value = "nacos-payment-provider")
public interface PaymentFeignService { @GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Long id); }

修改Controller:

@Slf4j
@RestController
public class OrderNacosController { // @Resource
// private RestTemplate restTemplate;
// //从配置文件里读取serverURL
// @Value("${service-url.nacos-user-service}")
// private String serverUrl;
@Resource
private PaymentFeignService paymentFeignService; @GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id")Long id){
String payment = paymentFeignService.getPayment(id);
return payment;
//return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
}
}

启动,测试,成功:

4、Nacos做配置中心

①基础配置

一.Client(不分Provider和Consumer)

新建模块cloudalibaba-config-nacos-client3377

依赖:

<dependencies>
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

bootstrap.yml:

server:
port: 3377 spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: ip:8848 #Nacos服务注册中心地址(本机的写localhost)
config:
server-addr: ip:8848 #Nacos作为配置中心地址(本机的写localhost)
file-extension: yml #指定yml格式配置

启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}

二.Nacos匹配规则

文档:Nacos 融合 Spring Cloud,成为注册配置中心

官网的配置要求:

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

根据官网的要求,配置名为:

nacos-config-client-dev.yml

三.Nacos配置发布和更新:

Nacos控制台添加配置,发布:

运行3377,测试:

修改version为2,发布,查看配置动态刷新,成功:

②分类配置概念

Nacos的配置通过Namespace+Group+Data ID三者共同构建

设计思想:类似Java中的包名和类名

  • NameSpace用于区分部署的环境

  • Group和DataID逻辑上区分两个目标对象

默认:

Namespace=public,Group=DEAFAULT_GROUP,默认Cluster为DEFAULT

上图的Service就是微服务(整体),一个Service可以有多个Cluster(集群)

Nacos默认Cluster是DEFAULT,Cluster是对一个指定微服务的虚拟划分,比如Service有两个集群,分别在上海和南京。

如上图,Cluster1起名称叫做SH(代表上海的集群),Cluster2起名NJ(代表南京的集群),这样可以让一个机房微服务互相调用。

Instance就是微服务实例,比如Provider实例和Consumer实例

③分类配置实操

一.通过DataID配置(最小)

通过DataID来区别配置:devtest

上面我们配置了dev的配置,下面我们再配置一个test,方法同上次配置。

1.修改nacos配置

2.修改client的active指定

spring:
profiles:
active: test #表示开发环境 dev和test

3.测试,成功:

二.通过Group配置(中)

1.新建配置nacos-config-client-info.yml,设置组为TEST_GROUP

可以看到如果不设置GROUP,默认为DEFAULT_GROUP

2.client项目bootstrap.yml设置gruop配置

3.application.yml修改info(为了对应上面nacos的info)

4.重启测试,成功:

三.通过NameSpace配置(最大)

1.在nacos上新建命名空间:dev和test

2.配置完命名空间后能够看到配置管理的信息:

3.在dev的namespace中创建配置,稍微修改前面的配置:

4.测试:

5、Nacos集群和持久化(重点)

Nacos使用嵌入式的数据库(derby)实现数据的存储,在多节点下,数据存在一致性问题

在前面,我们重启Nacos,数据仍然保留的(就类似于QQ使用SqlLite)

如何解决???

Nacos可以使用集中存储的方式支持集群化部署,目前仅支持Mysql(0.7版本后支持)

①单节点环境搭建

单间点使用Mysql,首先演示解决数据一致性使用Mysql操作

一.环境版本(请务必对应!!)

如果你使用错误的版本会出现许多的问题

经过查询:1.4.0以下使用的mysql驱动是8.0以下的,1.4.0以上使用的驱动就是8.0以上的,使nacos和数据库的版本对应。

  • Mysql8.0

  • Nacos2.2

二.Mysql安装

1.安装启动

 sudo docker run -d -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name  mysql mysql:8

2.获取数据库初始化sql脚本mysql-schema.sql

在linux上创建/data/conf文件夹后面使用

docker cp nacos-standalone:/home/nacos/conf/mysql-schema.sql /data/nacos/mysql-schema.sql

该脚本保存至/data/conf下

3.运行sql脚本

三.Nacos配置

注:如果你在这里出错了,容器无法运行,你也无法进入容器修改配置文件。

所以我推荐你使用挂载的方式来运行nacos

下面我们会使用到Nacos的application.properties配置文件,将这个文件挂载到外部,你可以使用我的nacos配置文件,免除启动临时容器复制的麻烦

查看你的nacos版本是否与我一致:2.2.0

application.properties 放在/datat/nacos下

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

1.创建Nacos容器

docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -p 8848:8848 -v /data/nacos/application.properties:/home/nacos/conf/application.properties -d nacos/nacos-server

2.修改application.properties配置文件

Nacos官网配置信息:

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

3.重启Nacos

4.测试:

在Nacos上配置

查看数据库是否更新

成功!!!

②集群搭建

一.软件与版本

因为我的服务器比较拉,三台肯定顶不住,所以在此仅搭建两台,如果你的服务器牛,可以搭三台

Nginx

Nacos2.2 (两台)

Mysql8

二.Nacos搭建

启动第一台nacos

docker run -d \
--name nacos_11 \
--hostname=nacos_11 \
-e MODE=cluster \
-e NACOS_SERVERS="101.43.244.40:3333 101.43.244.40:4444" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=101.43.244.40 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=128m \
-e JVM_XMX=128m \
-e JVM_XMN=64m \
-p 3333:8848 nacos/nacos-server

启动第二台nacos

docker run -d \
--name nacos_22 \
--hostname=nacos_22 \
-e MODE=cluster \
-e NACOS_SERVERS="101.43.244.40:3333 101.43.244.40:4444" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=101.43.244.40 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=64m \
-e JVM_XMX=64m \
-e JVM_XMN=32m \
-p 4444:8848 nacos/nacos-server

三.Nginx

配置Nginx1.16.1

这里我拉取的镜像是Nginx1.16.1。

#启动nginx容器(对外暴露1111端口)
docker run -d --name nginx1.16.1 -p 1111:80 nginx:1.16.1

进入nginx容器,修改配置

因为nginx容器没有装vim,所以我们要先安装vim

apt-get update
apt-get install vim

备份nginx.conf文件

cp nginx.conf nginx.conf.bk

修改nginx.conf文件

upstream cluster{
server 10.211.55.17:3333;
server 10.211.55.17:4444;
} server{
listen 80;
server_name 101.43.244.40; location / {
proxy_pass http://cluster;
}
}

四.修改Client

修改client,使用nginx虚拟地址,让nginx转发给三台Nacos,实现注册到Nacos

Nacos入门的更多相关文章

  1. Nacos入门学习&实践

    文中涉及到了一些模块代码没有给出,我一并上传到github了,可以整个项目clone下来进行调试. 地址:https://github.com/stronglxp/springcloud-test 1 ...

  2. Spring Cloud Alibaba Nacos 入门

    概览 阿里巴巴在2018年7月份发布Nacos, Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.并表示在6-8个月完成到生产可用的0.8版本,目前版本是0.9版本. Na ...

  3. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  4. Spring Cloud Alibaba入门篇

    学习条件 了解web三层架构 熟练应用SSM架构 了解Maven管理工具的使用 熟练使用SpringBoot,以及了解SpringBoot基本原理. 了解部分术语:应用.工具.耦合.负载等 温馨提示: ...

  5. Spring Cloud - Nacos注册中心入门单机模式及集群模式

    近几年微服务很火,Spring Cloud提供了为服务领域的一整套解决方案.其中Spring Cloud Alibaba是我们SpringCloud的一个子项目,是提供微服务开发的一站式解决方案. 包 ...

  6. Spring Cloud Alibaba入门实战之nacos(一)

    Spring Cloud Alibaba入门实战之nacos(一) 前情介绍 ​ Spring Cloud Alibaba 是阿里巴巴提供的新一代的微服务解决方案,相信会有越来越多采用微服务架构的公司 ...

  7. (十八)整合Nacos组件,环境搭建和入门案例详解

    整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...

  8. nacos配置服务入门

    1.nacos服务端部署 参见官方文档:https://nacos.io/zh-cn/docs/quick-start.html 2.nacos配置中心功能使用 在pol文件中添加依赖: 在启动类中使 ...

  9. SpringBoot2 整合Nacos组件,环境搭建和入门案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以"服务"为中心的现代应用架构,如微服务范式.云原生范式等服务基础 ...

  10. 阿里开源服务发现组件 Nacos快速入门

    最近几年随着云计算和微服务不断的发展,各大云厂商也都看好了微服务解决方案这个市场,纷纷推出了自己针对微服务上云架构的解决方案,并且诞生了云原生,Cloud Native的概念. 云原生是一种专门针对云 ...

随机推荐

  1. Crond服务+Shell实现秒级任务

    服务 [root@19-v1-centos-6 ~]# chkconfig --list | grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:of ...

  2. [排序算法] 简单选择排序 (C++)

    简单选择排序原理 简单选择排序 SelectSort 是一种十分直观地排序方法.其原理是每次从未排序的元素中找到当前最小的元素,放在当前未排序序列的首位.一直重复操作直至最后未排序的元素个数为 0,即 ...

  3. 简单的sql注入1

    首先查看源码找找思路 发现源码里什么都没有 再使用bp拦截下数据 多次拦截后发现我们在 输入框里输入的等下就是id= 意思是我们这里就可以直接使用get注入了 好像类似于sql-labs上的?id= ...

  4. freemarker if 回填CheckBox思路

    开发场景中遇到这样的一个问题,在网上也找了一些结局方法,但不成功,于是自己写了一个笨一点的方法,算是一种方法,希望对遇到该开发场景的朋友有所帮助. freemarker html代码: <tab ...

  5. day29 jQuery选择器 & jquery属性操作 & jquery DOM元素 操作与遍历

    简介 jQuery,顾名思义,就是javascript和query(查询),即辅助javascript开发的库,本质就是一个js文件: jQuery是一个js函数库,是目前全球范围内最流行.用的最多的 ...

  6. 100以内能被7整除的前五个数-Java

    import java.util.HashSet; import java.util.Set; public class Demo { //100以内能够被7整除的前五个数 public static ...

  7. Java框架--SSM&Oracle&Maven高级

    〇.内容介绍 一.MyBatis01:框架概述.环境搭建及入门案例.自定义框架 1.介绍 框架:封装细节,是开发中的解决方案 三层架构与SSM的关系 表示层web:SpringMVC框架 业务层ser ...

  8. Linux—软件管理

    Linux 软件管理 1.软件管理简介 Redhat和Centos中软件管理是依靠软件包管理器(RPM)来实现的. RPM(Redhat Package Manager)软件包管理器提供了在linux ...

  9. C++面向对象程序设计期末复习笔记[吉林大学](结合历年题速成85)

    1.头文件 头文件的作用就是被其他的.cpp包含进去的.它们本身并不参与编译,但实际上,它们的内容却在多个.cpp文件中得到了编译.根据"定义只能一次"原则我们知道,头文件中不能放 ...

  10. 如何在SpringBoot中优雅地重试调用第三方API?

    前言 作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端.但你不能保证所有的事情一直都很顺利.像有些第三方API,偶尔会出现超时.此时,我们要重试几次,这取决于你的 ...