SpringCloud的学习,Consul服务注册与发现、分布式配置,以及 服务调用和负载均衡
介绍
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows
简言之,Consul的作用是服务发现和配置管理
Consul的作用
- 服务发现:提供HTTP和DNS两种发现方式。
- 健康检测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
- kv存储:Key、Value的存储方式
- 多数据中心:Consul支持多数据中心
- 可视化Web界面
服务注册与发现
步骤:
- pom文件中引入consul服务注册与发现的依赖
<!--SpringCloud consul discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
- yaml文件中做好consul的相关配置,例:
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}
- 在启动类上加上@EnableDiscoveryClient
- 在RestTemplateConfig配置类中,创建RestTemplate组件的方法上,加上负载均衡支持的注解
@Configuration
public class RestTemplateConfig
{@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
- 在要引用服务的地址的时候,就可以将原来的 ip地址:端口号 改为对应的服务名
public static final String PaymentSrv_URL = "<http://cloud-payment-service>";
分布式配置
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服。务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
服务配置:
配置通用全局配置信息,直接注册进Consul服务器,从Consul获取配置信息:
- 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>
-
关于bootstrap.yaml文件:
applicaiton.yml是用户级的资源配置项
bootstrap.yml是系统级的,优先级更加高
Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的
Application Context
的父上下文。初始化的时候,Bootstrap Context
负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
。Bootstrap
属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstrap context
和Application Context
有着不同的约定,所以新增了一个bootstrap.yml
文件,保证Bootstrap Context
和Application Context
配置的分离。application.yml文件改为bootstrap.yml,这是很关键的或者两者共存,一般推荐两者共存。
因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.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
接着在consul中配置好kv配置信息,要读取配置信息,也是和读取普通配置文件中的信息一样,使用@Value注解获取。
kv信息的配置格式为config/服务名-运行环境/data,最终的配置信息在data中配置,可以使用yaml的格式。
及时动态刷新
在consul中的配置信息修改后,立即访问时候,不会生效,要等待一会才会刷新。
解决步骤:
-
添加@RefreshScope注解到主启动类上
-
修改watch的wait-time(不建议)
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: YAMLwatch:wait-time: 1
LoadBanlancer负载均衡调用
LB负载均衡(Load Balance):
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等。
spring-cloud-starter-loadbalancer组件是什么:
Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient(WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求)
在负责转发请求的rest服务客户端,做负载均衡。导入以下依赖,并在RestTemplateConfig的组件配置中,加上@LoadBalanced注解
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
原理
LoadBalance在工作时分为两步:
- 第一步,先选择ConsulServer从服务端查询服务列表,默认轮询调用谁都可以正常执行。
- 第二步,按照指定的负载均衡策略从server取到的服务注册中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器
负载均衡轮询算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。
默认是两种算法,除了轮询算法,还有一种是随机算法。如果要使用随机算法,RestTemplateConfig配置如下:
@Configuration
@LoadBalancerClient(//下面的value值大小写一定要和consul里面的名字一样,必须一样value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{@Bean@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
一般还是建议使用默认的轮询算法。
OpenFeign服务接口调用
openFeign是一个声明式的服务客户端。也支持并包含了loadBalanced。
官方介绍文:
它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,以及对使用Spring Web中默认使用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在使用Feign时提供负载平衡的http客户端。
由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每一个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以OpenFeign在此基础上做了进一步封装,帮助我们定义和实现依赖服务接口的定义。
可以在使用OpenFeign式提供http客户端的负载均衡,也可以集成阿里巴巴的Sentinel来提供熔断降级等功能。通过OpenFeign只需要服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用
使用步骤:
- 建好服务客户端模块后,引入依赖:
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- yaml文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}
- 主启动类上加上consul的支持注册服务的注解和启用feign客户端的注解
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
@EnableFeignClients//启用feign客户端,定义服务+绑定接口,以声明式的方法优雅而简单的实现服务调用
public class MainOpenFeign80 {public static void main(String[] args) {SpringApplication.run(MainOpenFeign80.class,args);}
}
- 在通用模块commons中引入依赖(如上)后,新建服务接口PayFeignApi,在接口上配置@FeignClient注解,并定义好抽象方法,抽象方法的定义要对应的服务的controller类中的controller方法。相应的mapping注解也要对应好。
@FeignClient("cloud-payment-service")
public interface PayFeignApi {@PostMapping(value = "/pay/add")public ResultData<String> addPay(@RequestBody Pay pay);@DeleteMapping("pay/del/{id}")public ResultData<Integer> deletePay(@PathVariable("id") Integer id);@PutMapping("/pay/update")public ResultData<String> updatePay(@RequestBody PayDTO payDto);@GetMapping("/pay/get/{id}")public ResultData<Pay> getById(@PathVariable("id") Integer id);@GetMapping("/pay/getAll")public ResultData<List<Pay>> getAll();
}
- 在服务客户端的controller中调用payFeignApi
@RestController
public class OrderController {@Resourceprivate PayFeignApi payFeignApi;@PostMapping("/feign/pay/add")public ResultData addOrder(@RequestBody Pay pay){ResultData<String> resultData = payFeignApi.addPay(pay);return resultData;}@GetMapping("/feign/pay/get/{id}")public ResultData getPayInfo(@PathVariable("id") Integer id){System.out.println("-------支付微服务远程调用,按照id查询订单支付流水信息");ResultData resultData = payFeignApi.getById(id);return resultData;}
}
OpenFeign高级特性
超时控制
在SpringCloud微服务架构中,大部分公司都是利用OpenFeign进行服务间的调用,如果服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就非常有必要了。
openFeign默认等待六十秒,超时后会报错。
关于超时控制的配置项:
- connectTimeOut:连接超时时间
- readTimeOut:请求处理超时时间
配置分为两种:
全局配置
直接在application.yaml文件中进行配置:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000#读取超时时间readTimeout: 3000
指定配置
就是config的下一级属性的属性名改为要指定的服务的服务名,default的同级
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:#连接超时时间connectTimeout: 3000#读取超时时间readTimeout: 3000cloud-provider-payment:#连接超时时间connectTimeout: 5000#读取超时时间readTimeout: 5000
服务的超时配置先看指定的,再看全局的。
重试机制
重试是指当请求失败后,会重新再次发送该请求。在OpenFeign中默认是关闭重试的,如果要开启重试,在配置类FeignConfig中设置:
@Configuration
public class FeignConfig {@Beanpublic Retryer myRetryer(){//return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的//最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1sreturn new Retryer.Default(100,1,3);}
}
HttpClient
OpenFeign中http client如果不做特殊配置,默认使用jdk自带的HttpURLConnection发送HTTP请求,由于默认HttpURLConnection没有连接池、性能和效率低,如果采用默认,性能上欠佳。
建议使用阿帕奇的httpclient5。
步骤:
-
pom引入依赖
<!-- httpclient5--> <dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.3</version> </dependency> <!-- feign-hc5--> <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId><version>13.1</version> </dependency>
-
开启httpclient5的配置,application.yaml文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#连接超时时间connectTimeout: 5000#读取超时时间readTimeout: 5000# 配置httpclient5httpclient:hc5:enabled: true
请求响应压缩
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。还可以对请求压缩做一些更细致的设置,比如指定压缩的请求数据类型并设置了请求压缩的大小下限。
application.yaml配置文件:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#连接超时时间connectTimeout: 5000#读取超时时间readTimeout: 5000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小触发压缩的大小,单位 字节mime-types: text/xml,application/xml,application/json #触发压缩数据类型response:enabled: true
日志打印
Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解feign中http请求的细节,也就是对Feign接口的调用情况进行监控和输出。
日志级别
NONE:默认的,不显示任何日志;
BASIC:仅记录请求方法、URL、响应状态码及执行时间;
HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
配置方式:
- 在FeignConfig中,配置:
@Configuration
public class FeignConfig {@Beanpublic Retryer myRetryer(){//return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的//最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1sreturn new Retryer.Default(100,1,3);}//配置日志级别@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}
- 在yaml文件中配置,配置公式是:logging.level + 含有@FeignClient注解的完整带包名的接口名+debug,例如:
server:port: 80spring:application:name: cloud-consumer-openfeign-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}openfeign:client:config:default:connect-timeout: 3000read-timeout: 3000cloud-provider-payment:#连接超时时间connectTimeout: 5000#读取超时时间readTimeout: 5000httpclient:hc5:enabled: truecompression:request:enabled: truemin-request-size: 2048 #最小触发压缩的大小mime-types: text/xml,application/xml,application/json #触发压缩数据类型response:enabled: true
#日志配置
logging:level:com:ergou:cloud:apis:PayFeignApi: debug
相关文章:

SpringCloud的学习,Consul服务注册与发现、分布式配置,以及 服务调用和负载均衡
介绍 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,…...

闯关leetcode——26. Remove Duplicates from Sorted Array
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 内容 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appear…...

基于A2C与超启发式的航天器星载自主任务规划算法-笔记
1. Actor-Critic 模块 主要文件:AC.py, PolicyNet.py, ValueNet.py作用:该模块实现了 A2C(Advantage Actor-Critic)强化学习算法。其中,ActorCritic 类是核心,它同时管理策略网络(Actor&#x…...

[机器学习]决策树
1 决策树简介 2 信息熵 3 ID3决策树 3.1 决策树构建流程 3.2 决策树案例 4 C4.5决策树 5 CART决策树(分类&回归) 6 泰坦尼克号生存预测案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import …...

CentOS7更换阿里云yum更新源
目前CentOS内置的更新安装源经常报错无法更新,或者速度不够理想,这个时候更换国内的镜像源就是一个不错的选择。 备份内置更新源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云repo源(需要系统…...

算法参数对拥塞控制的影响
来看看参数对公平收敛的影响。仅假象一下就知道应该是个加权公平,但事实如何,还是要具体看一下。 首先看 aimd,标准的 reno 算法是每 round 之后 cwnd 加 1,但如果有些流加 1,有些流加 2,会如何࿱…...

Go websocket
Go 中的 gorilla/websocket 是一个常用且高效的 WebSocket 实现库,可以帮助你轻松地在 Web 应用中实现实时通信。学习 gorilla/websocket 的基本用法包括建立 WebSocket 连接、发送和接收消息、处理错误、以及在实际场景中的使用。以下是关于 gorilla/websocket 的学…...

C# 委托与事件 观察者模式
委托与事件是一种观察者模式。 什么是委托与事件 在c#中,委托类似于代理,也跟其它语言的函数指针、回调函数等相似,但委托是类型安全和可靠的。声明自定义委托时,加上delegate关键字,委托定义类似于接口。 事件是特殊…...

K8S - 用service account 登陆kubectl
刚安装好k8s时 我就可以用kubectl 在master server里管理k8s的资源。 这时我们是感觉不到 k8s的用户和权限管理存在的, 但是其实用户的配置都在kubeclt 的配置文件中 /etc/kubernetes/admin.conf 中 我们可以用下命令来查看当前正在用的帐号 rootk8s-master:~/.d…...

Redis 持久化机制详解
引言 Redis 是一款基于内存的高性能键值存储系统,为了在数据丢失时能快速恢复,Redis 提供了多种持久化机制。这些持久化机制可以将内存中的数据存储到磁盘上,确保即使系统重启或宕机后也能恢复数据。Redis 支持两种主要的持久化方式…...

小阿轩yx-案例:Zabbix监控kubernetes云原生环境
小阿轩yx-案例:Zabbix监控kubernetes云原生环境 前言 传统监控的本质 就是收集、分析和使用信息来观察一段时间内监控对象的运行进度,并且进行相应的决策管理的过程,监控侧重于观察特定指标。 随着云原生时代的到来 我们对监控的功能提出…...

量化交易的个人见解
程序化交易在国内兴起有些年数了,个人以为,程序化交易与量化投资的关系,在于两者侧重点有差别。程序化交易侧重于下单的动作是机器自动执行的,量化投资则侧重于投资分析的过程是通过一个量化模型来实现的,所以量化投资…...

Java集合(一)
目录 Java集合(一) 集合介绍 单列集合分类 Collection接口 创建Collection实现类对象 常用方法 迭代器 基本使用 迭代器的执行过程 迭代器底层原理 集合中的并发修改异常及原因分析 List接口 ArrayList类 介绍 常用方法 遍历集合 Array…...

车载软件架构 --- SOA设计与应用(下)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

网络原理 IP协议与以太网协议
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.网络层 IP协议 1.IP协议格式 2.地址管理 2.1 IP地址 2.2 解决IP地址不够用的问题 2.3NAT网络地址转换 2.4网段划分 3.路由选择…...

k8s的安装
k8s的安装 1.创建主机,设置ip,hostname,关闭firewalld,selinux,NetworkManager 编号主机名称ip1k8s-master192.168.118.662k8s-node01192.168.118.773k8s-node02192.168.118.88 2.设置主机之间的ssh免密 [rootk8s-master ~]# ssh-keygen [rootk8s-ma…...

Qt中样式表常用的属性名称定义
Qt中,用好样式表,不但可以做出意想不到的酷炫效果,有时候也能减轻开发量,可能由于你不了解某些样式使用,想破脑袋通过代码实现的效果,反倒不如别人用样式,一两句样式脚本就搞定。 Qt中ÿ…...

React源码学习(一):如何学习React源码
本系列源码学习,是基于 v16.13.1,v17.x与v16.x区别并不太大! 一、如何正确的学习React源码? 找到Github,转到React仓库,fork / clone源码:React 查看Readme,在Documentation中有Cont…...

云计算服务的底层,虚拟化技术的实现原理
虚拟化技术: 一、 从cpu说起, intel和amd等cpu制造商 为了提高其cpu对 虚拟化程序的运算速度, 给cpu硬件里面 增加了指令集 VMLAUNCH, VMRESUME, VMEXIT, VMXOFF 这些指令集称为硬件辅助虚拟化技术的指令集。 ---------------------…...

大数据Flink(一百一十六):Flink SQL的时间属性
文章目录 Flink SQL的时间属性 一、Flink 三种时间属性简介 二、Flink 三种时间属性的应用场景 三、SQL 指定时间属性的两种方式 四、SQL 处理时间DDL定义 五、SQL 事件时间DDL定义 Flink SQL的时…...

Ansible自动化部署kubernetes集群
机器环境介绍 1.1. 机器信息介绍 IP hostname application CPU Memory 192.168.204.129 k8s-master01 etcd,kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,containerd 2C 4G 192.168.204.130 k8s-w…...

网络通信流程
目录 ♫IP地址 ♫子网掩码 ♫MAC地址 ♫相关设备 ♫ARP寻址 ♫网络通信流程 ♫IP地址 我们已经知道 IP 地址由网络号主机号组成,根据 IP 地址的不同可以有5钟划分网络号和主机号的方案: 其中,各类地址的表示范围是: 分类范围适用…...

数据结构一:绪论
(一)数据结构的基本概念 1.相关名词 【1】数据 1.信息的载体,描述客观事物 2.能被输入到计算机中 3.能被计算机程序识别和处理的符号的集合。 【2】数据元素 1.数据的一个“个体” 2.数据的基本单位 3.有时候也被称为元素、结点、顶点…...

使用OpenFeign在不同微服务之间传递用户信息时失败
文章目录 起因原因解决方法: 起因 从pay-service中实现下单时,会调用到user-service中的扣减余额。 因此这里需要在不同微服务之间传递用户信息。 但是user-service中始终从始至终拿不到user的信息。 原因 在pay-service中,不仅要Enable O…...

js中【Worker】相关知识点详细解读
什么是 JavaScript 中的 Worker? JavaScript 中的 Worker 是一个可以在后台线程中运行代码的 API,这样可以避免主线程(通常是 UI 线程)被阻塞。使用 Worker 时,JavaScript 可以在多线程环境中工作,解决了单…...

使用Apify加载Twitter消息以进行微调的完整指南
# 使用Apify加载Twitter消息以进行微调的完整指南## 引言在自然语言处理领域,微调模型以适应特定任务是提升模型性能的常见方法。本文将介绍如何使用Apify从Twitter导出聊天信息,以便进一步进行微调。## 主要内容### 使用Apify导出推文首先,我…...

【C++算法】滑动窗口
长度最小的子数组 题目链接: 209. 长度最小的子数组 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-size-subarray-sum/description/ 算法原理 代码步骤: 设置left0,right0设置sum0,len0遍历l…...

(c++)猜数字(含根据当前时间生成伪随机数代码)
#include<iostream> #include<ctime>/*用srand((unsigned int)time(NULL));要包含这个头文件,如果没有这两个,rand()函数会一直生成42这个伪随机数。*/using namespace std;int main() {srand((unsigned int)time(NULL));//种子,…...

优化批处理流程:自定义BatchProcessorUtils的设计与应用
优化批处理流程:自定义BatchProcessorUtils的设计与应用 | 原创作者/编辑:凯哥Java | 分类:个人小工具类 在我们开发过程中,处理大量的数据集是一项常见的任务。特别是在数据库操作、文件处理或者…...

Framebuffer应用编程
目录 前言 LCD操作原理 涉及的 API 函数 open函数 ioctl 函数 mmap 函数 Framebuffer程序分析 源码 1.打开设备 2.获取LCD参数 3.映射Framebuffer 4.描点函数 5.随便画几个点 上机实验 前言 本文介绍LCD的操作原理和涉及到的API函数,分析Framebuffer…...