Apollo之原理和使用讲解
文章目录
- 1 Apollo
- 1.1 简介
- 1.1.1 背景
- 1.1.2 简介
- 1.1.3 特点
- 1.2 基础模型
- 1.3 Apollo 四个维度
- 1.3.1 application
- 1.3.2 environment
- 1.3.3 cluster
- 1.3.4 namespace
- 1.4 本地缓存
- 1.5 客户端设计
- 1.5.1 客服端拉取原理
- 1.5.2 配置更新推送实现
- 1.6 总体设计
- 1.7 可用性考虑
- 2 操作使用
- 2.1 配置Apollo
- 2.1.1 登录 Apollo
- 2.1.2 修改与增加部门数据
- 2.1.3 创建一个项目
- 2.1.4 创建一个配置参数
- 2.2 创建客户端测试项目
- 2.2.1 pom.xml
- 2.2.2 配置文件添加参数
- 2.2.3 创建测试 Controller 类
- 2.2.4 JVM 启动参数添加启动参数
1 Apollo
1.1 简介
由于 Apollo 概念比较多,刚开始使用比较复杂,最好先过一遍概念再动手实践尝试使用。
1.1.1 背景
随着程序功能的日益复杂,程序的配置日益增多,各种功能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。因此 Apollo 配置中心应运而生!
1.1.2 简介
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
1.1.3 特点
特点:
- 部署简单
- 灰度发布
- 版本发布管理
- 提供开放平台API
- 客户端配置信息监控
- 提供Java和.Net原生客户端
- 配置修改实时生效(热发布)
- 权限管理、发布审核、操作审计
- 统一管理不同环境、不同集群的配置
1.2 基础模型
如下即是 Apollo 的基础模型:
- 用户在配置中心对配置进行修改并发布
- 配置中心通知
Apollo客户端有配置更新 Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

1.3 Apollo 四个维度
Apollo支持4个维度管理Key-Value格式的配置:
application(应用)environment(环境)cluster(集群)namespace(命名空间)
1.3.1 application
Apollo 客户端在运行时需要知道当前应用是谁,从而可以根据不同的应用来获取对应应用的配置。
每个应用都需要有唯一的身份标识,可以在代码中配置 app.id 参数来标识当前应用,Apollo 会根据此指来辨别当前应用。
1.3.2 environment
在实际开发中,我们的应用经常要部署在不同的环境中,一般情况下分为开发、测试、生产等等不同环境,不同环境中的配置也是不同的,在 Apollo 中默认提供了四种环境:
- FAT(Feature Acceptance Test):功能测试环境
- UAT(User Acceptance Test):集成测试环境
- DEV(Develop):开发环境
- PRO(Produce):生产环境
在程序中如果想指定使用哪个环境,可以配置变量 env 的值为对应环境名称即可。
1.3.3 cluster
一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
对不同的集群,同一个配置可以有不一样的值,比如说上面所指的两个北京、上海两个机房设置两个集群,两个集群中都有 mysql 配置参数,其中参数中配置的地址是不一样的。
1.3.4 namespace
一个应用中不同配置的分组,可以简单地把 namespace 类比为不同的配置文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC 配置文件,应用自身的配置文件等。
熟悉 SpringBoot 的都知道,SpringBoot 项目都有一个默认配置文件 application.yml,如果还想用多个配置,可以创建多个配置文件来存放不同的配置信息,通过指定 spring.profiles.active 参数指定应用不同的配置文件。这里的 namespace 概念与其类似,将不同的配置放到不同的配置 namespace 中。
Namespace 分为两种权限,分别为:
public(公共的):public权限的Namespace,能被任何应用获取。private(私有的): 只能被所属的应用获取到。一个应用尝试获取其它应用private 的 Namespace,Apollo会报404异常。
Namespace 分为三种类型,分别为:
私有类型: 私有类型的Namespace具有private权限。例如 application Namespace 为私有类型。公共类型: 公共类型的Namespace具有public权限。公共类型的N amespace 相当于游离于应用之外的配置,且通过Namespace的名称去标识公共Namespace,所以公共的Namespace的名称必须全局唯一。关联类型(继承类型): 关联类型又可称为继承类型,关联类型具有private权限。关联类型的Namespace继承于公共类型的Namespace,将里面的配置全部继承,并且可以用于覆盖公共Namespace的某些配置。
1.4 本地缓存
Apollo 客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。
- Mac/Linux: /opt/data/{appId}/config-cache
- Windows: C:\opt\data{appId}\config-cache
本地配置文件会以下面的文件名格式放置于本地缓存路径下:{appId}+{cluster}+{namespace}.properties
1.5 客户端设计
1.5.1 客服端拉取原理

上图简要描述了Apollo客户端的实现原理
- 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
- 客户端还会定时从
Apollo配置中心服务端拉取应用的最新配置。- 这是一个
fallback机制,为了防止推送机制失效导致配置不更新 - 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回 304 - Not Modified
- 定时频率默认为每 5 分钟拉取一次,客户端也可以通过在运行时指定
apollo.refreshInterval来覆盖,单位为分钟。
- 这是一个
- 客户端从
Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中。 - 客户端会把从服务端获取到的配置在本地文件系统缓存一份,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。
- 应用程序从
Apollo客户端获取最新的配置、订阅配置更新通知。
1.5.2 配置更新推送实现
前面提到了 Apollo 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。长连接实际上我们是通过 Http Long Polling 实现的,具体而言:
- 客户端发起一个
Http请求到服务端 - 服务端会保持住这个连接 60 秒
- 如果在 60 秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的
namespace信息,客户端会据此拉取对应namespace的最新配置 - 如果在 60 秒内没有客户端关心的配置变化,那么会返回
Http状态码 304 给客户端
- 如果在 60 秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的
- 客户端在收到服务端请求后会立即重新发起连接,回到第一步
- 考虑到会有数万客户端向服务端发起长连,在服务端我们使用了
async servlet(Spring DeferredResult)来服务Http Long Polling请求。
1.6 总体设计

上图简要描述了Apollo的总体设计,我们可以从下往上看:
Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳- 在
Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口 Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做 load balance 错误重试Portal(管理界面)通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做 load balance、错误重试- 为了简化部署,我们实际上会把
Config Service、Eureka和Meta Server三个逻辑角色部署在同一个 JVM 进程中
1.7 可用性考虑
配置中心作为基础服务,可用性要求非常高,下面的表格描述了不同场景下Apollo的可用性:
| 场景 | 影响 | 降级 | 原因 |
|---|---|---|---|
| 某台 config service 下线 | 无影响 | Config service无状态,客户端重连其它config service | |
| 所有 config service 下线 | 客户端无法读取最新配置,Portal无影响 | 客户端重启时,可以读取本地缓存配置文件 | |
| 某台 admin service 下线 | 无影响 | Admin service无状态,Portal重连其它 admin service | |
| 所有 admin service 下线 | 客户端无影响,portal无法更新配置 | ||
| 某台 portal 下线 | 无影响 | Portal域名通过slb绑定多台服务器,重试后指向可用的服务器 | |
| 全部 portal 下线 | 客户端无影响,portal无法更新配置 | ||
| 某个数据中心下线 | 无影响 | 多数据中心部署,数据完全同步,Meta Server/Portal 域名通过 slb 自动切换到其它存活的数据中心 |
2 操作使用
创建一个 Apollo 的客户端项目,引用 Apollo 来实现配置动态更新,不过在此之前我们需要提前进入 Apollo Portal 界面,在里面提前创建一个项目并在其配置一个参数,方便后续客户端引入该配置参数,测试是否能动态变化。
2.1 配置Apollo
2.1.1 登录 Apollo
默认用户名:apollo
密 码:admin
2.1.2 修改与增加部门数据
在登录后创建项目时,选择部门默认只能选择 Apollo 自带的 测试部门1与测试部门2两个选项。

开始这真让人迷糊,原来 Apoloo 没有修改或新增部门信息的管理节目,只能通过修改数据库,来新增或者修改数据,这里打开 Portal 对月的数据库中的表 ApolloPortalDB 修改 key 为 organizations 的 value 的 json 数据,改成自己对于的部门信息。

2.1.3 创建一个项目
修改完数据库部门信息后,重新登录 Apollo Portal,然后创建项目,这时候选择部门可以看到已经变成我们自己修改后的部门信息了,选择我们自定义部门,然后设置应用 ID 为 apollo-test,应用名为 apollo-demo

创建完成后进入配置管理界面

2.1.4 创建一个配置参数
创建一个配置参数,方便后续 Apollo 客户端项目引入该参数,进行动态配置测试。

设置 key 为 test value 为 123456 然后设置一个备注,保存。

创建完成后可以看到配置管理节目新增了一条配置

接下来我们将此配置通过发布按钮,进行发布。

2.2 创建客户端测试项目
这里创建一个 SpringBoot 项目,引入 Apollo 客户端来来实现与 Apollo 配置中心服务端交互。
2.2.1 pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2.2.2 配置文件添加参数
在 application.yml 配置文件中添加下面参数,这里简单介绍下 Apollo 参数作用:
apollo.meta:Apollo配置中心地址。apollo.cluster: 指定使用某个集群下的配置。apollo.bootstrap.enabled: 是否开启 Apollo。apollo.bootstrap.namespaces: 指定使用哪个 Namespace 的配置,默认 application。apollo.cacheDir=/opt/data/some-cache-dir: 为了防止配置中心无法连接等问题,Apollo会自动将配置本地缓存一份。apollo.autoUpdateInjectedSpringProperties:Spring应用通常会使用Placeholder来注入配置,如${someKey:someDefaultValue},冒号前面的是 key,冒号后面的是默认值。如果想关闭 placeholder 在运行时自动更新功能,可以设置为 false。apollo.bootstrap.eagerLoad.enabled: 将Apollo加载提到初始化日志系统之前,如果设置为false,那么将打印出Apollo的日志信息,但是由于打印Apollo日志信息需要日志先启动,启动后无法对日志配置进行修改,所以Apollo不能管理应用的日志配置,如果设置为true,那么Apollo可以管理日志的配置,但是不能打印出 Apollo 的日志信息。
#应用配置
server:port: 8080
spring:application:name: apollo-demo#Apollo 配置
app:id: apollo-test #应用ID
apollo:cacheDir: /opt/data/ #配置本地配置缓存目录cluster: default #指定使用哪个集群的配置meta: http://192.168.2.11:30002 #DEV环境配置中心地址autoUpdateInjectedSpringProperties: true #是否开启 Spring 参数自动更新bootstrap: enabled: true #是否开启 Apollonamespaces: application #设置 NamespaceeagerLoad:enabled: false #将 Apollo 加载提到初始化日志系统之前
2.2.3 创建测试 Controller 类
写一个 Controller 类来输出 test 变量的值,使用了 Spring 的 @Value 注解,用于读取配置文件中的变量的值,这里来测试该值,项目启动后读取到的变量的值是设置在 application 配置文件中的默认值,还是远程 Apollo 中的值,如果是 Apollo 中配置的值,那么再测试在 Apollo 配置中心中改变该变量的值后,这里是否会产生变化。
@RestController
public class TestController {@Value("${test:默认值}")private String test;@GetMapping("/test")public String test(){return "test的值为:" + test;}
}
SpringBoot 项目启动类
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
2.2.4 JVM 启动参数添加启动参数
如果 Apollo 是部署在 Kubernetes 环境中的,JVM 参数中必须添加两个变量:
env: 应用使用Apollo哪个环境,例如设置为 DEV 就是指定使用开发环境,如果设置为 PRO 就是制定使用生产环境。apollo.configService: 指定配置中心的地址,跳过 meta 的配置,在测试时指定meta地址无效果。如果Apollo是部署在Kubernetes中,则必须设置该参数为配置中心地址,如果Apollo不是在Kubernetes环境中,可以不设置此参数,只设置meta参数即可。一般情况下,configService和meta值一致。
如果是在 Idea 中启动,可以配置启动参数,加上:
-Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV
如果是 java 命令启动程序,需要 JVM 加上
java -Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV -jar apollo-demo.jar
注意:上面 env 指定的环境,要和 apollo.meta 指定 Config 地址的环境一致,例如 -Denv=DEV 即使用开发环境,那么apollo.meta=http://xxx.xxx.xxx:8080 这个url 的 Config 也是开发环境下的配置中心服务,而不能是 PRO 或者其它环境下的配置中心。
相关文章:
Apollo之原理和使用讲解
文章目录 1 Apollo1.1 简介1.1.1 背景1.1.2 简介1.1.3 特点 1.2 基础模型1.3 Apollo 四个维度1.3.1 application1.3.2 environment1.3.3 cluster1.3.4 namespace 1.4 本地缓存1.5 客户端设计1.5.1 客服端拉取原理1.5.2 配置更新推送实现 1.6 总体设计1.7 可用性考虑 2 操作使用…...
魅族MX4pro系统升级、降级
网上的教程都是按住开机键音量上或者下键,但是我按了没用,还是直接点击压缩包管用。 下载系统 官网地址(所有手机固件):https://flyme.cn/firmware.html 官方魅族mx4Pro系统:https://flyme.cn/firmwarelis…...
【Docker】快速入门之Docker的安装及使用
一、引言 1、什么是Docker Docker是一个开源的应用容器引擎,它让开发者可以将他们的应用及其依赖打包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之…...
记录汇川:H5U于Factory IO测试13
主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 模式选择 子程序: 示教程序 子程序: 手动程序 子程序: 统计程序 子程序: 异常报警 子程序: 自动程序: F…...
PYTHON通过跳板机巡检CENTOS的简单实现
实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…...
网络配置以及命令详解
传统linux中,网络接口为eth0,eth1,eth2,..... RHEL 7以上版本默认命名是基于分配上的固定名称,ens33 接口类型: en:以太网有线接口 wl:无线局域网接口 ww:无线广域网 dmesg:显示开机信息 适配器类型: s:热插拔插槽 o:板载 p:pci类型 ifconfig ens160(命令行配置,临时生效):查…...
商务外语MR混合现实仿真情景实训教学
MR混合现实技术是一种将虚拟世界与真实世界相结合的技术。通过MR设备,我们可以将虚拟的场景、人物、物品等元素实时地呈现在真实的环境中,实现真实与虚拟的完美融合。在商务外语的实训教学中,MR技术可以为我们提供丰富的场景资源,…...
牛客周赛 Round 28 解题报告 | 珂学家 | 组合数学 + 离散化树状数组
前言 整体评价 还是E稍微有点意思,新周赛好像比预期要简单一些, _. 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的新周赛 思路: 模拟 #include <bits/stdc.h>using namespace std;int main() {int res 0;for (int i 0; i < 6; i…...
Python系列(3)—— 变量
变量 一、变量命名规范二、变量赋值三、变量的数据类型四、变量的作用域五、变量类型转换 Python编程中,变量是存储数据的容器。它们用于存储各种数据类型,如整数、浮点数、字符串、列表、字典等。理解变量及其工作原理是Python编程的基础。 一、变量命…...
Java 并发性和多线程2
四、如何创建并运行 java 线程 Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程: Tread thread new Thread(); 执行该线程可以调用该线程的 start()方法: thread.start(); 在上…...
最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了!
原文链接 https://openaigptguide.com/gpt-store-and-chatgpt-team/ OpenAI推出的两款新产品和服务:GPT Store和ChatGPT Team,提供了许多全新的解决方案和功能,旨在帮助用户更轻松地使用和构建GPT工具,同时也增加了公司的收入来源…...
memory泄露分析方法(java篇)
#memory泄露主要分为java和native 2种,本文主要介绍java# 测试每天从monkey中筛选出内存超标的app,提单流转到我 首先,辨别内存泄露类型(java,还是native) 从采到的dumpsys_meminfo_pid看java heap&…...
kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?
背景 在最近学习k8s的过程中,发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用,他们究竟是什么关系?他们分别应该在什么情况下使用呢?这里我进行了简单的总结,做个区分。 各工具说…...
Day26 669修剪二叉搜索树 108有序数组转为二叉搜索树 538二叉搜索树转换为累加树
669 修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 class Solution { pub…...
优化CentOS 7.6的HTTP隧道代理网络性能
在CentOS 7.6上,通过HTTP隧道代理优化网络性能是一项复杂且细致的任务。首先,我们要了解HTTP隧道代理的工作原理:通过建立一个安全的隧道,HTTP隧道代理允许用户绕过某些网络限制,提高数据传输的速度和安全性。然而&…...
第二篇ts,es6箭头函数结合typescript,和for...of
1.基本用法: const f v > v// 等同于const f function(v) {return v}2.箭头函数返回数组 const f () > {const list [1,2,3]// 直接返回一个对象return list.map(it > ({id: it}))}const result f() // [{id:1},{id:2},{id:3}]3.箭头函数和变量解构结合使用 cons…...
异构多品牌高清视频监控接入-技术方案
目 录 一、概述 二、建设目标及需求 (一)建设总目标 (二)需求分析 三、设计依据与设计原则 (一)设计依据 (二)设计原则 1、先进性与适用性 2、经济性与实用性 3、可靠性与安全性 4、开放性 5、可扩充性 6、追求最优化的系统设备配置 7、提高监管…...
编程探秘:Python深渊之旅-----机器学习入门(七)
团队决定在他们的项目中加入一些机器学习功能。瑞宝,对新技术充满好奇,跃跃欲试地想了解更多。 瑞宝(兴奋地):我一直想学习机器学习,现在终于有机会了! 龙(微笑着)&…...
SpringMVC 学习博客记录
文章目录 Servlet请求转发和请求包含RequestDispatcher HandlerInterceptor组件实际运用场景 HandlerMapping&RequestMappingInfo(HandlerMapping)HandlerExecutionChainHandlerAdapter源码学习知识点博客记录 Servlet请求转发和请求包含 RequestDispatcher Request#getR…...
重磅!OpenAI正式发布,自定义ChatGPT商店!
1月11日凌晨,OpenAI在官网正式发布了,自定义GPT商店,可以帮助用户找到目前最好用、流行的自定义ChatGPT助手。 在2024年第一季度,OpenAI将启动GPT 开发者收入计划。首先,美国地区的开发者将根据用户对其 GPT 的使用情…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
