创建Firebase项目并接入Firebase推送: Firebase Cloud Messaging (FCM)

news2024/11/17 13:42:09

1.FCM简介:

Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,而且还是免费的服务。支持 Android,IOS,Web,Flutter,Unity.

消息类型

可以使用 FCM 向客户端发送两种类型的消息:

  • 通知消息,有时被称为“显示消息”。此类消息由 FCM SDK 自动处理。

  • 数据消息,由客户端应用处理。

通知消息包含一组用户可见的预定义键。与其相对,数据消息只包含用户定义的自定义键值对。通知消息可以包含可选的数据载荷。两种消息类型的载荷上限均为 4000 个字节,但从 Firebase 控制台发送消息时会强制执行 1024 个字符的限制。

使用情景

如何发送

通知消息

当客户端应用在后台运行时,FCM SDK 会代表客户端应用向最终用户设备显示消息。如果应用在收到通知时正在前台运行,应用的代码会决定行为。通知消息包含一组预定义的用户可见的键和一个由自定义键值对组成的可选的数据载荷。

  1. 在可信环境(例如 Cloud Functions 或应用服务器)中,使用 Admin SDK 或者 FCM 服务器协议:设置 notification 键。可能包含可选的数据载荷。 一律可折叠。

请参阅一些显示通知示例并发送请求载荷。

  1. 使用 Notifications Composer:输入消息文本、标题等,然后发送。通过提供自定义数据添加可选的数据载荷。

数据消息

客户端应用负责处理数据消息。数据消息仅包含自定义键值对,没有保留键名(请参阅下文)。

在可信环境(例如 Cloud Functions 或应用服务器中),使用 Admin SDK 或者 FCM 服务器协议:仅设置 data 键。

通知消息

如果要进行测试,或者要开展营销、重新吸引用户,可以使用 Firebase 控制台发送通知消息。Firebase 控制台提供基于分析的 A/B 测试,可帮助优化和改进营销消息。

如需使用 Admin SDK 或 FCM 协议以编程方式发送通知消息,可使用通知消息中用户可见部分所必需的预定义键值对选项集来设置 notification 键。例如,以下是即时通讯应用中的 JSON 格式的通知消息。用户可能会在设备上看到标题为“Portugal vs. Denmark”、文本为“great match!”的消息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

应用在后台运行时,通知消息将被传递至通知面板。应用在前台运行时,消息由回调函数处理。

数据消息

使用自定义键值对设置适当的键,以将数据载荷发送至客户端应用。

请确保未在自定义键值对中使用任何保留字词。保留字词包括“from”“notification”“message_type”或以“google”或“gcm”开头的任何字词。

例如,下方所示为上述同一即时通讯应用中的一条 JSON 格式的消息,在此消息中,信息封装在常用的 data 键中,且客户端应用需要解读相应内容:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

2.FCM 架构概览:

通过上图架构可以看到可以发送FCM的平台:

1:开发中常用的:项目服务端server端接入Firebase Admin SDK

2.客户端可以直接发送FCM

3.通过Firebase 操作台发送FCM

3.生命周期流:

  • 注册设备以接收来自 FCM 的消息。客户端应用的实例注册以接收消息,并获取唯一标识应用实例的注册令牌。

  • 发送和接收下行消息

  • 发送消息。应用服务器向客户端应用发送消息:

  1. 消息会在 Notifications Composer 或受信任的环境中编写,并且消息请求会被发送到 FCM 后端。

  1. FCM 后端接收消息请求,生成消息 ID 和其他元数据,并将其发送到平台特定的传输层。

  1. 当设备在线时,系统会通过平台特定的传输层将消息发送到设备。

  1. 在设备上,客户端应用会接收到消息或通知。

4.客户端接入:

第 1 步:创建 Firebase 项目

需要先创建一个要关联到 Android 应用的 Firebase 项目,然后才能将 Firebase 添加到 Android 应用。请访问了解 Firebase 项目以了解详情。

创建项目:https://console.firebase.google.com/?hl=zh-cn

第 2 步:在 Firebase 中注册您的应用

如需在 Android 应用中使用 Firebase,需要向 Firebase 项目注册的应用。注册应用的过程通常称为将应用“添加”到项目中。

第 3 步:添加 Firebase 配置文件

  1. 下载 Firebase Android 配置文件 (google-services.json),然后将其添加到应用中:

  1. 点击下载 google-services.json 以获取 Firebase Android 配置文件。

  1. 将配置文件移到应用的模块(应用级)根目录中。

google-server.json:

{
  "project_info": {
    "project_number": "200570714500",
    "project_id": "testproject-82da6",
    "storage_bucket": "testproject-82da6.appspot.com"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:200570714500:android:31bd6c1683be9fb6a485d1",
        "android_client_info": {
          "package_name": "com.test.project.android"
        }
      },
      "oauth_client": [
        {
          "client_id": "200570714500-g7s70nmqogiviequmsegmuo49kf8knnb.apps.googleusercontent.com",
          "client_type": 1,
          "android_info": {
            "package_name": "com.test.project.android",
            "certificate_hash": "b0bd34f3447d5d63bf620ae01a5bb494759ee845"
          }
        },
        {
          "client_id": "200570714500-b9i97kadm6me2b2hb9e7l3cmsop63ajk.apps.googleusercontent.com",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "AIzaSyBys0WVyFocO8ulfPdqIWMKCPWvy1HlppY"
        }
      ],
      "services": {
        "appinvite_service": {
          "other_platform_oauth_client": [
            {
              "client_id": "200570714500-b9i97kadm6me2b2hb9e7l3cmsop63ajk.apps.googleusercontent.com",
              "client_type": 3
            }
          ]
        }
      }
    }
  ],
  "configuration_version": "1"
}

放到项目中的位置:放到项目的./app 目录下即可,如果要区分debug or release 那就可以根据多渠道创建对应的文件夹下:

第 4 步:将 Firebase SDK 添加到应用中

buildscript {

    repositories {
      // Make sure that you have the following two repositories
      google()  // Google's Maven repository
      mavenCentral()  // Maven Central repository
    }

    dependencies {
      ...

      // Add the dependency for the Google services Gradle plugin
      classpath 'com.google.gms:google-services:4.3.15'
    }
}

allprojects {
  ...

  repositories {
    // Make sure that you have the following two repositories
    google()  // Google's Maven repository
    mavenCentral()  // Maven Central repository
  }
}
dependencies {
  implementation platform('com.google.firebase:firebase-bom:31.2.0')
  implementation 'com.google.firebase:firebase-analytics'
  implementation 'com.google.firebase:firebase-auth'
  implementation 'com.google.firebase:firebase-firestore'
 implementation  'com.google.firebase:firebase-messaging'
}
plugins {
    id 'com.android.application'

    // Add the Google services Gradle plugin
    id 'com.google.gms.google-services'
    ...
}

到此已经将Firebase sdk 引入到项目中了

5. FCM项目中使用:

5.1 首先创建一个类继承FirebaseMessagingService ,实现onMessageReceived()和 onNewToken()方法

class MessagingService : FirebaseMessagingService(), LifecycleObserver {

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (remoteMessage == null) {
            return
        }
        val remoteMessageMap: Map<String, String> = remoteMessage.data;
        if (remoteMessageMap == null || remoteMessageMap.isEmpty()) {
            return
        }
        val json = JSON.toJSON(remoteMessageMap) as JSONObject
    }

    override fun onNewToken(token: String) {
        try {
            MyApplication.instance?.let {
                ApiClient.getApiService(it.sessionManager).postPushToken(PushTokenBody(token))
            }
            val param = HashMap<String, Any>()
            param.put("fcm_registration_token", token)
            AppLog.setHeaderInfo(param)
        } catch (e: java.lang.Exception) {

        }
    }
}

onMessageReceived()是监听推送的消息,onNewToken()是当有新的Firebase token 时的回调,有新的 token 及时上传server

由于FirebaseMessagingService 是一个 service 所以要在AndroidManifest中声明:

        <service
            android:name=".ui.notification.MessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

5.2 启动APP时 获取firebase fcm token 上传server

初次启动APP时,FCM SDK 会为客户端应用实例生成一个注册令牌 (registration token),注意上面睡到 FirebaseMessagingService 并重写 onNewToken 来获取更新此token。

fcm token 可能会在发生下列情况时更改:

  • 应用在新设备上恢复

  • 用户卸载/重新安装应用

  • 用户清除应用数据。

获取fcm token:

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})
FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

6.使用 Firebase 控制台发送消息进行测试

可以使用 Firebase 控制台中的 Notifications Composer 发送通知消息。尽管使用这种方法发送消息的灵活性或可伸缩性不及使用 Admin SDK 或 HTTP 和 XMPP 协议,但它非常适合用于测试或者针对性较强的营销活动及用户互动。Firebase 控制台提供基于分析结果的 A/B Testing 测试,可帮助优化和改进营销消息。

从 Notifications Composer 发送通知消息时,Google 以如下方式使用您在表单字段中输入的值:

  • 用户细分有效期等字段用于确定消息目标和传送选项。

  • 通知文字自定义数据等字段以由键值对构成的载荷形式发送至客户端。

这些字段会映射至使用 Message 对象时可用的键。例如,在编辑器的自定义数据字段中输入的键值对是作为通知的 data 载荷处理的。其他字段直接映射至 notification 对象或平台专用通知配置中的键。

请注意,Notifications Composer 中的某些字段在使用 FCM API 时不可用。例如,您可以根据应用版本、语言、浏览器类型、浏览器版本或用户属性来定位细分用户群,而这些方法均无法通过服务器 API 来使用。

Firebase 控制台向客户端发送的键有:

控制台字段标签

说明

notification.title

通知标题

指示通知标题。

notification.body

通知文字

指示通知正文。

data

自定义数据

您定义的键值对。它们以数据载荷的形式传送至应用以进行处理。

决定消息传送方式的键包括:

控制台字段标签

说明

sound

声音

指示设备收到通知时要播放的声音。

time_to_live

有效期

此参数指定设备离线后消息在 FCM 存储区中保留的时长(以秒为单位)。 如需了解详情,请参阅设置消息的有效期。

这样通过控制台发送的消息推送,APP的onMessageReceived()就能接收到该消息

这个时候当APP杀死或者切后台时,FCM SDK会直接走系统的notificaion.如果这个时候APP在activity status 收到push message 后就可以做独立的逻辑了

7.使用 Firebase Admin SDK for FCM发送消息

Admin FCM API 可处理后端身份验证工作,同时便于发送消息和管理主题订阅。使用 Firebase Admin SDK,可以执行以下操作:

  • 向单个设备发送消息

  • 向主题和与一个或多个主题匹配的条件语句发送消息。

  • 为设备订阅和退订主题

  • 针对不同目标平台构建量身定制的消息载荷。

Admin Node.js SDK 提供了用于向设备组发送消息的方法。

使用Firebase Admin SDK 需要从Firebase 控制台获取json:

控制台->设置-->项目设置-->服务账号-->生成新的秘钥

拿到的admin sdk json 样式:

{
  "type": "service_account",
  "project_id": "testproject-82da6",
  "private_key_id": "2dab734ab58df4f1b0898cde1e8c8b488ae3134d",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCy3HNgzSSUTG8r\ny7CulZZr7CdW70UEfL6dbla1b9lmxdIDWmMz+/8tux8dSr7FKjvUhHjqF5R8Ua7b\nCySuvvwjhwHm9u9kC1bOmlOhzMMsfRCQqIFU5nPvq+6KIrELwrIk6wpwXof4+6ns\nUhPrOv3AyEi1+yeTlXipexsaQ1X45qPfCvAJea59DpbnObhtX0g5K5tp6IqwaXwg\ncXoUgTeQlkjG3f3Y5A/wNH2etAqzA299ixUyl/20hHyOY8wtTNj67ZgsW4bvufXF\n8+y2vm4i2eIgV1uvHpPRBHcH5lV8PJH8Pgd3n9dXDSuKDaq/zc87DbPC9ybSovLA\nkTnzUZWDAgMBAAECggEAVhz/S87Y2rGGIL7b3OJWXrV/J0LhpsxsdZ2HD6m/MNTz\nTPv6oS+lZx4dV9wBxymTTrlNAd/CdKxbFEjkK2H2QSCiENI45aDz9VqmA1NzcHry\nO8N1KSwfC3hqy4TyWqgtXsru5rUMoBqCcC4AOxPW0jdbkopOPqcLRgXoQZfDz6Zk\nhK2QhaIVbw2sHZZsCNYagRI+7AlS6VDT9FnREj5HoeyNFiNCT6th7Am6mi040mI1\nJaAJ2OhvNyW4vQpaLjT8Dadgw4uU3yLt+0wKtQJU83qNtgyiXnCNp4En7c+d/f0A\nrovZVpvA5LpVzokq+9nNTtrVEB1BmuxAyZnV/6I+eQKBgQDtCX791LezaSHAuIgL\nTlwQjCnd4nz+X2kYAACdfJMRHVuV2JcyHrV0Z+ICMX/hlqlyO9sP0Rs4gAfBtX2a\nerWzjT0OfhhJaTULY7nO/sXBNpsb/4LM4Ac6WN+gqL20Qp7ekExs5/cUoWjhsEQK\no+tauuMvAhGSG/Kz1ALa+5DmtQKBgQDBK4POi9+w9h+/FvlzKl6/1RSg1HAf3DyO\nsih+1dcb/YkptFH460tns3zq9AZBX3DAQPjb0yL8uEfdRBVtnCwEASVbujgKYZz+\ntsBkR6ZsPrBVsFP5bwvT6k7ioZgoQiriNwQkxrUa4Z9NdD/bWB6liEUp1f86vD03\noZ/bw2U2VwKBgCTvad5bmxRVuXCyUGCSoT3i2VM9y4RHkbSvq2je1HvCO1cqHMUu\ni8/LsCfvVqHsPBMUyJm6V6eCK7M/eIbtwApuY6kydM5bmmxf6cAbau0keR7vvY33\nCqlI1+/M22KPTvoXOhFuQ83vKMyiDrgpuq60mFnm1J4TxMnIq3k74eRRAoGBAKeH\nm8qYWKpa6vGJdVJCHuZ0YG2TkKKxGPwQ2zoVL3ghDMJUlvsw5bbMXbxPYtVzdo/m\nSW4s0R0onXryvzrOxQW8ELBa8pteSRBHYtgVo+og/EF0qX+cpT9m6H948kOIDzUd\nzcQvaYYkw0ojVfZfmESryIAeDjrcYqNK0x9/eNoFAoGBAJZ8+h0Fi0bonctG7TwC\nR0rRX04l1VeOnMLhlgXZp5z4lzl7Bpuuua2yJHRnuJyN46hUxv8aNNKYeQbv8tTD\nGbCxJnSmL636aYwPIBYylU74CjIoUmcC2ce7MoT7c9zXaZvEmhSWEyzHTDXTJwL4\nhbAsd2wwEC0PJuU/Ri3rfk+X\n-----END PRIVATE KEY-----\n",
  "client_email": "firebase-adminsdk-62mnh@testproject-82da6.iam.gserviceaccount.com",
  "client_id": "114249923120443166527",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-62mnh%40testproject-82da6.iam.gserviceaccount.com"
}

admin sdk 发送FCM message:

private static String getAccessToken() throws IOException {
  GoogleCredentials googleCredentials = GoogleCredentials
          .fromStream(new FileInputStream("service-account.json"))
          .createScoped(Arrays.asList(SCOPES));
  googleCredentials.refreshAccessToken();
  return googleCredentials.getAccessToken().getTokenValue();
}

这种方式客户端也是可以收到FCM Message 的

--至:大新

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

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

相关文章

CEC2017:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解cec2017(提供MATLAB代码)

一、鱼鹰优化算法简介 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 鱼鹰是鹰形目、鹗科、鹗属的仅有的一种中型猛禽。雌雄相似。体长51-64厘米…

Allegro如何设置铜皮避让的优先级操作指导

Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…

入门JAVA第十六天 数据库

一 、数据库技术学习内容与方法 1.1学习内容 1 Oracle 数据库 目前最好的关系型数据库 基本的CRUD命令。 SQL语句。select(R),update(U),detele(D),insert(C) 2 MySQL数据库 中小型醒目非常好用的关系型数据库。 灵活&#xff0c;小巧。 3 扩展软件开发流程中数据库设计原则 …

严格模式和非严格模式下的this指向问题

一、全局环境 1.函数调用 非严格模式&#xff1a;this指向是Window // 普通函数 function fn () { console.log(this, this); } fn() // 自执行函数 (function fn () { console.log(this, this); })() 严格模式&#xff1a;this指向是undefined //…

866363-70-4,N3-C5-NHS ester,叠氮-C5-NHS 主要物理性质分享

●外观以及性质&#xff1a;Azido-Aca-NHS淡黄色或无色油状&#xff0c;叠氮化物可以与炔烃、DBCO和BCN进行铜催化的点击化学反应。NHS酯可以与胺基反应&#xff0c;形成稳定的酰胺键。●中文名&#xff1a;叠氮-C5-NHS ester&#xff0c;6-叠氮己酸活性酯●英文名&#xff1a;…

「TCG 规范解读」PC 平台相关规范(2)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

CentOS 7安装N卡驱动和CUDA和cuDNN

前言系统一开始是CentOS 7.6&#xff0c;安装依赖时yum给的内核文件的版本号和uname -r的结果不一样&#xff0c;这时不能直接装依赖&#xff0c;装上后后面装驱动时会报错找不到内核头文件(最开始我直接装依赖了&#xff0c;以为高版本兼容低版本&#xff0c;然后装驱动时报错…

番外11:使用ADS对射频功率放大器进行非线性测试3(使用带宽5MHz的WCDMA信号进行ACLR测试)

番外11&#xff1a;使用ADS对射频功率放大器进行非线性测试3&#xff08;使用带宽5MHz的WCDMA信号进行ACLR测试&#xff09; 其他测试&#xff1a; 番外9&#xff1a;使用ADS对射频功率放大器进行非线性测试1&#xff08;以IMD3测试为例&#xff09; 番外10&#xff1a;使用AD…

前端工程构建问题汇总

1.less less-loader安装失败问题 npm install less-loader --save --legacy-peer-deps 加上–legacy-peer-deps就可以了 在NPM v7中&#xff0c;现在默认安装peerDependencies&#xff0c;这会导致版本冲突&#xff0c;从而中断安装过程。 –legacy-peer-deps标志是在v7中引…

MyBatis Plus Invalid bound statement 终极解决方案

MyBatis Plus Invalid bound statement 终极解决方案一、项目1.1 编码部分1.1.1 实体类1.1.2 dao层1.1.3 mapper.xml1.2 环境配置1.3 问题描述二、解决方案2.1 手动指定mapper.xml资源路径匹配规则2.2 使用mybatis自动配置2.3 测试效果三、附件一、项目 1.1 编码部分 1.1.1 实…

imx6ull_SPI

SPI简介 SPI 是Motorola 公司推出的一种同步串行接口技术&#xff0c;是一种高速、全双工的同步通信总线。SPI 以主从方式工作&#xff0c;通常是有一个主设备和一个或多个从设备&#xff0c;一般SPI 需要4 根线&#xff0c;但是也可以使用三根线(单向传输) 这四根线如下&…

torch函数合集

torch.tensor() 原型&#xff1a;torch.tensor(data, dtypeNone, deviceNone, requires_gradFalse) 功能&#xff1a;其中data可以是:list,tuple,NumPy,ndarray等其他类型,torch.tensor会从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应类型的torch.Tenso…

RestTemplate Java调用restful接口

目录1. GET请求相关方法&#xff08;1&#xff09;getForObject&#xff08;2&#xff09;getForEntity2. POST请求相关设置请求头和请求体&#xff1a;HttpEntity&#xff08;1&#xff09;postForLocation&#xff08;2&#xff09;postForObject&#xff08;3&#xff09;po…

pyqt实现聊天机器人

环境要求 通过调用openai接口实现聊天机器人功能&#xff0c;支持各种参数得调整&#xff0c;文章末尾有各个参数得说明 python3.9pyqt5环境安装 pip install pyqt5 pip install openai pip install pyinstaller源码如下&#xff1a; chat.py import sys from PyQt5.QtWid…

Cortex-A7中断控制器GIC

Cortex-A7中断控制器GIC 中断号 芯片内部的中断都会引起IRQ InterruptGIC将所有的中断源(最多1020个中断ID)分为三类: SPI(SharedPeripheralInterrupt)共享中断&#xff0c;外部中断都属于SPI中断 [ID32-1019]PPI(PrivatePeripheralInterrupt)私有中断 [ID16-31]SGI(Software-…

【MySQL】基础操作:登录、访问、退出和卸载

一、MySQL简介 MySQL数据库最初是由瑞典MySQL AB公司开发&#xff0c;2008年1月16号被Sun公司收购。2009年&#xff0c;SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统&#xff0c;同时它也是一个支持多线程、高并发、多用户的关系型数据库管理系统。…

亚马逊物流仓库配送延误,美国暴风雪造成损失严重!

美国拉响暴风雪警报&#xff0c;物流配送大面积延误 去年年底&#xff0c;美国的暴风雪给卖家带来的阴影还没有散去。在这本该春暖百花开的季节&#xff0c;暴风雪天气又回到了美国&#xff0c;这次的破坏力比去年年底的有过之而无不及。 当地2月22日&#xff0c;暴风雪在美国…

环境搭建01-Ubuntu16.04如何查看显卡信息及安装NVDIA显卡驱动

1. 查看显卡型号、驱动 ubuntu-drivers devices2. 安装NVIDIA显卡驱动 &#xff08;1&#xff09;验证是否禁用nouveau lsmod | grep nouveau若有输出&#xff0c;没有禁用&#xff0c;进行以下操作禁用。 sudo gedit /etc/modprobe.d/blacklist.conf在文件末尾中添加两条&…

从一个实例配置引入Prometheus的PromQL语法

1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理 2. 基本用法 2.1 查询时间序列 点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行…

数字逻辑基础:原码、反码、补码

时间紧、不理解可以只看这里的结论 正数的原码、反码、补码相同。等于真值对应的机器码。 负数的原码等于机器码&#xff0c;反码为原码的符号位不变&#xff0c;其余各位按位取反。补码为反码1。 三种码的出现是为了解决计算问题并简化电路结构。 在原码和反码中&#xff0c;存…