【consul】
consul
- 一、什么是服务注册与发现
- 1.1
- 1.2
- 二、 什么是consul
- 2.1定义
- 2.2特性
- 2.2.1服务注册与发现:
- 2.2.2健康检查:
- 2.2.3Key/Value存储:
- 三、consul部署
- -datacenter :指定数据中心名称,默认是dc1。
- consul :指定consul服务器的IP和端口。
- -join :加入到已有的集群中
一、什么是服务注册与发现
1.1
服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。这里就会有几个问题:
●如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦
●后端服务的网络位置变化,都需要改变每个调用者的配置
1.2
既然有这些问题,那么服务注册与发现就是解决这些问题的。后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT。服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!
二、 什么是consul
2.1定义
开源的
go语言开发的服务管理软件
支持多数据中心、分布式高可用的、服务发现和配置共享采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。
在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测。
2.2特性
2.2.1服务注册与发现:
consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
2.2.2健康检查:
健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
2.2.3Key/Value存储:
一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
多数据中心:无需复杂的配置,即可支持任意数量的区域。
三、consul部署
consul服务器 192.168.10.23 运行consul服务、nginx服务、consul-template守护进程
registrator服务器 192.168.10.13 运行registrator容器、运行nginx容器
systemctl stop firewalld.service
setenforce 0
-------- consul服务器 --------
- 建立 Consul 服务
mkdir /opt/consulcp consul_0.9.2_linux_amd64.zip /opt/consulcd /opt/consulunzip consul_0.9.2_linux_amd64.zipmv consul /usr/local/bin/
//设置代理,在后台启动 consul 服务端
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.23 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
-datacenter :指定数据中心名称,默认是dc1。
netstat -natp | grep consul
启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口
- 查看集群信息
#查看members状态
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.10.23:8301 alive server 0.9.2 2
#查看集群状态
consul operator raft list-peersconsul info | grep leaderleader = trueleader_addr = 192.168.10.23:8300
- 通过 http api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers #查看集群server成员curl 127.0.0.1:8500/v1/status/leader #集群 server-leadercurl 127.0.0.1:8500/v1/catalog/services #注册的所有服务curl 127.0.0.1:8500/v1/catalog/nginx #查看 nginx 服务信息curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息
-------- registrator服务器 --------
//容器服务自动加入 Nginx 集群
- 安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.10.13 \
consul://192.168.10.23:8500
–net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
–restart=always :设置在容器退出时总是重启容器。
–ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。
consul :指定consul服务器的IP和端口。
- 测试服务发现功能是否正常
docker run -itd -p:83:80 --name test-01 -h test01 nginxdocker run -itd -p:84:80 --name test-02 -h test02 nginxdocker run -itd -p:88:80 --name test-03 -h test03 httpddocker run -itd -p:89:80 --name test-04 -h test04 httpd httpd
#-h:设置容器主机名
- 验证 http 和 nginx 服务是否注册到 consul
浏览器中,输入 http://192.168.10.23:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。
//在consul服务器使用curl测试连接服务器
curl 127.0.0.1:8500/v1/catalog/services
{“consul”:[],“httpd”:[],“nginx”:[]}
------------------------------------ consul-template ------------------------------------
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。
- 准备 template nginx 模板文件
//在consul服务器上操作vim /opt/consul/nginx.ctmpl#定义nginx upstream一个简单模板upstream http_backend {{{range service "nginx"}}server {{.Address}}:{{.Port}};{{end}}}
#定义一个server,监听8000端口,反向代理到upstream
server {listen 8000;server_name localhost 192.168.10.23;access_log /var/log/nginx/kgc.com-access.log; #修改日志路径index index.html index.php;location / {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://http_backend;}
}
- 编译安装nginx
yum -y install pcre-devel zlib-devel gcc gcc-c++ makeuseradd -M -s /sbin/nologin nginxtar zxvf nginx-1.12.0.tar.gz -C /opt/cd /opt/nginx-1.12.0/./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 配置 nginx
vim /usr/local/nginx/conf/nginx.conf......http {include mime.types;include vhost/*.conf; #添加虚拟主机目录default_type application/octet-stream;......
//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
//创建日志文件目录
mkdir /var/log/nginx
//启动nginx
nginx
- 配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/cd /opt/mv consul-template /usr/local/bin/
//在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.10.23:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
//另外打开一个终端查看生成配置文件
upstream http_backend {server 192.168.10.13:83;server 192.168.10.13:84;}server {listen 8000;server_name 192.168.10.23;access_log /var/log/nginx/kgc.cn-access.log;index index.html index.php;location / {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://http_backend;}
}
- 访问 template-nginx
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9f0dc08956f4 httpd "httpd-foreground" 1 hours ago Up 1 hours 0.0.0.0:89->80/tcp test-04a0bde07299da httpd "httpd-foreground" 1 hours ago Up 1 hours 0.0.0.0:88->80/tcp test-034f74d2c38844 nginx "/docker-entrypoint.…" 1 hours ago Up 1 hours 0.0.0.0:84->80/tcp test-02b73106db285b nginx "/docker-entrypoint.…" 1 hours ago Up 1 hours 0.0.0.0:83->80/tcp test-01409331c16824 gliderlabs/registrator:latest "/bin/registrator -i…" 1 hours ago Up 1 hours registratordocker exec -it 4f74d2c38844 bash
echo "this is test1 web" > /usr/share/nginx/html/index.htmldocker exec -it b73106db285b bash
echo "this is test2 web" > /usr/share/nginx/html/index.html
浏览器访问:http://192.168.10.23:8000/,并不断刷新。
- 增加一个 nginx 容器节点
(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx
//观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf 文件内容,并且重载 nginx 服务。
(2)查看/usr/local/nginx/conf/vhost/kgc.conf 文件内容
cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {server 192.168.10.23:83;:去!server 192.168.10.23:84;server 192.168.10.23:85;server 192.168.10.23:86;}
(3)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
docker logs -f test-06
---------------------------consul 多节点------------------------------
//添加一台已有docker环境的服务器192.168.10.14/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.14 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.10.23 &> /var/log/consul.log &-------------------------------------------------------------------------enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.10.23:8301 alive server 0.9.2 2 dc1
consul-server02 192.168.10.14:8301 alive server 0.9.2 2 dc1consul operator raft list-peers
Node ID Address State Voter RaftProtocol
Node ID Address State Voter RaftProtocol
consul-server01 192.168.10.23:8300 192.168.10.23:8300 leader true 2
consul-server02 192.168.10.14:8300 192.168.10.13:8300 follower true 2
相关文章:
【consul】
consul 一、什么是服务注册与发现1.11.2 二、 什么是consul2.1定义2.2特性2.2.1服务注册与发现:2.2.2健康检查:2.2.3Key/Value存储: 三、consul部署-datacenter :指定数据中心名称,默认是dc1。consul :指定…...
Electron环境搭建
Electron是一个优秀的开源框架,用于构建跨平台的桌面应用程序。它基于Chromium和Node.js,使得开发者可以使用Web技术(HTML、CSS和JavaScript)来构建可在Windows、macOS和Linux等多个操作系统上运行的应用程序。本文将介绍如何搭建…...
MinIO线上扩容实战
硬件投入肯定是随着业务的增长而增长,这就要求中间件平台必须提供水平伸缩机制,MinIO对象存储服务也不例外,本文就详细介绍MinIO的扩容。 Minio支持通过增加新的Server Pool来扩容老的集群。每个Server Pool都是一个相对独立的故障域&#x…...
【微服务】微服务的概论
微服务:构建面向为了解决这个问题,微服务架构应运而生。本文将向您介绍微服务的概念、优势、实现原理以及应用场景,带您领略微服务在构建面向未来的高效应用中的魅力。 一、微服务的概念和优势 微服务是一种将应用拆分为一系列小型、独立服…...
基于Jenkins自动打包并部署docker环境
目录 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 实验环境 操作系统 IP地址 主机名 角色 CentOS7.5 192.168.200.111 git git服务器 CentOS7.5 192.168.200.112 Jenkins git客户端 jenkins服务器 CentOS7.5 192.168…...
jvm 运行时数据区
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁 1.1程序计数器 程序计数器也叫pc寄存器 可以看作是当前线程…...
Jobs Portal求职招聘系统源码v3.5版本
Jobs Portal求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。 它将提供各种公司在网站上放置他们的职位空缺资料,并且还可以选择搜索候选人简历。 除此之外,还有一个管理模块供…...
Android kotlin系列讲解(入门篇)使用Intent在Activity之间穿梭
<<返回总目录 上一篇:Android kotlin系列讲解(入门篇)Activity的理解与基本用法 文章目录 1、使用显式Intent2、使用隐式Intent3、更多隐式Intent的用法4、向下一个Activity传递数据5、返回数据给上一个Activity1、使用显式Intent 你应该已经对创建Activity的流程比较…...
音频编码类型及对应的封装文件
音频编码类型及对应的封装文件 如下表格 编码类型解释文件封装audio/mp4a-latmMPEG-4 Audio Advanced Audio Coding (AAC) Low-Overhead Audio Transport Multiplex (LATM) 压缩的音频格式mp4audio/3gpp3rd Generation Partnership Project (3GPP) 定义的音频编码格式3GPaudi…...
初探科研 | 第一次科研经历
1 . 自己的experiences 自己大二下学期中比较幸运加入到科研组里,做的方向是3D人体姿态估计,不过由于是一个全新领域,基本也是自己这个小白探索,所以成果甚微。在八月初由于各种原因退出了组,但是在这期间收获还是蛮多…...
Wireshark数据抓包分析之HTTP协议
一、实验目的: 主要时熟悉wireshark的使用 二、预备知识: HTTP协议的相关知识 what fk,原来只要在右页点击切换,就可以开启2台不同的机器欸!nice 三、实验过程: 1.在机器1中通过管理员身份运行hfs之后&a…...
研发管理工具大揭秘!6款利器助你高效研发
"研发管理工具有哪些?6款研发管理利器分析Zoho Projects、Trello、Asana、Monday.com、Smartsheet、Jira。" 在如今的科技发展日新月异的时代,研发管理工具的重要性日益凸显。研发管理工具有助于提高研发效率,降低成本,…...
云知识入门-什么是虚拟机、磁盘、镜像和快照
一、虚拟机 1、什么是虚拟机 虚拟机(VM)是一种创建于物理硬件系统(位于外部或内部)、充当虚拟计算机系统的虚拟环境,它模拟出了自己的整套硬件,包括 CPU、内存、网络接口和存储器。通过名为虚拟机监控程序…...
C/C++编译整理
1. 编译器 查看编译情况 gcc main.c -o main -v # -v查看编译详情 g main.c -o main -v # -v查看编译详情添加预处理头文件 在PATH中找到可执行文件程序的路径 export PATH $PATH:$HOME/bin gcc找到头文件的路径 C_INCLUDE_PATH/usr/include/libxml2:/MyLib export C_I…...
数据结构——栈和队列
栈和队列的建立 前言一、栈1.栈的概念2.栈的实现3.代码示例(1)Stack.h(2)Stack.c(3)Test.c(4)运行结果(5)完整代码演示 二、队列1.队列的概念2.队列的实现3.代…...
苍穹外卖阿里云oss存储笔记
阿里云oss 阿里云对象存储oss(Object Storage Service),是一款海量,安全,低成本,高可靠得云存储服务,使用oss,您可以通过网络随时存储和调用包括文本,图片,视…...
Kafka 集群搭建过程
前言 跟着尚硅谷海哥文档搭建的Kafka集群环境,在此记录一下,侵删 注意:博主在服务器上搭建环境的时候使用的是一个服务器,所以这篇博客可能会出现一些xsync分发到其他服务器时候的错误,如果你在搭建的过程中出现了错…...
【算法随记】在计算过程中模的情况
https://leetcode.cn/problems/power-of-heroes/ 计算过程中,可以放心模的情况: 加减乘 先模再加再模和直接加再模一样 a m o d m b m o d m ≡ a b ( m o d m ) a\mod mb\mod m ≡ ab \ (\mod m) amodmbmodm≡ab (modm) 先模再减再模和直接减再模…...
MSTP多生成树协议(第二课)
MSTP负载均衡 实验 需求 1)PC1属于 vlan 10 ,IP地址为 192.168.10.1/24, 网关为 192.168.10.2542)PC2属于 vlan 20 ,IP地址为 192.168.20.1/24, 网关为 192.168.20.254**3)确保PC1与PC2互通4…...
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
1.数组指针概念和应用 首先数组指针应该是一个数组,它的定义如下: 数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。 数…...
Linux存储学习笔记
相关文章 Linux 存储系列|请描述一下文件的 io 栈? - tcpisopen的文章 - 知乎 https://zhuanlan.zhihu.com/p/478443978 深入学习 Linux 操作系统的存储 IO 堆栈 - KaiwuDB的文章 - 知乎 https://zhuanlan.zhihu.com/p/636720297 linux存储栈概览 - st…...
ubuntu执行jmeter端口不够用报错(Address not available)
ubuntu执行jmeter端口不够用报错(Address not available) 解决方案 // 增加本地端口范围 echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range// 启用快速回收TIME_WAIT套接字 sudo sysctl -w net.ipv4.tcp_tw_recycle 1// 启用套接字的重用 sudo sysctl -w net.ipv4…...
MongoDB:简单的增删改查操作
一.概述 本篇文章介绍在Navicat中对MongoDB数据库进行增删改查操作,在后面会介绍在Spring Boot中使用MongoTemplate对MongoDB数据库进行相关操作.如有必要可以先看看前面几篇文章. MongoDB:MySQL,Redis,ES,MongoDB的应用场景 MongoDB:数据库初步应用 二.在Navicat进行增删改…...
网络编程(域套接字)
一、域套接字的概念 1.只能做一台主机内的进程间通信,协议族(地址族)指定为:AF_UNIX AF_LOCAL 2.bsp-lcd: s类型文件,就是域套接字 3.如果客户端不手动绑定,则操作系统不会创建一个套接字文件…...
探索短视频小程序/小年糕
短视频小程序的兴起,为创作者提供了一个全新的平台,让他们能够以更专业的方式展现自己的作品。这种创作形式不仅要求作品内容足够精彩还需要有深度的思考和逻辑性的呈现。本文将探索短视频小程序的专业与深度的创作之道,帮助创作者更好地发挥…...
基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍
不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…...
ARM开发(cortex-A7核中断实验)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反; key1 ----> LED3灯状态取反; key2 ----> LED2灯状态取反; key3 ----> LED1灯状态取反; 2.分析框图: …...
关于融合项目点云pointpillars检测不显示三维检测框问题的解决
这个问题主要还是launch文件中出现了一些偏差。 launch文件的第26行 这里原先是0.6,在检测kitti的时候是0.6,由于kitti是64线激光雷达,我个人用的是16线激光雷达,所以把0.6降到了0.2.出现了三维检测框,问题解决...
spring复习:(57)PropertyOverrideConfigurer用法及工作原理
一、属性配置文件 dataSource.urljdbc:mysql://xxx.xxx.xxx.xxx/test dataSource.usernameroot dataSource.passwordxxxxxx dataSource.driverClassNamecom.mysql.jdbc.Driver #dataSource.typecom.alibaba.druid.pool.DruidDataSource二、spring配置文件 <?xml version&…...
在axios中获取文件上传进度
1.在axios 全局配置的文件中加入一个postFile 方法在上传文件时调用。 export function postFile(url, params,config) {return new Promise((resolve, reject) > {axios.post(url, params,config).then(res > {resolve(res);}).catch(err > {reject(err);})}) } 2.…...
网页网站导读怎么做/免费发布推广信息的平台有哪些
有些资料讲如果要支持目录必须使用iiswriter,或者其他软件,其实通过简单对iis配置,再利用urlwriter就可以完美解决url重写的问题可以将http://abc.domain.com/blog转向到http://www.domain.com/xxx.aspx?usernameabc当然首先要将主机的泛域名支持打开。…...
复制别人网站做第一站/游戏代理是怎么赚钱的如何代理游戏
题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的。 首先求环上最大字段和,而且不能是含有全部元素。本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄。实际可以求出最小值,总和-最小,就可以求出&…...
pc网站建设的三大条件/营销型网站建设题库
【题目链接】:http://hihocoder.com/problemset/problem/1295 【题意】 【题解】 可以在O(N)的复杂度内求出1..N里面的所有素数; 当然受空间限制,N可能也就是几百万的样子吧; 再低一点的话用朴素的筛法都能过了; 它的思路主要是; 抓住每个合数的最小的质因数…...
asp.net做网站后台/公司宣传软文
Boris FX Continuum Complete 2020又简称BCC插件2020,是为Adobe软件和OFX而开发的视频特效插件,该插件能够为用户提供了丰富的特效,类型多样,拥有图像恢复,拉伸文本,处理标题和3D对象,色调调节&…...
新手如何自己建网站/运营网站是什么意思
点击标题下「中国云报」可快速关注 你知道吗,华为在关键业务计算领域曾经走过一段“弯路”。当年,华为也承担了国家重大科研项目,按照小型机的思路研发关键业务服务器。在样机已经成型的情况下,考虑到小型机被开放架构x86替代的趋…...
高级经济师/seo推广知识
Daniel2cscanf我不知道为什么,当我运行它时,它会跳过"书中有多少页" scanf并直接进入第二个循环"谁是作者".我确定这与空白有关,但我认为我用getcharfor循环的底部来解释这个问题.标题:struct bookInfo{char title[40];char author[25];float price;int pa…...