[Spring] Nacos详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343

🏵️热门专栏:

🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482

🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482

🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482

🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482

🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482

🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482

🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482

🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482

感谢点赞与关注~~~

目录

  • [1. Nacos简介](#1. Nacos简介)
  • [2. 安装Nacos](#2. 安装Nacos)
    • [2.1 下载安装包](#2.1 下载安装包)
    • [2.2 Windows环境下安装](#2.2 Windows环境下安装)
      • [2.2.1 解压](#2.2.1 解压)
      • [2.2.2 修改配置为单机模式](#2.2.2 修改配置为单机模式)
      • [2.2.3 启动Nacos](#2.2.3 启动Nacos)
    • [2.3 Linux](#2.3 Linux)
      • [2.3.1 准备安装包](#2.3.1 准备安装包)
      • [2.3.2 单机模式启动](#2.3.2 单机模式启动)
  • [3. Nacos快速上手](#3. Nacos快速上手)
    • [3.1 服务注册/服务发现](#3.1 服务注册/服务发现)
    • [3.2 在配置文件中配置nacos服务地址](#3.2 在配置文件中配置nacos服务地址)
    • [3.3 远程调用](#3.3 远程调用)
    • [3.4 启动服务](#3.4 启动服务)
    • [3.5 启动多个服务,测试负载均衡](#3.5 启动多个服务,测试负载均衡)
  • [4. Nacos负载均衡调整策略](#4. Nacos负载均衡调整策略)
    • [4.1 服务下线](#4.1 服务下线)
    • [4.2 权重配置](#4.2 权重配置)
      • [4.2.1 配置权重](#4.2.1 配置权重)
      • [4.2.2 开启Nacos负载均衡策略](#4.2.2 开启Nacos负载均衡策略)
    • [4.3 同集群优先访问](#4.3 同集群优先访问)
      • [4.3.1 给集群配置名称](#4.3.1 给集群配置名称)
  • [5. Nacos健康检查](#5. Nacos健康检查)
    • [5.1 两种健康检查机制](#5.1 两种健康检查机制)
    • [5.2 Nacos服务实例类型](#5.2 Nacos服务实例类型)
  • [6. Nacos环境隔离](#6. Nacos环境隔离)
    • [6.1 创建namespace](#6.1 创建namespace)
    • [6.2 为实例配置所属的命名空间](#6.2 为实例配置所属的命名空间)
    • [6.3 测试远程调用](#6.3 测试远程调用)
  • [7. Nacos配置中心](#7. Nacos配置中心)
    • [7.1 为什么需要配置中心](#7.1 为什么需要配置中心)
    • [7.2 快速上手](#7.2 快速上手)
      • [7.2.1 添加配置](#7.2.1 添加配置)
      • [7.2.2 在项目中获取配置内容](#7.2.2 在项目中获取配置内容)
    • [7.3 配置中心详解](#7.3 配置中心详解)
  • [8. Nacos和Eureka的区别](#8. Nacos和Eureka的区别)

1. Nacos简介

Nacos 是阿里巴巴开源的一款易于使用的动态服务发现、配置管理和服务管理平台,致力于帮助用户更轻松地构建、管理和维护微服务架构.功能类似于Eureka,但是又比Eureka强大.

官方网站: https://nacos.io/

仓库: https://github.com/alibaba/nacos

2. 安装Nacos

在我们学习阶段中,采用的都是单机安装即可.在实际的工作中,我们可能需要采用集群模式.

2.1 下载安装包

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

我们下载的时候推荐下载的版本是2.2.3版本,因为这个版本比较稳定,若是要下载其他的版本:
https://github.com/alibaba/nacos/releases

2.2 Windows环境下安装

2.2.1 解压

把压缩包解压到任意非中文 的目录之下.

  • startup.cmd: windows操作系统的启动脚本
  • startup.sh: Linux操作系统的启动脚本
  • shutdown.cmd :windows操作系统的停止脚本
  • shutdown.sh :Linux操作系统的停止脚本

conf: Nacos配置文件

target: 存放Nacos应用的jar包

2.2.2 修改配置为单机模式

Nacos默认启动方式为集群,启动之前需要修改配置为单机模式

  1. 使用记事本打开startup.cmd
  2. 26行左右,修改启动模式
    set MODE="cluster"修改为set MODE="standalone".

2.2.3 启动Nacos

双击startup.cmd即可启动Nacos.

在Windows环境下启动的默认端口号是8848.如果端口号发生冲突,也可以通过修改文件:${Nacos目录}/conf/application.properties,端口号的配置大概在23行左右.

访问Nacos主页,http://127.0.0.1:8848/nacos出现以下的页面,表示Nacos启动成功.

2.3 Linux

2.3.1 准备安装包

  1. 上传提前下载好的安装包到服务器上的某个目录.
  2. 安装解压缩软件
shell 复制代码
apt-get install unzip
  1. 解压安装包
shell 复制代码
unzip ${上传的安装包的名称}

进入解压缩之后的目录:

shell 复制代码
root@hcss-ecs-0bb1:/usr/local/src/nacos# pwd
/usr/local/src/nacos
root@hcss-ecs-0bb1:/usr/local/src/nacos# ll
total 44
drwxr-xr-x 5 root root 4096 May 25 2023 ./
drwxr-xr-x 3 root root 4096 Dec 25 15:07 ../
drwxr-xr-x 2 root root 4096 May 25 2023 bin/
drwxr-xr-x 2 root root 4096 May 25 2023 conf/
-rw-r--r-- 1 root root 16583 Mar 6 2023 LICENSE
-rw-r--r-- 1 root root 1305 May 14 2020 NOTICE
drwxr-xr-x 2 root root 4096 May 25 2023 target/

2.3.2 单机模式启动

进入nacos/bin目录,输入以下的命令.

shell 复制代码
bash startup.sh -m standalone

注意: 上述为Ubuntu系统的命令,在nacos安装之前,需要先安装openjdk.

启动成功之后,访问Nacos链接:http://IP:port/nacos.

10020为修改后的端口号,需要在服务器上开放对应的端口号

另外,再开放Nacos端口号 +1000 和Nacos端口号+1001 的端口

比如端口号为10020,则需要开放端口号为:10020,11020,11021

端口号为8848,则需要开放端口号为:9848,9849.

3. Nacos快速上手

Nacos是SpringCloud Alibaba的组件,SpringCloud Alibaba遵循SpringCloud中定义的注册服务,服务发现的规范,因此使用Nacos和使用Eureka对于微服务来说,没有什么太大的区别,两者都具有服务注册和服务发现的功能.

主要差异在于:

  • Eureka需要在项目中自己再搭建一个服务,比如我们之前搭建的eureka-service,而Nacos不需要自己搭建服务,安装之后开箱即用.
  • 对应的依赖和配置不同

3.1 服务注册/服务发现

  1. 引入SpringCloud Alibaba依赖
    首先在父工程的pom文件中的<dependencyManagement>中引入SpringCloud Alibaba的依赖:
xml 复制代码
<properties>
	<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<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>

注意: SpringBoot和SpringCloud的版本是有一定的对应关系的.Spring Cloud Alibaba也遵循Spring Cloud的标准,在引入依赖的时候,一定要确认各个版本之间的对应关系.具体的对应关系,可以参考:
https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/

  1. 引入Nacos依赖
    在两个子模块order-service和product-service中引入Nacos的依赖.order-service需要发现服务,product-service需要注册服务,注册服务和发现服务需要引入的依赖是一样的.
xml 复制代码
<dependency> 
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

同时引入LoadBalancer依赖

xml 复制代码
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

3.2 在配置文件中配置nacos服务地址

我们可以使用Windows本地环境下的Nacos,也可以使用Linux环境下的服务器Nacos.

yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3.3 远程调用

首先添加负载均衡,之后使用项目名称远程调用

  1. 使用@LoadBalanced为RestTemplate添加负载均衡
java 复制代码
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  1. 把IP和端口改为应用名进行调用
java 复制代码
@Service
@Slf4j
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    //设置原子类
    public OrderInfo selectOrder(Integer id){
        OrderInfo orderInfo = orderMapper.selectOrderById(id);
        //把获取到的服务URL拼接到远程调用的URL中
        String url = "http://product-service/product/select?id=" + orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

3.4 启动服务

启动服务之后,我们发现在Nacos的管理界面上,发现order-service和product-service都注册在了Nacos上.

测试接口是否可以调用成功:http://127.0.0.1:8080/order/select?id=1

远程调用成功,说明服务注册和服务发现都是正常的.

3.5 启动多个服务,测试负载均衡

启动三个product-service服务

我们发现,product-service的服务的实例数变为了3个.

接着调用接口,观察控制台日志:


我们发现,发送的请求比较均匀地散落在了该服务上的三个实例上.

4. Nacos负载均衡调整策略

当生产环境比较恶劣的,我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等.

4.1 服务下线

当某一个结点上接口的性能较差或者是发生为止错误的时候,我们需要及时止损,对结点进行下线.

操作步骤; 服务--->详情--->下线

例如我们对9092服务进行下线:在多次调用API接口的时候,发现9092端口的服务实例没有请求进来

再次单击上线即可对实例再次进行上线:

4.2 权重配置

除了下线之外,我们也可以配置这个结点的流量权重.

4.2.1 配置权重

操作步骤: 详情--->编辑--->权重

在多次调用接口之后,我们通过观察后台日志发现,权重并没有生效.下面我们就来解释为什么.

4.2.2 开启Nacos负载均衡策略

如果我们在pom文件中引入了SpringCloud LoadBalance,由于SpringCloud LoadBalance组件自身有负载均衡配置方式,所以不支持Nacos的权重属性配置 .

我们需要在配置文件中手动开启Nacos的负载均衡策略,让权重配置生效.

yml 复制代码
spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

接下来再次对权重配置进行测试,我们发现,权重配置生效,9092实例的请求数量明显减少.

4.3 同集群优先访问

Nacos把同一个机房内的实例,划分为一个集群,同一个集群在同一个局域网之内,所以同集群优先访问.在一定程度上可以理解为同机房优先访问.

微服务架构中,一个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可以分布在不同的机房,比如product-service:

实例1,2: 分布在北京机房.

实例3,4: 分布在上海机房.

微服务访问的时候,应该尽量访问同一个局域网中的实例,当本机房的实例不可用的时候,才访问其他机房的实例.

4.3.1 给集群配置名称

  1. 为product-service配置集群名称
yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: shanghai

当9090这个端口的实例启动的时候,默认就会在上海集群中.

复制product-service启动配置,添加虚拟机选项

配置9091和9092端口号的实例为北京集群:

-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=beijing

配置9092端口号实例为北京集群.
-Dserver.port=9092 -Dspring.cloud.nacos.discovery.cluster-name=beijing

观察Nacos,beijing集群下多了两个实例

  1. 为order-service配置集群名称为shanghai.
yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: shanghai

开启Nacos负载均衡策略:

yml 复制代码
spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

重新启动实例进行测试:

多次调用接口,观察日志,会发现只有9090端口的实例收到了请求.而9090端口和order-service都是在上海集群.

我们把9090端口下线之后,发现请求就来到了北京集群中:

5. Nacos健康检查

5.1 两种健康检查机制

Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务.

Nacos中提供了两种健康检查机制:

  1. 客户端主动上报机制
    • 客户端通过心跳上报的方式告知Nacos服务中心的健康状态,默认的心跳间隔是5秒.
    • Nacos会在超过15秒之内未接收到心跳之后将实例设置为不健康的状态,超过30秒将实例删除.
  2. 服务器反向探测机制
    • Nacos主动探知客户端健康状态,默认间隔为20秒.
    • 健康检查失败之后实例会被标记为不健康,但是不会被立即删除.

正式工和临时工:

临时工需要主动向上级汇报自己的工作,如果超过一定时间没有汇报工作,领导默认该员工已经离职(把实例删除)

正式工需要领导主动询问工作状态,如果超过一定时间没有来上班,不能立即开除(不会立即删除实例),因为还需要一些劳动合同的后续问题等待处理.

Nacos的健康检查机制不是主动设置的,而是和服务实例的类型相关的.也就是和正式工还是临时工相关.

5.2 Nacos服务实例类型

Nacos的服务实例分为临时实例和非临时实例.

  • 临时实例: 如果结点宕机超过一定的时间,会从服务列表中剔除.也是默认的服务实例类型.
  • 非临时实例: 如果实例宕机,不会从服务列表中立即剔除,会标记为不健康的实例,也可以叫做永久实例.

nacos对临时实例采用主动上报机制,对非临时实例采用主动探测机制.

我们可以通过配置文件来配置一个服务实例为永久实例.

yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为⾮临时实例

配置好之后,停止服务.

如果在这个时候重新启动服务的时候,我们就会发现程序会报出一下错误:

Caused by: com.alibaba.nacos.api.exception.NacosException: failed to req 
API:/nacos/v1/ns/instance after all servers([110.41.51.65:10020]) tried: 
caused: errCode: 400, errMsg: Current service DEFAULT_GROUP@@product-service is
ephemeral service, can't register persistent instance. ;

原因就是Nacos会记录每个服务实例的端口号和IP,如果重启服务之后发现端口号和IP都没有发生变化,那么Nacos就不允许一个服务实例的类型发生变化.

解决办法:

删除nacos目录之下的data/protocol/raft中的所有信息.里面保存的是服务实例的元数据信息 .

重新启动服务,查看nacos工作台:

我们发现实例product-service的实例全部变为了永久实例.

当我们停止掉实例的时候,也不会从列表中删除.只是健康状态会被标记为false.

6. Nacos环境隔离

企业开发中,一个服务会分为开发环境,测试环境和生产环境.

通常的情况之下,这几个环境是不能够相互通信的,nacos提供了namespace(命名空间)来实现环境之间的隔离.不同的namespace的服务相互不可见.

6.1 创建namespace

默认情况下,所有的服务都在同一个namespace,名为public.

点击左侧的命名空间,可以对namespace进行操作.

可以新增命名空间:

6.2 为实例配置所属的命名空间

namespace创建完成之后,可以对服务进行配置

比如我们修改order-service的命名空间,注意配置文件中需要填写命名空间的id.

yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        namespace: 	e3dcfb79-c0cf-4588-8bc5-7d057c5e09f3

6.3 测试远程调用

如果我们只修改order-service的命名空间而不修改product-service的命名空间,服务的远程调用就会失败.

  1. 两个服务不在一个命名空间之内

  2. 服务远程调用失败

接下来我们修改product-service的命名空间为dev,再次进行接口调用的时候就不会出现远程调用失败.

7. Nacos配置中心

除了注册中心和负载均衡之外,nacos还是一个配置中心,具备配置管理的能力

Namespace的常用场景之一是不同环境的配置区分隔离,例如开发测试环境和生产环境的配置隔离.

7.1 为什么需要配置中心

当前项目的配置都在代码中,会存在以下的问题:

  1. 配置文件修改的时候,服务需要重新部署,微服务架构中,一个服务可能有成百上千个实例,挨个部署比较麻烦,而且容易出错.
  2. 多人开发的时候,配置文件可能要经常修改,使用同一个配置文件容易冲突.

配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件.

  • 服务启动的时候,从配置中心读取配置项的内容,进行初始化.
  • 配置项修改的时候,通知微服务,实现配置的更新加载.

7.2 快速上手

7.2.1 添加配置

在nacos控制台添加配置项

注意: 配置管理的命名空间和服务列表的命名空间是相互独立的,两个是分别设置的,互不干扰.也就是服务管理的命名空间!=配置管理的命名空间

比如我们配置的内容是:

nacos.test.num=5

注意,配置文件是什么格式的,配置格式就选择什么.

说明:

  1. DataID为项目名称,即spring.appliaction.name.
  2. 配置内容的数据格式,目前只支持properties和yaml类型.

7.2.2 在项目中获取配置内容

  1. 引入Nacos Config依赖和BootStrap依赖
xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  1. 配置bootstrap.properties
    在微服务启动之前,需要先获取Nacos中的配置,获取之后与application.yml配置合并 .在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server地址,配置地址之后,需要通过DataID获取配置文件.

    spring.application.name=product-service
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848

说明: spring.application.name需要和nacos配置管理的DataID一致.
spring.cloud.nacos.config.server-add为nacos server的地址.

从配置中我们也可以看出来配置中心和注册中心是隔离的

Nacos配置中心: spring.cloud.nacos.config.server-add

Nacos注册中心: spring.cloud.nacos.discovery.server-addr

  1. 编写程序
java 复制代码
@RestController
@RefreshScope//使用该注解配置热更新
@RequestMapping("/config")
public class NacosController {
    @Value("${nacos.test.num}")//使用Value读取配置
    private int config;
    @RequestMapping("/get")
    public int getConfig(){
        return config;
    }
}
  1. 启动服务,调用API接口进行测试
    http://127.0.0.1:9092/config/get

    在Nacos控制台修改配置为6.

    再次访问接口,值发生了改变.

    [注意]
    如果我们不添加@RefreshScope注解,我们修改配置为18之后再次进行接口调用.

    我们发现读取出来的配置还是6.配置不会进行热更新.

7.3 配置中心详解

7.3.1 设置命名空间

Nacos配置管理的命名空间和服务列表的命名空间是分别设置的.默认是public

Nacos命名空间配置依然在bootstrap.properties中进行配置.

spring.cloud.nacos.config.namespace=057de3f3-1bc3-42dc-b6ea-01fa8f744172

配置管理的命名空间可以直接复制下来:

如果为服务设置了命名空间之后,项目启动的时候,会从该命名空间之下找到对应的配置项 .

下面进行测试:

首先在dev环境下创建配置文件.nacos.test.num=10

之后启动项目,调用接口,观察结果:

我们发现调用之后的结果就是我们配置的结果.

7.3.2 DataID

DataID格式介绍

在Nacos SpringCloud中,DataID的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置.
  • spring.profile.active即为当前环境对应的profile.当spring.profile.active为空时,对应的连接符-也不复存在.DataID的拼接格式变成${prefix}.${fileextension}.该配置一般是实现多环境的配置管理.
  • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持properties类型和yaml类型.默认是properties类型.

服务启动的时候,服务会按照bootstrap配置文件中的配置去读取对应的配置文件,读取的优先级如下:

  1. 首先读取${prefix}-${spring.profiles.active}.${file-extension}配置文件.比如product-service-dev.properties.
  2. 如果上面这个不存在,读取${prefix}.${file-extension},比如product-service.properties.
  3. ${prefix}比如product-service.

注意: spring.profiles.active,spring.cloud.nacos.config.prefix等配置项在配置文件中指定的时候,必须指定在bootstrap.properties文件中.

测试

bootstrap配置文件如下:

spring.application.name=product-service
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=057de3f3-1bc3-42dc-b6ea-01fa8f744172

之后在配置中心的dev命名空间之下添加如下的配置:

之后调用API接口,来查看配置文件的读取优先级:

第一次读取:读取的是product-service-dev.properties配置文件

第二次读取: 删除product-service-dev.properties,读取的是product-service.properties的配置

第三次读取: 删除product-service.properties,读取的是product-service.

8. Nacos和Eureka的区别

  • 共同点:
    都支持服务注册和服务发现.
  • 区别:
    • 功能上: Nacos处理服务发现和服务注册,还提供了配置中心,流量管理(实例上下限和权重配置),DNS服务(把服务名称转换为IP地址和端口号)等功能.
    • CAP理论: eureka遵循的是AP原则,Nacos可以切换为AP和CP模式,默认是AP .Nacos根据配置识别CP或者AP模式,如果注册Nacos的Client的结点是临时节点,那么Nacos对这个结点就是AP效果,反之是CP.AP和CP可以同时混合存在.
    • 服务发现: Eureka基于拉取模式,EurekaClient会定期从Server中拉取服务信息,默认30秒拉取一次.Nacos基于推送模式.服务列表有变化时会实时推送给订阅者,服务端和客户端保持心跳连接.
相关推荐
陈平安Java and C1 小时前
MyBatisPlus
java
秋野酱1 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇2 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
Bunny02122 小时前
SpringMVC笔记
java·redis·笔记
blammmp2 小时前
Java EE 进阶:Spring MVC(1)
spring·java-ee·mvc
架构文摘JGWZ2 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC2 小时前
Swift语言的网络编程
开发语言·后端·golang
feng_blog66882 小时前
【docker-1】快速入门docker
java·docker·eureka
邓熙榆2 小时前
Haskell语言的正则表达式
开发语言·后端·golang
枫叶落雨2224 小时前
04JavaWeb——Maven-SpringBootWeb入门
java·maven