【云原生 | Kubernetes 实战】16、K8s 配置管理中心 ConfigMap 实现微服务配置管理

news2025/1/22 8:26:49

目录

一、ConfigMap 概述

1.1  什么是 ConfigMap?

1.2  ConfigMap 能解决哪些问题?

1.3 ConfigMap 应用场景

1.4 局限性

二、ConfigMap 创建方法

2.1 根据字面值创建 ConfigMap

2.2 基于文件创建 ConfigMap 

2.3 基于目录创建 ConfigMap

2.4 编写 configmap 资源清单 YAML 文件 

三、使用 ConfigMap

3.1 通过环境变量引入:使用 configMapKeyRef 

3.2 通过环境变量引入:使用 envfrom

3.3 把 configmap 做成 volume 挂载到 pod 

四、ConfigMap 热更新 


 

一、ConfigMap 概述

1.1  什么是 ConfigMap?

        Configmap 是 k8s中 的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。

1.2  ConfigMap 能解决哪些问题?

        我们在部署服务的时候,每个服务都有自己的配置文件,如果一台服务器上部署多个服务:nginx、tomcat、apache 等,那么这些配置都存在这个节点上,假如一台服务器不能满足线上高并发的要求,需要对服务器扩容,扩容之后的服务器还是需要部署多个服务:nginx、tomcat、apache,新增加的服务器上还是要管理这些服务的配置,如果有一个服务出现问题,需要修改配置文件,每台物理节点上的配置都需要修改,这种方式肯定满足不了线上大批量的配置变更要求。 所以,k8s 中引入了 ConfigMap 资源对象,可以当成 volume 挂载到 pod 中,实现统一的配置管理。

  • ConfigMap 是 k8s 中的资源,相当于配置文件,可以有一个或者多个 ConfigMap;
  • ConfigMap 可以做成 Volume,k8s pod 启动之后,通过 volume 形式映射到容器内部指定目录上;
  • 容器中应用程序按照原有方式读取容器特定目录上的配置文件;
  • 在容器看来,配置文件就像是打包在容器内部特定目录,整个过程对应用没有任何侵入。

1.3 ConfigMap 应用场景

        使用 k8s 部署应用,当你将应用配置写进代码中,更新配置时也需要打包镜像,ConfigMap 可以将配置信息和 docker 镜像解耦,以便实现镜像的可移植性和可复用性,因为一个 ConfigMap 其实就是一系列配置信息的集合,可直接注入到 Pod 中给容器使用。ConfigMap 注入方式有两种,一种将 ConfigMap 做为存储卷,一种是将 ConfigMap 通过 env 中 configMapKeyRef 注入到容器中。

        使用微服务架构的话,存在多个服务共用配置的情况,如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用 ConfigMap 可以友好的进行配置共享。

1.4 局限性

        ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过1 MiB。如果你需要保存超出此尺寸限制的数据,可以考虑挂载存储卷或者使用独立的数据库或者文件服务。

ConfigMap 概念官方参考文档:ConfigMap | Kubernetes

二、ConfigMap 创建方法

        你可以使用 kubectl create configmap 或者在 kustomization.yaml 中的 ConfigMap 生成器来创建 ConfigMap。注意,kubectl 从 1.14 版本开始支持 kustomization.yaml

使用 kubectl create configmap 创建 ConfigMap:

你可以使用 kubectl create configmap 命令基于目录、 文件或者字面值来创建 ConfigMap:

kubectl create configmap <映射名称> <数据源>

        其中,<映射名称> 是为 ConfigMap 指定的名称,<数据源> 是要从中提取数据的目录、 文件或者字面值。ConfigMap 对象的名称必须是合法的 DNS 子域名.

        在你基于文件来创建 ConfigMap 时,<数据源> 中的键名默认取自文件的基本名, 而对应的值则默认为文件的内容。

你可以使用 kubectl describe 或者 kubectl get 获取有关 ConfigMap 的信息。

2.1 根据字面值创建 ConfigMap

        你可以将 kubectl create configmap 与 --from-literal 参数一起使用, 通过命令行定义文字值:

# 查看帮助命令
[root@k8s-master01 ~]# kubectl create configmap --help
······
Usage:
  kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none]
[options]

# 创建 configmap
[root@k8s-master01 ~]# kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com

[root@k8s-master01 ~]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      59d
tomcat-config      2      39s

# 显示 ConfigMap 的详细信息:命令行中提供的每对键值在 ConfigMap 的 data 部分中均表示为单独的条目。
[root@k8s-master01 ~]# kubectl describe configmaps tomcat-config 
Name:         tomcat-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
server_name:
----
myapp.tomcat.com
tomcat_port:
----
8080

BinaryData
====

Events:  <none>

2.2 基于文件创建 ConfigMap 

你可以使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap。

[root@k8s-master01 ~]# mkdir configmap
[root@k8s-master01 ~]# cd configmap/
[root@k8s-master01 configmap]# vim nginx.yaml
server {
  listen 80;
  server_name www.nginx.com;
  root /home/nginx/www/
}

# 定义一个 key 是 www,值是 nginx.yaml 中的内容
[root@k8s-master01 configmap]# kubectl create configmap www-nginx --from-file=www=./nginx.yaml 
configmap/www-nginx created

[root@k8s-master01 configmap]# kubectl describe configmaps www-nginx 
Name:         www-nginx
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www:
----
server {
  listen 80;
  server_name www.nginx.com;
  root /home/nginx/www/
}



BinaryData
====

Events:  <none>

[root@k8s-master01 configmap]# kubectl get configmaps www-nginx 
NAME        DATA   AGE
www-nginx   1      34s

2.3 基于目录创建 ConfigMap

        你可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当你基于目录来创建 ConfigMap 时,kubectl 识别目录下基本名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。

例如:

# 创建本地目录
[root@k8s-master01 ~]# mkdir -pv configure-pod-container/configmap/

# 创建示例文件到 `configure-pod-container/configmap/` 目录
[root@k8s-master01 ~]# cd configure-pod-container/configmap/
[root@k8s-master01 configmap]# echo "server-id=1" > my-server.conf
[root@k8s-master01 configmap]# echo "server-id=2" > my-slave.conf

# 创建 configmap
[root@k8s-master01 configmap]# kubectl create configmap mysql-config --from-file=/root/configure-pod-container/configmap/

        以上命令将 configure-pod-container/configmap 目录下的所有文件,也就是 my-server.conf 和 my-slave.conf 打包到 mysql-config ConfigMap 中。你可以使用下面的命令显示 ConfigMap 的详细信息:

[root@k8s-master01 configmap]# kubectl describe configmaps mysql-config 
Name:         mysql-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
my-server.conf:
----
server-id=1

my-slave.conf:
----
server-id=2


BinaryData
====

Events:  <none>

configure-pod-container/configmap/ 目录中的 server.conf 和 my-slave.conf 文件出现在 ConfigMap 的 data 部分。

创建 ConfigMap 官方参考文档: 配置 Pod 使用 ConfigMap | Kubernetes

2.4 编写 configmap 资源清单 YAML 文件 

# 查看帮助命令
[root@k8s-master01 ~]# kubectl explain configmap

# 创建 configmap 资源文件
[root@k8s-master01 configmap]# vim mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  master.cnf: |         # master.cnf 是文件名称,“ | ” 符号代表文件内容有多行
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    [mysqld]
    super-read-only
    log_bin_trust_function_creators=1

# 创建资源
[root@k8s-master01 configmap]# kubectl apply -f mysql-configmap.yaml 
configmap/mysql created

# 查看是否成功创建
[root@k8s-master01 configmap]# kubectl get configmaps mysql
NAME    DATA   AGE
mysql   2      14s

编写 configmap 资源清单官方参考文档:ConfigMap | Kubernetes 

三、使用 ConfigMap

你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:

  1. 在容器命令和参数内
  2. 容器的环境变量(常用)
  3. 在只读卷里面添加一个文件,让应用来读取(常用)
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

        这些不同的方法适用于不同的数据使用方式。 对前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。

        第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据。然而, 由于你是直接使用 Kubernetes API,因此只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新,并且在这样的情况发生的时候做出反应。 通过直接进入 Kubernetes API,这个技术也可以让你能够获取到不同的名字空间里的 ConfigMap。

3.1 通过环境变量引入:使用 configMapKeyRef 

# 创建一个存储 mysql 配置的 configmap
[root@k8s-master01 configmap]# vim mysql-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"

[root@k8s-master01 configmap]# kubectl apply -f mysql-configmap.yaml 

# 创建 pod,引用 configmap 中的内容
[root@k8s-master01 configmap]# vim mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    env:
    - name: log_bin           # 定义环境变量 log_bin
      valueFrom: 
        configMapKeyRef:      # ConfigMap 包含你要赋给 log_bin 的值
          name: mysql         # 指定 configmap 的名字
          key: log            # 指定 configmap 中的 key,即把 log=1 的值赋给 log_bin 变量
    - name: lower             # 定义环境变量 lower
      valueFrom:    
        configMapKeyRef:
          name: mysql
          key: lower
  restartPolicy: Never

[root@k8s-master01 configmap]# kubectl apply -f mysql-pod.yaml 
pod/mysql-pod created
[root@k8s-master01 configmap]# kubectl get pods
NAME                               READY   STATUS    RESTARTS        AGE
mysql-pod                          1/1     Running   0               20s

# 进入容器内部,Pod 的输出包含环境变量 log_bin=1,lower=1。
[root@k8s-master01 configmap]# kubectl exec -it mysql-pod -- sh
/ # printenv 
log_bin=1
lower=1

使用单个 ConfigMap 中的数据定义容器环境变量:配置 Pod 使用 ConfigMap | Kubernetes 

3.2 通过环境变量引入:使用 envfrom

        使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。

[root@k8s-master01 configmap]# vim mysql-pod-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-envfrom
spec:
  containers:
  - name: mysql
    image: busybox
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh", "-c", "sleep 3600" ]
    envFrom: 
    - configMapRef:
       name: mysql     #指定configmap的名字
  restartPolicy: Never

[root@k8s-master01 configmap]# kubectl apply -f mysql-pod-envfrom.yaml 
pod/mysql-pod-envfrom created
[root@k8s-master01 configmap]# kubectl get pods 
NAME                               READY   STATUS    RESTARTS        AGE
mysql-pod                          1/1     Running   0               15m
mysql-pod-envfrom                  1/1     Running   0               4s

# 进入容器内部查看环境变量
[root@k8s-master01 configmap]# kubectl exec -it mysql-pod-envfrom -- sh
/ # printenv 
lower=1
log=1

 将 ConfigMap 中的所有键值对配置为容器环境变量:配置 Pod 使用 ConfigMap | Kubernetes

3.3 把 configmap 做成 volume 挂载到 pod 

        在 Pod 规约的 volumes 部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到 volumeMounts.mountPath 所指定的目录 (在本例中为 /tmp/config)。 

# 创建 configmap
[root@k8s-master01 configmap]# vim mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  log: "1"
  lower: "1"
  my.cnf: |
    [mysqld]
    hello sky

[root@k8s-master01 configmap]# kubectl apply -f mysql-configmap.yaml 

# 创建 pod,使用存储在 ConfigMap 中的数据填充卷
[root@k8s-master01 configmap]# vim mysql-pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod-volume
spec:
  containers:
  - name: mysql
    image: busybox
    command: [ "/bin/sh","-c","ls /tmp/config" ]
    volumeMounts:
    - name: mysql-config          # 与 volumes.name 一致
      mountPath: /tmp/config      # 容器内挂载的目录
  volumes:
  - name: mysql-config            # 卷的名称
    configMap:
      name: mysql                 # configmap 的名称
  restartPolicy: Never

[root@k8s-master01 configmap]# kubectl apply -f mysql-pod-volume.yaml 
pod/mysql-pod-volume created

[root@k8s-master01 configmap]# kubectl get pods 
NAME                               READY   STATUS    RESTARTS       AGE
mysql-pod                          1/1     Running   0              55m
mysql-pod-envfrom                  1/1     Running   0              40m
mysql-pod-volume                   1/1     Running   0              5s

# 进入容器内部查看挂载卷下的数据,把 configmap 的内容变为文件存储了
[root@k8s-master01 configmap]# kubectl exec -it mysql-pod-volume -- sh
/ # cd /tmp/config/
/tmp/config # ls
log     lower   my.cnf
/tmp/config # cat log
1/tmp/config # cat lower
/tmp/config # cat my.cnf 
[mysqld]
hello sky

        在这里,ConfigMap 中键 log 的内容将挂载在 config-volume 卷中 /tmp/config/log 文件中。

使用存储在 ConfigMap 中的数据填充卷:配置 Pod 使用 ConfigMap | Kubernetes

四、ConfigMap 热更新 

        当某个已被挂载的 ConfigMap 被更新,所投射的内容最终也会被更新。 对于 Pod 已经启动之后所引用的、可选的 ConfigMap 才出现的情形, 这一动态更新现象也是适用的。

        kubelet 在每次周期性同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能等于 kubelet 同步周期 (默认 1 分钟) + ConfigMap 在 kubelet 中缓存的 TTL(默认 1 分钟)。

# 修改 configmap
[root@k8s-master01 ~]# kubectl edit configmaps mysql
apiVersion: v1
data:
  log: "2"        # 把 1 改为 2
  lower: "1"
······

# 进入挂载卷创建的 pod 容器内部查看 log 内容是否有变化
[root@k8s-master01 ~]# kubectl exec -it mysql-pod-volume -- sh
/ # cd /tmp/config/
/tmp/config # ls
log     lower   my.cnf
/tmp/config # cat log
2/tmp/config # 

# 发现 log 值变成了 2,更新生效了

# 进入 env 创建的 pod 查看环境变量是否有变化
[root@k8s-master01 ~]# kubectl exec -it mysql-pod-envfrom -- sh
/ # printenv 
lower=1
log=1

# 没有变化

注意:更新 ConfigMap 后,使用该 ConfigMap 挂载的 Env 不会同步更新;使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

挂载的 ConfigMap 将被自动更新:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#mounted-configmaps-are-updated-automatically

上一篇文章:【云原生 | Kubernetes 实战】15、K8s 控制器 Daemonset 入门到企业实战应用

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

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

相关文章

【大数据系列之MySQL】(二十二):MySQL中的分组查询group by

对于常见的函数都是单行函数&#xff0c;说白了就是一一映射&#xff0c;输入一个值则输出对应的值&#xff0c;但是MySQL中还存在聚合函数就是输入一组值则返回一个值&#xff0c;常见的例如&#xff1a;sum、max等 很多时候需要对数据中的某些字段进行分组&#xff0c;探究每…

%27 CORS 跨域资源共享

1、CORS &#xff08;跨域资源共享&#xff09; 由一系列的 HTTP 响应头组成&#xff0c;这些响应头可以决定浏览器是否阻止前端 js 代码跨域获取资源 2、CORS 的响应头 &#xff08;1&#xff09;、Access-Control-Allow-Origin res.setHeader(‘Access-Control-Allow-Origin’…

web:常见安全问题

一、XSS XSS(Cross-Site Scripting)&#xff0c;跨站脚本攻击&#xff0c;因为缩写和css重叠&#xff0c;所以只能叫XSS。跨站脚本攻击是指通过存在安全漏洞的web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。 跨站脚本攻击有可能造成一下影响&#…

记一次赤裸裸的教训:All elements are null

wshanshi&#xff1a;记一次赤裸裸的教训…All elements are null… 一、异常信息 数据库查询统计相关业务&#xff0c;未使用分组group by&#xff0c;仅单独使用聚合函数。如下图所示&#xff0c;使用了SUM()函数。 假如数据库中未匹配到相关数据&#xff0c;结果集用List接…

希尔伯特-包络分析步骤与实例

希尔伯特-包络分析流程 对于齿轮箱振动信号而言&#xff0c;由于存在多对齿轮同时参与啮合&#xff0c;那么&#xff0c;测量得到的信号将可能出现多个以齿轮啮合频率或及谐频为载波频率、轴频为调制频率的幅值调制、频率调制或混合调制的情况&#xff0c;除此之外&#xff…

logback+slf4j日志详解

前言 项目中日志系统是必不可少的&#xff0c;目前比较流行的日志框架有log4j、logback等&#xff0c;可能大家还不知道&#xff0c;这两个框架的作者是同一个人&#xff0c;Logback旨在作为流行的log4j项目的后续版本&#xff0c;从而恢复log4j离开的位置。 另外 slf4j(Simp…

第二证券|昨日涨停,今日1分钟闪崩跌停,超1亿资金排队“出逃”!

养老概念股悦心健康&#xff08;SZ002162&#xff09;在接连2个涨停后&#xff0c;12月21日早盘&#xff0c;悦心健康大幅低开&#xff0c;1分钟闪崩跌停。 值得注意的是&#xff0c;20日盘后龙虎榜数据显现&#xff0c;万和证券股份有限公司成都通盈街证券营业部净买入1492.92…

HttpUnit是什么?如何应用?

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 什么是HttpUnit? HttpUnit是基于JUnit构建的一个开源的测试框架&#xff0c;专门针对Web应用的测试&#xff0c;用于解…

TM32 DMA1和DMA2通道一览表、STM32F103C8T6定时器通道对应的引脚

TIM1_BRK_IRQn 24, TIM1_UP_IRQn 25, TIM1_TRG_COM_IRQn 26, TIM1_CC_IRQn 27, TIM2_IRQn 28, TIM3_IRQn 29, 这个函数TIM_SetCompare1&#xff0c…

计算机毕设Python+Vue学习互助平台网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Ma…

Redhat rpm常用命令以及如何配置yum软件仓库使用yum install

yum 软件仓库配置教程一、RPM&#xff08;红帽软件包管理器&#xff09;二、Yum 软件仓库简介三、注册Red Hat开发者四、配置 Yum 软件仓库一、RPM&#xff08;红帽软件包管理器&#xff09; 在 RPM&#xff08;红帽软件包管理器&#xff09;公布之前&#xff0c;要想在 Linux…

如何用 Python 在 Excel 中画柱状图

我们手动在 Excel 表格中画柱状图是很简单的事情&#xff0c;但是一旦这种简单的工作需要每天都做&#xff0c;那么最好的办法就是用 Python 来自动完成。 今天分享一招&#xff0c;如何用 Python 在 Excel 中画柱状图。 这里借助于工具 openpyxl&#xff0c;如果有更好的工具…

2. 【gRPC系列学习】 创建一元gRPC的客户端与服务端

学习讲求循序渐进,在分析代码原理之前应该熟练使用,本节我们一起搭建最简单一元gRPC模式,其中也包含安装protoc工具。 1. 创建项目目录结构 pb文件夹用于存放proto文件以及生成的pb文件 client文件夹存放客户端代码 server文件夹存放服务端代码 现在并未创建这几个文件,里面…

更懂城市、更懂人:闪马智能再添双认证

在中国工程院院刊《Engineering》刚刚发布的“2022全球十大工程成就”中&#xff0c;北斗卫星导航系统、嫦娥探月工程以及新冠病毒疫苗研发应用等重大创新&#xff0c;无不显现出人类推动科技发展边界突破的决心和勇气&#xff0c;为人类文明进步提供不竭动力。 眼下&#xff…

Pegasus Serial Port Tool @ Simplicity Version 串口测试工具简化版发布

Pegasus Serial Port Tool Simplicity Version 串口测试工具简化版发布 基于Electron桌面软件开发平台制作的PSPT ( Pegasus Serial Port Tool ) 串口测试工具发布简化版。免费用于任何个人和商业环境使用。 平台&#xff1a;Windows 11 / Windows 10 / Windows 7 介绍&…

设计模式原则 - 迪米特法则(六)

迪米特法则一 官方定义基本介绍二 案例演示普通实现方式案例分析迪米特法则方式三 注意事项一 官方定义 迪米特法则&#xff08;Law of Demeter, LoD&#xff09;是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的&#xff0c;它要求一个对象应该对其他对…

机器学习100天(十五):015 逻辑回归基本原理

机器学习100天,今天讲的是:逻辑回归基本原理 一、线性回归与逻辑回归 我们之前介绍过线性回归,我们知道线性回归用于数值预测,例如房屋价格预测、信用卡额度预测等。线性回归最重要的一点就是它的预测值,即因变量一定是连续值,比如说房价。 而逻辑回归,它不是线性预测…

python数学建模--灰色预测

目录灰色预测一阶灰色方程GM(1,1)建模步骤应用及其求解步骤求级比一次累加序列求参数矩阵uuu时间响应式求预测序列模型检验实际值与预测值比较及可视化二阶灰色方程GM(2,1)灰色预测 灰色预测模型是通过少量的、不完全的信息&#xff0c;建立数学模型做出预测的预测方法&#x…

一篇文章彻底明白重要概念——注解

1. 注解基本概念 注解&#xff0c;什么是注解&#xff1f; 打开百度搜索 好&#xff0c;看不懂 没关系 一步一步慢慢来 先不管注解&#xff0c;注释这个概念应该就很熟悉了&#xff0c;文档注释&#xff0c;单行注释&#xff0c;多行注释 注释是对一段程序&#xff0c;一…

实战三十七:基于HMM模型实现中文分词

任务描述:在理解中文文本的语义时需要进行分词处理,分词算法包括字符串匹配算法,基于统计的机器学习算法两大类。本案例在前文将说明常用分词库及其简单应用,之后会通过中文分词的例子介绍和实现一个基于统计的中文分词方法——HMM模型,该模型能很好地处理歧义和未登录词问…