【Spring Clound】Nacos高可用集群搭建与使用

news2024/9/30 17:33:52

文章目录

  • 一、Nacos 简介
  • 二、Nacos 安装
    • 2.1、Nacos 环境依赖
    • 2.2、Nacos 服务端安装
  • 三、Nacos 部署
    • 3.1、单实例部署
    • 3.2、 集群部署
      • 3.2.1、集群架构
      • 3.2.2、模拟部署
  • 四、微服务集成Nacos
    • 4.1、依赖组件版本选型
    • 4.2、注册中心
      • 4.2.1、服务提供者
      • 4.2.2、服务消费者
      • 4.2.3、服务调用
      • 4.2.4、负载均衡
    • 4.3、配置中心
      • 4.3.1、配置中心客户端
      • 4.3.2、开启权限认证

一、Nacos 简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

nacos官网:https://nacos.io/zh-cn/docs/what-is-nacos.html

二、Nacos 安装

2.1、Nacos 环境依赖

Nacos 基于 java 开发的,运行依赖于64 bit JDK 1.8+环境。

前往官网下载JDK: Java Downloads | Oracle

2.2、Nacos 服务端安装

由于Nacos是开源的,可以从github下载源码编译后安装,也可以直接从github下载官方编译好的安装包进行安装,本文直接使用官方编译好的包进行安装,基于目前官方最新release2.0.3版本。请勿使用2.x以下的版本,之前爆出过漏洞。2.x版本相对于1.x版本,性能也提升了10倍。

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

三、Nacos 部署

3.1、单实例部署

单实例部署不适合生产环境,单点故障是致命的。

Linux 单实例非集群模式启动命令:

startup.sh -m standalone

Linux 单实例非集群模式关闭命令:

shutdown.sh

访问 nacos 管理页面,初始化用户名密码均为 nacos

访问地址:http://127.0.0.1:8848/nacos/index.html

端口默认为8848,ip需要替换为部署服务器实例的ip

3.2、 集群部署

3.2.1、集群架构

在这里插入图片描述

  • 高可用 Nginx 集群
  • Nacos 集群(至少三个实例)
  • 高可用数据库集群(取代 Nacos 内嵌数据库)

3.2.2、模拟部署

环境信息:

系统版本机器IP部署应用应用版本
CentOS8.5192.168.230.1Nginxnginx-1.18.0
CentOS8.5192.168.230.129Nacos2.0.3
CentOS8.5192.168.230.130Nacos2.0.3
CentOS8.5192.168.230.131Nacos2.0.3
CentOS8.5192.168.230.1MySQL5.7.32

使用vmware虚拟机模拟以上不同机器环境。

搭建步骤:

  1. 初始化 nacos数据库

解压下载的安装包nacos-server-2.0.3.tar.gz至/usr/local目录,找到/nacos/conf下的nacos-mysql.sql脚本

在这里插入图片描述

在MySQL实例创建 nacos库并执行sql脚本
在这里插入图片描述

修改修改 Nacos 配置文件,指向MySQL实例,替换其内嵌数据库

在这里插入图片描述

在application.properties中找到如下配置,该配置默认为注释掉的,取消注释即可,修改数据库信息为实际的数据库信息后保存。其他nacos服务实例也需要做同样的修改

在这里插入图片描述

为了达到高可用,通常会有多个MySQL数据库实例,nacos的配置文件也需要指定每一个MySQL实例的信息,例如:

在这里插入图片描述

  1. 集群配置

在/nacos/conf下找到cluster.conf.example文件,将其重命名为cluster.conf

在这里插入图片描述

修改cluster.conf文件,将其中的默认的ip信息删除,将nacos集群中每一台nacos实例的ip添加进去。集群中所有nacos实例都需要做以上集群配置,至此关于 nacos 的配置结束了,可以尝试以集群模式启动三个nacos实例了。
在这里插入图片描述

切换到/nacos/bin目录下,执行./startup.sh & tail -f /usr/local/nacos/logs/start.out

启动nacos,并查看启动日志,出现下面提示说明启动成功

在这里插入图片描述
在这里插入图片描述

此时可以通过浏览器访问每个nacos实例的控制台,例如:http://192.168.230.131:8848/nacos

说明:如果三个实例以集群模式正常启动,那么分别访问三个实例的管理页就是展示以上登录页了。如果不能访问,则可能防火墙未开放 nacos 服务的端口,可执行如下命令。

[root@localhost bin]# firewall-cmd --add-port=8848/tcp --permanent
 
success
 
[root@localhost bin]# firewall-cmd --reload
 
success

如果nacos启动时报已下异常,有以下三种原因:

在这里插入图片描述

原因一:连不上MySQL数据库,通常是由于MySQL数据库所在的宿主机没有开放3306端口导致的,在MySQL宿主机执行以下命令即可

[root@localhost bin]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@localhost bin]# firewall-cmd --reload
Success

原因二:由于nacos配置文件application.properties中默认的数据库连接超时时间设置较短,如下图,因为网络延时等原因,MySQL可能会连接超时导致nacos启动报错,因此只需要将超时时间适当设置长一些即可

在这里插入图片描述

在这里插入图片描述

原因三:虚拟机内存不足,由于在vmvare创建虚拟机时,只给每个虚拟分配了1G的内存,从nacos的启动脚本startup.sh中可知,nacos以集群模式启动时,默认分配的java堆内存空间为2G,因此可判断是由于虚拟机内存不足导致nacos启动报错,修改虚拟机内存为2G后可以正常启动。

  1. Nginx 配置

修改 Nginx 配置文件 nginx.conf如下:

http {
 
    include       mime.types;
 
    default_type  application/octet-stream;
 
    sendfile        on;
 
    keepalive_timeout  65;
 
    #nacos集群负载均衡
    upstream nacos-cluster {
        server 192.168.230.129:8848;
        server 192.168.230.130:8848;
        server 192.168.230.131:8848;
    }
 
    server {
        listen       80;
        server_name  192.168.230.1;
        location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://nacos-cluster;
        }
 
        error_page   500 502 503 504  /50x.html;
 
        location = /50x.html {
            root   html;
        }
    }
}
  1. 访问控制台

在浏览器输入Nginx服务所在宿主机的ip即可访问:

http://192.168.230.1/nacos/#/login

默认用户名/密码:nacos/nacos

在这里插入图片描述

切换至【集群管理】-【节点列表】,可查看nacos集群节点信息:

四、微服务集成Nacos

4.1、依赖组件版本选型

由于Spring Cloud Alibaba与Spring Boot 及Spring Cloud版本的兼容性要求非常严格,如果依赖选错版本,很可能会导致服务启动报错从而导致启动失败。不过alibaba官方已经给我们整理出了推荐的版本依赖关系:

在这里插入图片描述

由于我们使用的nacos是最新的2.0.3版本,从以上表格可以查询到依赖的Spring Cloud Alibaba的版本为2.2.7.RELEASE。继续根据Spring Cloud Alibaba的版本查询毕业版本依赖关系表,如下图,可以找到依赖的Spring Cloud版本为Hoxton.SR12,依赖的Spring Boot版本为2.3.12.RELEASE

在这里插入图片描述

因此,通过上述查询,最终确定微服务依赖版本选型如下:

Spring Cloud VersionSpring Cloud Alibaba VersionSpring Boot VersionNacos Version
Hoxton.SR122.2.7.RELEASE2.3.12.RELEASE2.0.3

官方版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

4.2、注册中心

首先新建demo-project-parent父工程,根据4.1 依赖组件版本选型选型确定的版本,在父pom文件统一定义好依赖的组件以及版本,如下:

<properties>
  <java.version>1.8</java.version>
  <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
  <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
  <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
</properties>
 
<dependencyManagement>
  <dependencies>
    <!-- spring boot 依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring-boot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    
    <!-- spring cloud 依赖 -->
    <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>

4.2.1、服务提供者

在父工程下新建服务提供者子模块micro-service-provider,并在pom文件引入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改provider配置文件application.yml:

server:
  port: 8081
 
spring:
  application:
    name: service-provider
  cloud:
    nacos:
      discovery:
	#nacos集群配置(Nginx)
        server-addr: 192.168.230.1:80

provider启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
 
}
Provider测试Controller类:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class ProviderController {
 
    @Value("${server.port}")
    String port;
 
    @GetMapping("/hi")
    public String hi(@RequestParam(value = "name", defaultValue = "zmx",required = false) String name) {
        return "hello " + name + ", i'm provider, my port:" + port;
    }
 
}

4.2.2、服务消费者

在父工程下新建服务消费者子模块micro-service-consumer,并在pom文件引入以下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
 
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
 
<!-- 需要注意的是引入openfeign,必须要引入loadbalancer,否则无法启动。-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

修改consumer配置文件:

server:
  port: 8082
 
spring:
  application:
    name: service-consumer
  cloud:
    nacos:
      discovery:
        #nacos集群配置(Nginx)
        server-addr: 192.168.230.1:80

在工程的启动类加上@EnableFeignClient注解,以开启FeignClient的功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
 
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
 
}

写一个feign客户端FeignClient,去调用provider服务的接口:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
 
//此处的value值对应于provider服务application配置文件中的spring.application.name
@FeignClient(value = "service-provider" )
public interface ProviderClient {
 
    @GetMapping("/hi")
    String hi(@RequestParam(value = "name", defaultValue = "zmx", required = false) String name);
 
}

写一个测试接口,让consumer去调用provider服务的接口:

import net.myibc.client.ProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class ConsumerController {
 
    @Autowired
    ProviderClient providerClient;
 
    @GetMapping("/hi-feign")
    public String hiFeign(){
        return providerClient.hi("feign");
    }
}

启动provider和consumer两个工程,在nacos的【服务管理】-【服务列表】页面查看,可见2个服务都已经注册成功:

在这里插入图片描述

注意:这里启动所有服务后,可能在控制台只能查看到某一个服务,或者查不到注册的服务,查看nacos.log日志,发现报如下异常:
在这里插入图片描述

出现该异常的原因:当nacos客户端升级为2.x版本后,新增了gRPC的通信方式,新增了两个端口。这两个端口在nacos原先的端口上(默认8848),进行一定偏移量自动生成。

端口与主端口的偏移量描述:

9848:客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求

9849:服务端gRPC请求服务端端口,用于服务间同步等

7848:Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等

因此,不难猜出,出现该问题的原因是由于nacos2.x版本新增的这两个端口没有在宿主机开启防火墙白名单,导致nacos实例之间无法进行服务间数据同步,因而在控制台无法查看到所有的服务注册实例信息。只需要在nacos宿主机执行以下命令即可:

[root@localhost bin]# firewall-cmd --add-port=9848/tcp --permanent
success
[root@localhost bin]# firewall-cmd --add-port=9849/tcp --permanent
success
[root@localhost bin]# firewall-cmd --add-port=7848/tcp --permanent
success
[root@localhost bin]# firewall-cmd --reload
Success

注意:如果是采用VIP/nginx代理集群的话,需要在nginx配置9848和9849这两个端口的TCP请求转发,否则客户端服务在启动时因为无法连接到服务端这两个端口,从而导致启动失败。如果不使用任何代理,在宿主机执行以上开启端口白名单命令后,只需要在客户端服务application配置文件里配置naocs集群的节点的ip和端口即可,配置如下:

在这里插入图片描述

Nginx配置nacos TCP转发配置:

#配置nacos TCP转发
stream {
    upstream nacos1 {
        server 192.168.230.129:9848;
        server 192.168.230.130:9848;
        server 192.168.230.131:9848;
    }
 
    server {
        listen 9848;
        proxy_pass nacos1;
    }
 
    upstream nacos2 {
        server 192.168.230.129:9849;
        server 192.168.230.130:9849;
        server 192.168.230.131:9849;
    }
 
    server {
        listen 9849;
        proxy_pass nacos2;
    }
}

4.2.3、服务调用

在浏览器上输入http://127.0.0.1:8082/hi-feign,浏览器返回响应:

hello feign, i'm provider ,my port:8081

可见浏览器的请求成功调用了consumer服务的接口,consumer服务也成功地通过feign成功的调用了provider服务的接口。

4.2.4、负载均衡

Feign使用了Spring Cloud Loadbanlancer作为负载均衡器。可以通过修改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口分别为8081 和8083。在浏览器上多次调用http://127.0.0.1:8082/hi-feign,浏览器会交替显示:

hello feign, i’m provider ,my port:8081
hello feign, i’m provider ,my port:8083
此时控制台provider的实例数会变为2:

4.3、配置中心

4.3.1、配置中心客户端

在父工程下新建nacos配置客户端子模块nacos-config-client,并在pom文件引入以下依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: 192.168.230.1:80
        file-extension: yaml
        prefix: nacos-config-client
  profiles:
    active: dev

在上面的配置中,配置了nacos config server的地址,配置的扩展名是ymal(目前仅支持ymal和properties)。注意是没有配置server.port的,sever.port的属性在nacos中配置。上面的配置是和Nacos中的dataId 的格式是对应的,nacos的完整格式如下:

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

启动nacos,登陆控制台http://192.168.230.1/nacos,创建一个Data ID ,完整的配置如图所示:

在这里插入图片描述

写一个RestController,在Controller上添加@RefreshScope注解实现配置的热加载。该注解只有加载需要动态更新配置的类上才会生效,如果将该注解加在启动类上,其他类中的动态更新是不会生效的,代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RefreshScope
public class ConfigController {
 
    @Value("${username:lily}")
    private String username;
 
    @RequestMapping("/username")
    public String get() {
        return username;
    }
}

启动工程nacos-provider,在浏览器上访问http://127.0.0.1:8084/username,可以返回在nacos控制台上配置的username的值zhangsan3。在nacos 控制台上更改username的配置为lisi,在不重启nacos-provider工程的情况下,重新访问http://127.0.0.1:8084/username,返回的是修改后的值lisi,可见nacos作为配置中心实现了热加载功能。

修改nacos中username配置前返回:
在这里插入图片描述

将nacos中username的值修改为lisi后重新请求返回:
在这里插入图片描述

注意:使用某些高版本的SpringCloud组件时,在启动nacos配置客户端服务的时候,可能会找不到bootstrap.yml配置文件,会报如下错误,只需要在系统环境变量中配置一下环境变量即可:spring.cloud.bootstrap.enabled=true

在这里插入图片描述

在这里插入图片描述

4.3.2、开启权限认证

通常情况下,为了安全起见,客户端服务在访问nacos的时候都需要通过用户名和密码认证,nacos默认是没有开启认证的,如果需要开启认证,首先需要编辑/nacos/conf/application.properties配置文件,找到nacos.core.auth.enabled=false配置项,如下图,默认是false,表示权限认证是关闭的,修改为true即可开启认证。修改完成后需要重启所有nacos实例。

在这里插入图片描述

在application配置文件中配置nacos的用户名和密码,如下图,首先将服务用户名和密码配置为一个不存在的用户,启动服务验证权限配置是否生效:

在这里插入图片描述

启动服务,发现报了以下异常,code=403和unknown user,说明权限验证失败:

在这里插入图片描述

将用户名和密码修改为正确的之后,再次启动服务,可发现服务启动正常:
在这里插入图片描述

在这里插入图片描述

至此,说明nacos的权限认证配置已生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧园区综合能源监测解决方案

随着能源消耗的日益增长和能源环境的日益严峻&#xff0c;智慧园区综合能源监测解决方案成为了当前能源管理的热点话题。智慧园区综合能源监测解决方案是一种集成化的能源监测平台&#xff0c;可以实现对园区内各种能源的实时监测、分析和管理&#xff0c;从而达到优化能源配置…

应聘软件测试,差点栽在了...这5道S级的测试用例设计题上...

1、 用例设计&#xff1a;根据下面需求&#xff0c;进行测试用例设计&#xff0c;请注意对测试点的表达。 &#xff08;网页端&#xff09;需求描述&#xff1a; 某项目的营养素配置页面&#xff0c;供用户用来配置营养素的相关信息&#xff0c;其中&#xff1a; l 项目可供用…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C&#xff0c;本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World&#xff01;”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim&#xff0c;也就是要求大…

小米的故事:创新如何将一家公司从死亡漩涡中拯救出来

小米通过在爆品体系打造、贴地的新媒体策略及小米之家新零售模式上的努力&#xff0c;成功地克服了低潮&#xff0c;在经历了两年的震荡后&#xff0c;在软件、硬件和新零售的增长飞轮上实现了新的外延&#xff0c;并在2015年至2021年期间持续增长。小米的多元化爆品和创新的零…

【pytest学习总结2】 - 如何调用pytest?

目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取关于版本、选项名称、环境变量的帮助 2.1.3 分析测试的执行的持续时间 2.1.4 管理插件的加载 2.1.5 其他调用pytest的方法 &#x1f381;更多干货 完整版文档下载方式&#xff1a; 2.1 如何调用pytest 通常…

VSCode自定义个性化console.log,快捷打印

最终效果&#xff0c;通过Ctrl Alt l快捷键打印选中值 如何自定义Console.log样式&#xff1f; 可以使用 %c 为打印内容定义样式&#xff1a; console.log("This is %cMy stylish message", "color: yellow; font-style: italic; background-color: blue;pa…

ivx低代码开发平台

前言 低代码开发平台&#xff08;Low-Code Development Platform, LCDS&#xff09;为企业和开发者提供了高效的应用开发方式。在2023年&#xff0c;中国的低代码开发平台正在快速发展&#xff0c;以下是其中最受关注的十大平台&#xff1a; iVX&#xff1a;iVX是一款新型的低代…

云从科技大模型之路:昇思“黑土地”上的生态炼成记

文 | 智能相对论 作者 | 李永华 一线客户经理&#xff0c;为客户一键生成周全的资产配置建议&#xff1b; 中端管理人员&#xff0c;获得系统自动撰写的一整套数据分析报表&#xff0c;快速、准确授信&#xff1b; 金融市场的“操盘手”&#xff0c;能够实时获取那些影响市…

系统性能测试流程总结

一、测试前期准备 1、确定用户、业务、系统需求&#xff08;目标&#xff09; 1&#xff09;确定客户的需求和期望 在需求分析和文档的支持下&#xff0c;需要对软件系统上的用户业务使用情况进行分析&#xff0c;提出我们所关注的性能测试需求&#xff0c;并告知业务人员。…

2023-6-26-第八式装饰器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

【FFmpeg实战】视频解码流程

原文链接&#xff1a;https://blog.csdn.net/weekend_y45/article/details/125168344 一、解码流程使用到的FFmpeg结构体说明 1、AVFormatContext结构体 该结构体描述了一个媒体文件或媒体流的构成和基本信息。它是一个贯穿始终的数据结构&#xff0c;很多函数调用需要使用到…

【云原生丶Docker】理解Docker的核心概念

Docker的核心优势是什么&#xff1f; 在 什么是虚拟化技术&#xff1f; 一文中&#xff0c;我们对虚拟机和 Docker 都有了简单的了解&#xff0c;需要的小伙伴可以自行跳转回顾~ Docker与传统虚拟化技术有什么区别&#xff1f; Docker 相比传统的虚拟机技术更轻量级&#xff0…

TikTok上的中国商品,老外买上瘾了!

在TikTok的全球影响力下&#xff0c;一些中国商品正实现销量的创纪录增长 2022年底&#xff0c;TikTok发了其第五份“Year on TikTok”年度报告&#xff0c;概述了过去12个月TikTok平台上热度最高的创作者、视频内容&#xff0c;以及#TikTokMadeMeBuyIt标签下最热门的5大产品&…

c语言printf输出格式(%d %f %e %x)

一、%d第一组&#xff1a;%d %nd %-nd第二组&#xff1a;%d %0nd %-0nd %.nd第三组&#xff1a;%d %m.nd %-m.nd 二、%f%f %.nf %m.nf %-m.nf 三、%e%e %.ne %me %-me %m.ne %-m.ed 四、%x%x %0nx %nx %-nx 一、%d 第一组&#xff1a;%d %nd %-nd ①n表示输出宽度&#xff08…

深度学习中使用的16位浮点数格式

深度学习中使用的16位浮点数格式 flyfish 文章目录 深度学习中使用的16位浮点数格式浮点数是一个近似值浮点数的表示float单精度类型 和 double双精度类型 的比较查看所占的字节数大小端的比较计算方法16位 float 半精度格式bflat16格式bflat16格式 与 float32单精度格式 比较…

手敲MyBatis(十二章)-ResultMap解析映射使用

1.前言 这一章节主要解决好几章之前留下的坑&#xff0c;需要根据XML配置的ReultMap进行解析映射成具体的PO供用户使用。 我们本章就来解决下在xml中配置了如下标红框的内容&#xff0c;怎么解析映射到具体的实体类中&#xff0c;如下就是将id为activityMap的resultMap怎么解…

发送图文并茂的html格式的邮件

本文介绍如何生成和发送包含图表和表格的邮件&#xff0c;涉及echarts图表转换为图片、图片内嵌到html邮件内容中、html邮件内容生成、邮件发送方法等 一、图表处理 因为html格式的邮件不支持echarts,也不支持js执行&#xff0c;所以图表需要转换为图片内嵌在邮件内容中 因为平…

Sui Builder House京都站倒计时!

Sui Builder House京都站将于6月29日-30日举行&#xff0c;为世界各地的开发者提供身临其境地学习和交流的机会。查看Sui Builder House京都站的五个亮点 活动信息 &#x1f4c6; Builder House时间&#xff1a;2023年6月29日 — 6月30日 &#x1f4cd; 活动地址&#xff1a;…

NetSuite OAuth1.0中InvalidSignature问题

本周闭关写代码&#xff0c;用Java通过TBA方式访问NetSuite REST Webservices。由于是手生&#xff0c;卡在InvalidSignature报错上&#xff0c;在这个问题上被卡了一整天。 直到终于到来的Aha时刻。 在NetSuite中的样例代码是PHP的&#xff0c; 我平移到Java后&#xff0c;代码…

【云原生丶Docker】虚拟化技术简介

什么是虚拟化技术&#xff1f; Docker 是一款基于容器虚拟化技术构建的软件&#xff0c;那到底什么虚拟化技术呢&#xff1f;在学习 Docker 之前&#xff0c;先简单了解下虚拟化技术。 虚拟化是云原生的实现基础&#xff0c;它能够帮助我们更加有效地利用物理计算机硬件。 虚…