当前位置: 首页 > news >正文

【server】3、注册中心与配置中心

1、服务注册与发现

1.1、consul

1.1.1 是什么

官网: Consul by HashiCorp

spring-cloud-consul: Spring Cloud Consul :: Spring Cloud Consul

gitHub 官网 :GitHub - hashicorp/consul: Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.

1.1.2 能干什么

1.1.3 怎么用

1.1.3.1 官网下载地址

安装网页:Install Consul | Consul | HashiCorp Developer

windows版本:

下载链接:Install | Consul | HashiCorp Developer

windows版本只有一个exe文件,进入对应的文件夹,通过cmd命令,在cmd命令面板中心开发模式运行:consul agent -dev

访问:http://localhost:8500

1.1.4、discovery

1.1.4.1 服务提供者
1.1.4.1.1 引入maven依赖

参考链接:Quick Start :: Spring Cloud Consul

<!--SpringCloud consul discovery -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
1.1.4.1.2 yml 配置

参考链接: Service Discovery with Consul :: Spring Cloud Consul

####Spring Cloud Consul for Service Discovery
spring:cloud:consul:discovery:instance-id: custom-service-idserviceName: myprefix-${spring.application.name}

1.1.4.1.3 修改启动类

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

consul 发现结果:

1.1.4.2 服务消费者
1.1.4.2.1 引入maven 依赖
<!--SpringCloud consul discovery -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
1.1.4.2.2 yml 配置
spring:application:name: cloud-consumer-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}
1.1.4.2.3 修改启动类
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
public class Main80
{public static void main(String[] args){SpringApplication.run(Main80.class,args);}
}
1.1.4.2.4 修改服务提供者链接
@RestController
public class OrderController
{//硬编码//public static final String PaymentSrv_URL = "http://localhost:8001";//服务注册中心上的微服务名称public static final String PaymentSrv_URL = "http://cloud-payment-service";
}
1.1.4.2.5 修改RestTemplateConfig
@Configuration
public class RestTemplateConfig
{//添加负载均衡 LoadBalanced    @Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

结果:

1.2、nacos

1.2.1 是什么

官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网

gitHub 官网:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.

1.2.2 能干什么

Nacos 提供了四大功能:

  • 服务发现和服务健康检查
  • 动态配置管理
  • 动态域名解析服务
  • 服务和元数据管理

1.2.3 怎么用

1.2.3.1 官网下载地址

官网安装地址:Nacos 快速开始 | Nacos 官网

windows 启动: 进行对应的bin目录 ,在cmd 下执行 startup.cmd -m standalone

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

1.2.4 discovery

1.2.4.1 服务提供者
1.2.4.1.1 改POM
<!--添加 nacos-discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.2.4.1.2 改YML
spring:cloud:nacos:discovery:server-addr: localhost:8848service:  ${spring.application.name}
1.2.4.1.3 改启动类
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan({"com.hc.cloud.mapper"})
public class Payment {public static void main(String[] args) {SpringApplication.run(Payment.class, args);}
}
1.2.4.1.4 改业务类
@RestController
public class PayAlibabaController
{@Value("${server.port}")private String serverPort;@GetMapping(value = "/pay/nacos/{id}")public String getPayInfo(@PathVariable("id") Integer id){return "nacos registry, serverPort: "+ serverPort+"\t id"+id;}
}
1.2.4.2 服务消费者
1.2.4.2.1 改POM
<!--nacos-discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
1.2.4.2.2 改YML
service-url:nacos-user-service: http://payment
1.2.4.2.3 修改启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Main80 {public static void main(String[] args) {SpringApplication.run(Main80.class, args);}
}
1.2.4.2.4 修改RestTemplate
@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
1.2.4.2.5 修改业务类
@RestController
public class PaymentController {@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String paymentUrl;@GetMapping("/consumer/consul/payment/get/all")public ResultData<List<PayVo>> getAllPayments() {return restTemplate.getForObject(paymentUrl + "/pay/get/all",  ResultData.class);}
}

1.3、zookeeper

1.3.1 是什么

1.3.2 能干什么

    • 统一命名服务
    • 统一配置管理
    • 统一集群管理
    • 服务器节点动态上下线
    • 软负载均衡

1.3.3 怎么用

下载页面地址:Apache ZooKeeper

zookeeper Getting Started Guide : ZooKeeper: Because Coordinating Distributed Systems is a Zoo

1.3.3.1 单机版配置
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
#解决 8080绑定异常
#org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
#Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080
admin.serverPort=8888
1.3.3.2 集群版配置
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
admin.serverPort=8888

1.3.4 zookeeper 使用

1.3.4.1 服务器启动
#启动服务器
bin/zkServer.sh start
#客户端连接
bin/zkCli.sh -server 127.0.0.1:2181
1.3.4.2 改pom
<!-- spring-cloud-zookeeper -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions>
</dependency>
<!--选择对应zookeeper 服务的版本,这里选择的zookeeper版本为3.9.1-->
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.1</version>
</dependency>
1.3.4.3 改yaml
#对应的服务上,在common上配置不生效
spring:application:name: consumercloud:zookeeper:connect-string: 192.168.10.131:2181discovery:enabled: trueroot: /servicesregister: trueservice-url:zk-user-service: http://payment
1.3.4.4 改启动类
//添加 EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class Main80 {public static void main(String[] args) {SpringApplication.run(Main80.class, args);}
}
1.3.4.5 改config
@Configuration
public class RestTemplateConfig {//添加LoadBalanced@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
1.3.4.6 改业务类
@RestController
public class PaymentController {@Resourceprivate RestTemplate restTemplate;@Value("${service-url.zk-user-service}")private String paymentUrl;@GetMapping("/consumer/consul/payment/get/all")public ResultData<List<PayVo>> getAllPayments() {return restTemplate.getForObject(paymentUrl + "/pay/get/all",  ResultData.class);}
}

启动服务即可看到注册结果

请求正常

1.4、euraka

过时

1.5 注册中心比较

Nacos

Eureka

Consul

CoreDNS

ZooKeeper

一致性协议

CP+AP

AP

CP

-

CP

健康检查

TCP/HTTP/MYSQL/Client Beat

Client Beat

TCP/HTTP/gRPC/Cmd

-

Keep Alive

负载均衡策略

权重/metadata/Selector

Ribbon

Fabio

RoundRobin

-

雪崩保护

自动注销实例

支持

支持

支持

不支持

支持

访问协议

HTTP/DNS

HTTP

HTTP/DNS

DNS

TCP

监听支持

支持

支持

支持

不支持

支持

多数据中心

支持

支持

支持

不支持

不支持

跨注册中心同步

支持

不支持

支持

不支持

不支持

Spring Cloud集成

支持

支持

支持

不支持

支持

Dubbo集成

支持

不支持

支持

不支持

支持

Kubernetes集成

支持

不支持

支持

支持

不支持

2、配置中心

2.1 作用

统一集中管理,微服务的配置文件

2.2 各配置中心

2.2.1 consul

2.2.1.1 配置pom
<!--SpringCloud consul config-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.2.1.2 配置yml

#在resource 下添加bootstrap.yml
# 配置bootstrap.yml
spring:###配置项目名    application:      name: cloud-payment-service    ####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAML
#application.yml
server:port: 8001# ==========applicationName + druid-mysql8 driver===================
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=trueusername: rootpassword: 123456profiles:active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置# ========================mybatis===================
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.atguigu.cloud.entitiesconfiguration:map-underscore-to-camel-case: true
2.2.1.3 consul yaml 配置格式
# consul 配置文件格式
# config/cloud-payment-service/data
#       /cloud-payment-service-dev/data
#       /cloud-payment-service-prod/data
#文件夹时,以/结尾

2.2.2 spring cloud conf

2.2.3 nacos

2.2.3.1 配置POM
<!--bootstrap-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--nacos-config-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2.3.2 配置yml
#bootstrap.yml
# nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址#指定IP地址ip: 127.0.0.1config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置#application.yml
server:port: 3377spring:profiles:active: dev # 表示开发环境#active: prod # 表示生产环境#active: test # 表示测试环境
2.2.3.3 nacos yaml配置格式
# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml

2.2.4 apollo

相关文章:

【server】3、注册中心与配置中心

1、服务注册与发现 1.1、consul 1.1.1 是什么 官网&#xff1a; Consul by HashiCorp spring-cloud-consul: Spring Cloud Consul :: Spring Cloud Consul gitHub 官网 &#xff1a;GitHub - hashicorp/consul: Consul is a distributed, highly available, and data cent…...

【大数据】—量化交易实战案例(海龟交易策略)

声明&#xff1a;股市有风险&#xff0c;投资需谨慎&#xff01;本人没有系统学过金融知识&#xff0c;对股票有敬畏之心没有踏入其大门&#xff0c;今天用另外一种方法模拟炒股&#xff0c;后面的模拟的实战全部用同样的数据&#xff0c;最后比较哪种方法赚的钱多。 海龟交易…...

014-GeoGebra基础篇-快速解决滑动条的角度无法输入问题

有客户反馈&#xff0c;他的Geogebra一直有个bug&#xff0c;那就是输入角度最大值时总不按照他设定的展示&#xff0c;快被气炸了~ 目录 一、问题复现&#xff08;1&#xff09;插入一个滑动条&#xff08;2&#xff09;选择Angle&#xff08;3&#xff09;输入90&#xff0c;…...

Diffusion模型的微调和引导

留意后续更新&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 Diffusion模型的微调和引导 微调&#xff08;fine-tuning&#xff09;&#xff1a; 从一个已经训练过的模型开始训练&#xff0c;我们就可以从一个学会如何“去噪”的模型开始训练&#xff0c;相对于随机初始…...

零基础学MySQL:从入门到实践的完整指南

引言&#xff1a; MySQL&#xff0c;作为全球最受欢迎的开源关系型数据库管理系统之一&#xff0c;以其高性能、易用性和灵活性&#xff0c;在Web开发、数据分析等领域占据着举足轻重的地位。如果你是一位编程新手&#xff0c;想要踏入数据库管理的大门&#xff0c;本文将从零…...

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日&#xff0c;福州市工业和信息化局公布2024年第一批《福州市名优产品目录》&#xff0c;澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…...

Frrouting快速入门——OSPF组网(一)

FRR简介 FRR是FRRouting的简称&#xff0c;是一个开源的路由交换软件套件。其作者源自老牌项目quaga的成员&#xff0c;也可以算是quaga的新版本。 使用时一般查看此文档&#xff1a;https://docs.frrouting.org/projects/dev-guide/en/latest/index.html FRR支持的协议众多…...

记录通过Cloudflare部署属于自己的docker镜像源

引言 由于最近国内无法正常拉取docker镜像&#xff0c;然而找了几个能用的docker镜像源发现拉取回来的docker镜像不是最新的版本&#xff0c;部署到Cloudflare里Workers 和 Pages&#xff0c;拉取docker 镜像成功&#xff0c;故记录部署过程。 部署服务 登录Cloudflare后&…...

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏 flyfish 波动方程的求解结果通常不是一个单一的数值&#xff0c;而是一个函数或一组函数&#xff0c;这些函数描述了波随时间和空间的传播情况。具体来说&#xff0c;波动方程的解可以是关于时间和空间变量的…...

yum命令提示 错误:rpmdb: BDB0113 Thread/process 4153/139708200269632

一、报错信息 [rootDawn yum.repos.d]# yum clean all 错误&#xff1a;rpmdb: BDB0113 Thread/process 4153/139708200269632 failed: BDB1507 Thread died in Berkeley DB library 错误&#xff1a;db5 错误(-30973) 来自 dbenv->failchk&#xff1a;BDB0087 DB_RUNRECOVE…...

欢乐钓鱼大师游戏攻略:在什么地方掉称号鱼?云手机游戏辅助!

《欢乐钓鱼大师》是一款融合了休闲娱乐和策略挑战的钓鱼游戏。游戏中的各种鱼类不仅各具特色&#xff0c;而且钓鱼过程充满了挑战和乐趣。下面将为大家详细介绍如何在游戏中钓鱼&#xff0c;以及一些有效的钓鱼技巧&#xff0c;帮助你成为一个出色的钓鱼大师。 实用工具推荐 为…...

什么是构造函数?Java 中构造函数的重载如何实现?

构造函数&#xff0c;就像是建筑房屋时的奠基仪式&#xff0c;是Java类中一个特殊的方法&#xff0c;主要用于初始化新创建的对象。 每当创建一个类的新实例时&#xff0c;构造函数就会自动调用&#xff0c;负责为这个新对象分配内存&#xff0c;并对其进行必要的设置&#xf…...

Linux内核 -- ARMv7 与 ARMv8 中的 asmlinkage 作用及使用

ARMv7 与 ARMv8 中的 asmlinkage 作用及使用 asmlinkage 是一个宏&#xff0c;通常在内核代码中使用&#xff0c;用于定义调用约定&#xff0c;特别是指定函数的参数是通过栈传递而不是通过寄存器。它主要用于内核与汇编之间的接口函数&#xff0c;使得参数传递更加一致和明确…...

GPT提示词模板

BRTR 原则 # 背景&#xff08;Background&#xff09; - 描述任务的背景信息&#xff0c;包括任务的起因、目的、相关的历史信息或当前状况。 - 提供足够的背景信息以便让ChatGPT理解任务的上下文。 # 角色&#xff08;Role&#xff09; - 定义ChatGPT在任务中所扮演的角色&…...

WRF学习——使用CMIP6数据驱动WRF/基于ncl与vdo的CMIP6数据处理

动力降尺度 国际耦合模式比较计划&#xff08;CMIP&#xff09;为研究不同情景下的气候变化提供了大量的模拟数据&#xff0c;而在实际研究中&#xff0c;全球气候模式输出的数据空间分辨率往往较低&#xff08;>100Km&#xff0c;缺乏区域气候特征&#xff0c;为了更好地研…...

机器人控制系列教程之Delta机器人动力学分析

动力学简介 机器人动力学分析是已知各运动构件的尺寸参数和惯性参数的情况下,求解末端运动状态与主驱动力矩之间的函数关系。 意义:对并联机器人动力学分析的意义体现在: 为伺服电机的选型提供理论依据;获得动力学参数为目标函数的最优问题做性能评价指标;为高精度控制提…...

VIM介绍

VIM&#xff08;Vi IMproved&#xff09;是一种高度可配置的文本编辑器&#xff0c;用于有效地创建和更改任何类型的文本。它是从 vi 编辑器发展而来的&#xff0c;后者最初是 UNIX 系统上的一个文本编辑器。VIM 以其键盘驱动的界面和强大的文本处理能力而闻名&#xff0c;是许…...

课设:选课管理系统(Java+MySQL)

在本博客中&#xff0c;我将介绍用Java、MySQL、JDBC和Swing GUI开发一个简单的选课管理系统。 技术栈 Java&#xff1a;用于编写应用程序逻辑MySQL&#xff1a;用于存储和管理数据JDBC&#xff1a;用于连接Java应用程序和MySQL数据库Swing GUI&#xff1a;用于构建桌面应用程…...

动态规划 剪绳子问题

给一段长度为n的绳子&#xff0c;请把绳子剪成m段&#xff0c;每段绳子的长度为k[0],k[1],k[2],k[3]....k[m].请问k[0]k[1]k[2].....*k[m]的最大乘积为多少 #include <vector> // 包含vector头文件 #include <algorithm> // 包含algorithm头文件&#xff0c;用于m…...

上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这种mcu的嵌入式模块理论上都是私有协议&#xff0c;因为上位机和下位机都是自己开发的&#xff0c;所以只需要自己保证上、下位机可以通讯上&…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...