为什么 Higress 是 Knative 入口网关的最佳实践?

news2025/1/19 14:20:47

作者:赵伟基(兆维)

在传统的应用开发中,通常需要管理底层的基础设施、服务器与网络配置等方面的工作。然而在云原生 Serverless 化的浪潮下,这些基础设施的细节被抽象和自动化,开发者无需关注服务器等配置、扩展、监控和维护等工作,可以更专注于应用程序的业务逻辑和功能开发。Serverless 架构的价值在于提供高效、弹性、无服务器管理、服务按需付费、快速部署与迭代、以及高可扩展性等优势,降低开发和运维的复杂性,提高开发效率和应用程序的质量。

Knative Serving 是一款基于 K8s 的 Serverless 开源平台,用于构建和管理现代化、可拓展、流量驱动、无服务器的应用程序。Knative Serving 提供了诸多特性来支持用户部署 Serverless 服务,如基于 HTTP 流量触发 pod 的自动扩缩容、服务版本修订、自动流量管理、故障恢复等。

图片

来源:https://knative.dev/docs/serving/architecture/

Knative 整体架构如上层所示,Controller 和 DomainMapping 等组件等负责管理 KnativeCRD 资源的生命周期,其弹性能力由核心的 Activator、Autoscaler 和 Queue-Proxy 等组件提供。网络和路由能力依赖各类 Ingress Gateway 提供。

本文重点关注 Knative 网络层能力的实现。Knative 网络层能力需要依赖 Knative Ingress CRD 与其他网络层组件实现。目前,Knative 官方提供了基于 Contour、Istio 和 Kourier 等作为其网络层组件,提供有限的网络能力,如基本的路由、认证鉴权和 TLS 等,可以满足基本的路由和安全要求。Higress 是安全、流量和微服务三合一的云原生网关,使用 Higress 作为 Knative 服务的流量入口能够获得更强的流量治理、安全防护、可观测和可扩展能力。

图片

Knative 网络层工作原理

接下来我们以 Net-Istio 为例,介绍 Knative Serving 通过网络层实现服务对外发布的过程。Net-istio 网络层将数据面与控制面进行分离。数据面采用 Envoy,负责处理网络流量。控制面负责管理与配置数据面,支持对网关的动态配置和管理。

图片

当有 KService 被部署的时候,Knative Serving Controller 将解析 Kservice 中的路由项并生成对应的 KIngress 资源。KIngress 是 Knative 的 CRD,其资源中包含了服务对外披露所需的所有信息,示例如下:

apiVersion: networking.internal.knative.dev/v1alpha1
kind: Ingress
metadata:
  annotations:
    networking.knative.dev/ingress.class: istio.ingress.networking.knative.dev #指定istio作为网络层
  name: hello
  namespace: default
spec:
  httpOption: Enable #用于定义是否开启HTTPS重定向
  rules:
  - hosts:
    - hello.default.example.com
    http:
      paths:
      - splits: #Split定义了流量按百分比分配分配到不同的服务修订上。
        - appendHeaders:
            Knative-Serving-Namespace: default
            Knative-Serving-Revision: hello-00001
          percent: 100
          serviceName: hello-00001
          serviceNamespace: default
          servicePort: 80
    visibility: ExternalIP  #定义服务是仅集群内可访问还是对外披露。
  tls:  #指定通过HTTPS协议披露Kservice时使用的证书及密钥。
  - hosts:
    - hello.default.example.com
    secretName: route-ecbe0df2-101a-4aa4-8cf9-f2e98773fcdf
    secretNamespace: default

以 Istio 作为网络层为例,Net-Istio 组件监听集群中的 Kingress资源。每次 Kingress 被创建、删除或者修改的时候,Net-Istio 会同步解析 Kingress 资源,将 KIngress 的路由配置转换为 Istio 的 Virtual Service 和 Gateway 等资源。Istio 监听 VirtualService,并通过 xDS 下发路由配置给数据面 Envoy,从而完成路由配置的传递。

Envoy 接收到这个路由目标集群的 EDS 数据后,根据 Service 关联到的 Endpoint 的 IP 将请求转发给 Activator Pod 或者 Revision Pod。处于冷启动状态或者缩容状态时,Knative Controller 会将 Service 关联到的 Endpoint 设置为 Activator 的 Pod IP;处于稳定态时,Service 关联的 Endpoint 将被设置为用户部署的 Revision Pod IP。

理顺 Knative 网络层的工作原理后,我们可发现在 Knative 网络层中控制面实际承担的功能如下:

  1. 监听并获取 Knative Service 产生的 KIngress 资源。
  2. 将 KIngress 资源映射为数据面 Envoy 配置信息。
  3. 将配置信息披露给其管理的 Envoys。

不同的 Knative 网络层控制面通过自身机制完成路由配置的转化和传递,实现基本的路由能力。但在更复杂的应用场景下,现有网络层可能无法完全满足诸如安全、认证、可观测、细粒度流量治理与可扩展等方面的需求。一个解决的思路是在 Knative 网络层之上继续集成诸如安全网关、流量网关与可观测平台等组件,但多层网关的设计无疑会占用更多运行资源、增加运维成本。

Higress 适配 Knative Serving 方案

为了拓展 Knative 对各种场景的适应能力,叠加多层网关显然不是最好的选择。Higress 云原生网关作为集安全、流量、微服务三位于一体的下一代云上网关,使用 Higress 作为 Knative 服务的流量入口能够获得更强的流量治理、安全防护、可观测与可拓展能力,在稳定性、安全性上更有保证。目前,Higress 可以通过两种方式适配 Knative Serving,并在控制面能力进行了增强。

方案一:Higress+KIngress

图片

本方案适配 Knative Serving 的工作原理与其他 Knative 网络层类似,包含 KIngress 的监听与更新、路由配置的转换与数据面配置推送等过程。与此同时,Higress 兼容了 Knative Serving 网络层的所有特性,如不同服务修订间的流量划分、TLS、超时、重试、流量打标、自动端点发现等,确保 Knative 服务能够轻松使用 Higress 作为其流量入口。

值得一提的是,在此方案中,Higress 脱离了对其他自定义资源的依赖,只依赖于 Knative Serving 管理的 KIngress 资源与 K8s 集群通用资源如 endpoints,secrets 等,以一种更加“原生”的方式适配了 Knative。

得益于与微服务技术栈的良好集成和 WASM 扩展机制,Higress 能够为 Knative 服务提供诸如认证鉴权、限流、Waf 防护与可观测等更强大的能力。Serverless 服务开发者将无需关注基本能力的实现,只需关注于开发自己的业务逻辑。Higress 推出插件市场,在满足基本的安全、限流、认证鉴权等需求的同时,开放了自定义插件的接口,帮助用户更好的适配自身的 Serverless 应用。

方案二:Higress+IstioCRD

Higress 可以通过自己对 IstioCRD 的兼容能力来代替 Istio 成为 Knative 网关的控制面。具体方案如下图所示。不难看出,本方案是基于 Higress 对 IstioCRD 的兼容能力,通过 net-istio-controller 完成路由配置向 IstioCRD 的转化,Higress Controller 解析 IstioCRD 资源并进行配置的数据面下发,从而完成路由配置的传递。

图片

方案比较

Higress+Kingress 与 Higress+IstioCRD 都可以实现 Knative 网络层的能力,并兼容 Higress 在流量治理、安全防护、可观测和可扩展等方面的大部分能力。Istio 是个优秀的服务网格解决方案,但如果在应用场景中不需要服务网格,IstioCRD 反而会给集群带来额外的复杂度与资源消耗。而 Higress+KIngress 方案脱离了对其他自定义资源的依赖,以一种更加“原生”的方式适配了 Knative 且能力不打折。

Higress 对接 Knative 服务实践

前提条件

  1. 已安装 kubectl [ 1] 、Helm [ 2] 、Knative CLI (kn) [ 3]
  2. 已有 K8s 集群,版本在 Kubernetes v1.24 或以上。为演示方便,本文在本地 K8s 集群上进行实践。
  3. 安装 Knative CRD 与 Knative Serving 组件,详情可参考 Knative 安装指南 [ 4]
  4. 安装 Higress [ 5]

📌注:Higress Controller 部署时会进行 Knative CRD 检查,安装 Higress 前请确认 KnativeCRD 已经安装。

方案一:Higress+KIngress

配置 Knative 与 Higress 的适配项

  1. 配置 Knative 使用 Higress 作为 Ingress :
kubectl patch configmap/config-network \
  --namespace knative-serving \
    --type merge \
      --patch '{"data":{"ingress-class":"higress"}}'
  1. Knative 默认的路由策略是围绕域名展开的,需要设置 Knative 域名:
kubectl edit configmap config-domain -n knative-serving

通过编辑 configmap 中的 data 项来修改默认域名。本实践将默认域名修改为 example.com。该修改生效后,所有的 Knative 服务与路由将自动更新域名。

apiVersion: v1
data:
  example.com: ""
kind: ConfigMap
  1. 确认 Higress 对 Knative 资源的 RBAC 权限:
kubectl get clusterrole higress-controller-higress-system -o yaml

RBAC 权限列表中应有下列字段,如没有请通过 kubectl edit 命令手动添加:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
rule:
 ...
- apiGroups:
  - networking.internal.knative.dev
  resources:
  - ingresses
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - networking.internal.knative.dev
  resources:
  - ingresses/status
  verbs:
  - get
  - patch
  - update

完成上述配置后,即可使用 higress 无缝对接 Knative 服务。

Higress 兼容 Knative 网络层特性功能验证

1. 部署 Knative 服务

kn service create hello \
--image ghcr.io/knative/helloworld-go:latest \
--port 8080 \
--env TARGET=World
#Expected Output
Service hello created to latest revision 'hello-00001' is available at URL: 
http://hello.default.${LOADBALANCER_IP}.example.com
#其中${LOADBALANCER_IP}即为Higress Gateway IP,本地k8s集群部署时为空。

2. 验证 Knative AutoScaling

向 Hello 服务发送请求:

#本地部署时,LOADBALANCER_IP为127.0.0.1,此处通过No DNS的方式模拟
curl -H "host: hello.default.example.com" http://${LOADBALANCER_IP}
#Expected Output
Hello World!

通过下列命令观察 AutoScaling 过程:

kubectl get pod -l serving.knative.dev/service=hello -w

可以观察到请求转发到 Hello Service 上时触发了扩容过程,当一段时间没有请求时,Pod 数量自动缩容到 0:

NAME                                      READY   STATUS              RESTARTS   AGE
hello-00001-deployment-689c99c59b-6f5fw   0/2     Pending             0          0s
hello-00001-deployment-689c99c59b-6f5fw   0/2     ContainerCreating   0          0s
hello-00001-deployment-689c99c59b-6f5fw   1/2     Running             0          1s
hello-00001-deployment-689c99c59b-6f5fw   2/2     Running             0          1s
hello-00001-deployment-689c99c59b-6f5fw   2/2     Terminating         0          62s
hello-00001-deployment-689c99c59b-6f5fw   1/2     Terminating         0          91s
hello-00001-deployment-689c99c59b-6f5fw   0/2     Terminating         0          92s

3. 验证 Knative Traffic Splitting

KIngress 定义的 Traffic Splitting 特性负责管理不同 Knative 服务修订(Revision)间的流量划分规则。这个特性可以用于 Knative 服务蓝绿发布与灰度部署。Revision 是应用程序代码和配置的即时快照。每次更改 Knative 服务的配置时,都会创建一个新的修订。当有新修订发布时,Higress 会根据 KIngress 中的路由规则在 Knative 服务的不同版本之间划分流量。

创建 Hello 服务新的修订:

kn service update hello --env TARGET=Knative
#Expected Output   
Service 'hello' created to latest revision 'hello-00002' is available at URL:
http://hello.default.${LOADBALANCER_IP}.example.com

设置不同修订的流量百分比,其中 hello-00001 的流量百分比为 50%,hello-00002 的流量百分比为 50%。

kn service update hello --traffic hello-00001=50  --traffic @latest=50

多次向 Hello 服务发送请求,可以观察到流量被划分到两个不同的 Revision 上,并且比例满足设定的流量比例:

#Expected Output   
Hello Knative!
Hello World!
Hello Knative!
Hello World!

基于 Higress 插件增强 Knative 网络层能力

前文提到,Higress 能够为 Knative 服务提供诸如认证鉴权、限流、Waf 防护与可观测等更强大的能力。在本节实践中我们将结合 Higress 插件市场中的 key-auth 和 key-rate-limit 插件来简要演示 Higress 作为 Knative 网络层能够提供的认证鉴权和限流的能力。

1. 验证 Higress 对 Knative 服务的限流能力

设置限流规则,部署 key-rate-limit 插件。详情可参考基于 Key 限流 [6 ]

apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
  name: key-rate-limit
  namespace: higress-system
spec:
  defaultConfig:
    _rules_:
    # 规则二:按域名匹配生效
    - _match_domain_:
      - "hello.default.example.com"
      limit_by_header: x-ca-key
      limit_keys:
      - key: 123456
        query_per_minute: 2
  url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-rate-limit:1.0.0

上述配置具体含义如下,含请求头 “x-ca-key: 123456” 的请求速率将被限制为每分钟 3 次,1 分钟内超过 3 次的请求无法访问到 Knative 服务,该配置对 Knative 服务域名 “hello.default.example.com” 生效。我们通过如下请求进行验证:

curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
Hello World!    #正常请求到Knative服务,返回200
curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
Hello Knative!  #正常请求到Knative服务,返回200
curl -H "Host: hello.default.example.com" http://127.0.0.1 -H "x-ca-key: 123456" 
rate_limited   #触发限流,返回429

2. 验证 Higress 对 Knative 服务的认证鉴权能力

设置认证鉴权的相关规则,部署 key-auth 插件。详情可参考基于 Key 认证 [ 7]

apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
  name: key-auth
  namespace: higress-system
spec:
  defaultConfig:
    consumers:
    - credential: 2bda943c-ba2b-11ec-ba07-00163e1250b5
      name: consumer1
    - credential: c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
      name: consumer2
    keys:
    - apikey
    in_query: true
    _rules_:
    - _match_domain_:
      - "hello.default.example.com"
      allow:
      - consumer2
  url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-auth:1.0.0

上述配置具体含义如下:在用户组 consumer 中,只有 consumer2 有权访问,该配置对 knative 服务域名 “hello.default.example.com” 生效。我们通过如下请求进行验证:

curl -H "Host: hello.default.example.com" http://127.0.0.1
#请求未提供APIKey,返回401
curl -H "Host: hello.default.example.com" http://127.0.0.1/?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
#consumer1不具备访问权限,返回403
curl -H "Host: hello.default.example.com" http://127.0.0.1/?apikey=c8c8e9ca-558e-4a2d-bb62-e700dcc40e35
Hello World!  #consumer2具备访问权限,返回200

方案二:Higress+IstioCRD

除了上述 Higress+KIngress 解析的方法外,Higress 还可以基于自身对 IstioCRD 的兼容能力,通过 IstioCRD 来对接 Knative 服务。具体方式如下:

Step 1. 安装 IstioCRD

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm install istio-base istio/base -n istio-system --create-namespace

启用 IstioCRD 时,需更新 Higress 的部署参数:

helm upgrade higress -n higress-system --set global.enableIstioAPI=true higress.io/higress --reuse-values

Step 2. 安装相关网络层组件

通过运行以下命令安装 Knative Istio Controller(即 net-istio-controller)

kubectl apply -f https://github.com/knative/net-istio/releases/download/knative-v1.10.1/net-istio.yaml

Step 3. 配置 Istio Config 指向 Higress

Knative 社区给出了使用非默认网关的配置,详情参见 Install Istio for Knative-Knative [ 8] 。具体步骤:

修改 config-istio 中的 svc 为 higress-gateway:

kubectl edit configmap config-istio -n knative-serving

添加如下配置:

data:
  gateway.knative-serving.knative-ingress-gateway: higress-gateway.higress-system.svc.cluster.local
  local-gateway.knative-serving.knative-local-gateway: higress-gateway.higress-system.svc.cluster.local

更新命名空间 Knative-serving 中网关实例 knative-local-gateway 与 knative-ingress-gateway:

kubectl edit gw knative-local-gateway -n knative-serving
kubectl edit gw knative-ingress-gateway -n knative-serving

将网关实例 Knative-local-gateway 与 Knative-ingress-gateway 的 selector 下的 label 替换为 higress-gateway 的 label,higress-gateway 的默认如下:

spec:
  selector:
    app: higress-gateway
    higress: higress-system-higress-gateway

上述配置完成后,同样可以通过 Higress 实现 Knative 网络层的基本能力。


阿里云产品评测活动
邀请您参与下一代网关评测,可降低 50% 资源开销,展现技术和架构先进性,参与评测赢取猫超卡、Cherry 机械键盘,优秀文章还能署名发布到阿里开发者和阿里云云原生公众号。

进入链接立即参与:

https://developer.aliyun.com/mission/higress

相关链接:

[1] kubectl

https://kubernetes.io/docs/tasks/tools/

[2] Helm

https://helm.sh/

[3] Knative CLI (kn)https://knative.dev/docs/getting-started/quickstart-install/#install-the-knative-cli

[4] Knative 安装指南

https://knative.dev/docs/install/yaml-install/serving/install-serving-with-yaml/#install-the-knative-serving-component

[5] Higress

https://higress.io/zh-cn/docs/ops/deploy-by-helm/

[6] 基于 Key 限流https://higress.io/zh-cn/docs/plugins/key-rate-limit/

[7] 基于 Key 认证

https://higress.io/zh-cn/docs/plugins/key-auth/

[8] Install Istio for Knative-Knative

https://knative.dev/docs/install/installing-istio/#configuring-the-installation

[9] github: Higresshttps://github.com/alibaba/higress

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

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

相关文章

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【附安装包】谷歌浏览器安装教程

软件下载 软件:谷歌浏览器版本:110.0.5181语言:简体中文大小:1.3M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.59GHz 内存2G(或更高)下载通道①百度网盘丨64位下载链接:https://p…

学乐多光屏P90:智能引领儿童学习新时代

随着科技的迅猛发展,儿童教育正逐渐迈入数字化时代。在这个变革的浪潮中,学乐多光屏P90以其卓越的功能和深刻的教育理念,成为了智能儿童学习领域的引领者,为孩子们开启了全新的学习体验。 融合创新技术,引领学习变革 …

【Flutter】Flutter 使用 flutter_timezone 获取当前操作系统的时区

【Flutter】Flutter 使用 flutter_timezone 获取当前操作系统的时区 文章目录 一、前言二、flutter_timezone 包的背景三、安装和基本使用四、深入理解时区五、实际业务中的用法六、完整示例七、总结 一、前言 大家好!我是小雨青年,今天我想和大家分享一…

Tensorflow调用训练好的yolov5模型进行推理

文章目录 1、安装TensorFlow-GPU版本1.2、验证是否安装正常 2、将训练好的pt文件转换成onnx文件2.2、什么是Onnx模型和Tensorflow模型2.1、将onnx文件转换成pb文件 1、安装TensorFlow-GPU版本 1、创建虚拟环境python3.8 conda create -n TF2.4 python3.82、进入虚拟环境 conda…

点成分享丨冷冻保存技术对生物样本库的重要性

生物样本库概述 生物样本库又称生物银行,是一种集中收集、储存和管理各种生物样本(如血液、组织、DNA等),用于疾病的治疗和生命科学研究的生物应用系统。生物样本库有组织库、器官库、细胞株(系)库以及各种…

vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图

效果图&#xff1a; vis组件库&#xff1a;vis.js vis-network中文文档&#xff1a;vis-network 安装组件库&#xff1a; npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件&#xff1a; <template><…

【高等数学基础知识篇】——一元函数微分学的应用

本文仅用于个人学习记录&#xff0c;使用的教材为汤家凤老师的《高等数学辅导讲义》。本文无任何盈利或者赚取个人声望的目的&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 文章目录 一、中值定理1.1 极值点1.2 中值定理1.2.1 罗尔中值定理1.2.2 拉格朗日中值定理1.…

036 - timezone

timestamp随着mysql的time_zone变化而变化&#xff0c;但是datetime不会&#xff1b; -- 查询mysql的变量&#xff1a; show variables;-- 模糊查询变量中带有time_zone的变量&#xff1a; show variables like %time_zone%; -- 创建表 create table test_time_zone (a dateti…

分布式 - 服务器Nginx:一小时入门系列之HTTPS协议配置

文章目录 1. HTTPS 协议2. 生成证书3. 配置 SSL4. HTTPS 协议优化 1. HTTPS 协议 HTTPS 是一种通过计算机网络进行安全通信的协议。它是HTTP的安全版本&#xff0c;通过使用 SSL 或 TLS 协议来加密和保护数据传输。HTTPS的主要目的是确保在客户端和服务器之间传输的数据是加密…

跟着文快速创建一个完整的TDesign后台系统

先创建一个文件夹 来作为项目的载体 打开终端 首先 我们执行 npm i tdesign-starter-clilatest -g全局装一下依赖 然后执行 td-starter init我不清楚你们哦 反正我第一次是报错了 告诉我们少了 babel/core 那就读字面呗 不想复杂了 直接 npm install -g babel/core全局装一…

“光遗传学治疗晚期视网膜色素变性”,9月6日星明优健执行总裁孙思睫博士直播分享

视网膜色素变性 &#xff08;Retinitis pigmentosa&#xff0c;RP&#xff09; 是一种进行性、单基因遗传的神经退行性致盲疾病&#xff0c;由超过71个不同的基因突变引起&#xff0c;并影响着全球超过200万人。视网膜色素变性会破坏视网膜的感光细胞&#xff0c;可能导致患者完…

【NX】分割曲线出现“输入行的长度为0”

在nx使用分割曲线的功能或者函数的时候&#xff0c;偶尔会提示如下&#xff1a; “输入行的长度为0”。实际上这是翻译的过&#xff0c;应该是the length of input is 0 之类的直译。 针对这种情况&#xff0c;一般要考虑是输入的曲线有问题或者点有问题&#xff0c;这时候我们…

SQLI-labs-第二关

目录 知识点&#xff1a;数字型get注入 1、在url中输入?id1 2、判断注入点 3、判断目前表的字段数 4、判断回显位置 5、爆库名 6、爆表名 7、爆字段名&#xff0c;以users表为例 ​编辑8、爆值 知识点&#xff1a;数字型get注入 思路&#xff1a; 1、在url中输入?id1 2…

Python3多线程/多进程解决方案(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 文章目录 1. 多线程2. 多进程示例1&#xff1a;multiprocessing.Pool直接实现对一个列表中的每个元素的函数操作示例2&#xff1a;使用苏神写的工具函数实现对一个迭代器中每个元素的函数操作 1. 多线程 2. 多进程 示例1&#xff1a;multiproc…

强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品

2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…

易基因:5mC DNA甲基化介导茶树组织功能分化和重要风味物质合成调控|植物研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在植物中&#xff0c;5mC DNA甲基化修饰&#xff08;简称5mC甲基化&#xff09;是一个重要而保守的表观基因标记&#xff0c;参与基因组稳定性、基因转录调控、发育调控、非生物胁迫响应…

重生c++系列之类与对象(中篇)

好的继上期&#xff0c;我们今天带来c类与对象系列的继续学习。 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员 函数。 …

【Latex】使用技能站:(一)Visio导出矢量图并导入Latex模板

Visio导出矢量图并导入Latex模板 引言1 安装Inkscape工具1.1 官网下载并安装1.2 添加环境变量 2 Visio导出svg文件3 Inkscape 转换为PDF或EPS格式4 Latex导入.pdf或者.eps矢量图 引言 矢量图格式有&#xff1a;svg&#xff0c;eps&#xff0c;pdfVisio能导出的矢量图格式有&am…