传统架构会被云取代?其实没那么厉害!

如今,新兴的互联网行业对“云”很熟悉,传统企业们对“云”也并不陌生。

从进取到保守,云的扩散,让*初的互联网行业大踏步走在前方,而如今传统行业用户已然开启了奋起直追的模式!

企业们不再“等等看、试一试”,而是选择“有条件要上云、没条件创造条件也要上云”,随之而来的就是有关开放云架构运维的“一堆事儿”,有的倍感惊喜,有的则捶胸顿足……

其实在追云的道路上,我们不妨停下来思考一下,对于云,我们真的按需取舍、高效分配了吗?

 

 

“传统架构的优势就是稳定性较好,运算能力很强,但弱势也很明显,成本高且处理并发的能力比较不尽如人意,需要配置很多接入口,十分不方便!

采访中,尽管传统架构在过去风靡许久,就连在传统架构领域拥有成熟的解决方案和丰富的运维经验的中亦科技,总裁田传科也不得不承认这一点。
————————————————
%title插图%num

其实随着互联网发展,同时连入服务器的访问量骤然增加,如此变化恰恰暴露了传统架构的短板,然后众望所归的云架构出现了,再多的请求都能从容应对,例如我们熟悉并经常使用的12306网站。

 

 

起初12306网站利用传统架构,响应缓慢、系统经常崩溃,像春运这种典型的峰值情况对于传统架构来说确实“力不从心”,怎么办?

 

 

将“查询”功能放在云架构上?

其实这项业务功能并不要求数据上有很高的一致性, 通俗点儿来说就是在一定程度上允许“延迟”,这样分配不但有效解决了高并发难处理的问题,还保证了业务的正常运行!

云架构好用,能够弥补传统架构的劣势,所以在很长一段时间内,“传统架构太落后、云架构必会取而代之”的言论尘嚣之上。

对此,田传科表示,云是随着虚拟化、负载均衡、分布式系统等技术的成熟而出现的。以公有云举例来说,节约资源、成本低,标准化程度高都是其显著特征。

但看似“无所不能”的云架构,真的就没有不足吗?很显然,云架构所带来的的数据一致性、安全稳定性等问题目前还没有得到很好的解决。

如果将云架构与传统架构做个形象的比喻,田传科表示,它们可以被通俗理解为青年公寓和别墅的关系。

青年公寓具有良好的性价比,但无法应对特殊“客户”的个性化需要。

例如很多金融企业,由于其特殊的业务复杂性、连续性以及对安全的高标准性,很难要求这类企业将自己的全部核心业务迁移到云上,尤其是公有云上。

“但云架构的确有其优势,确实可以选择将一部分峰值性、通道性强的业务进行迁移!”田传科补充道。

所以,未来的“新云态”,是传统架构和云架构共存的。

随着企业这种双态架构越来越复杂,运维服务商肩负的责任也就越来越大了!

田传科说,应对“新云态”就要做好“智运维”。对此,中亦科技很早就布局了自动化运维,以应对未来日益复杂的IT基础架构,并且发布了EVO自动化运维管理平台。

田传科表示,基于十余年的运维经验积累,中亦科技发现,自动化运维并非要实现全部环节的自动化。

在传统数据中心中,整个运维工作中的30%-40%是不需要人工的,例如自动部署。

运维中什么部分可以选择自动化呢?

选择自动化主要还是解决人工成本过高以及效率太低的问题。

但并不是所有运维都可以用自动化解决,自动化解决的是标准化、流程化的问题,但不可否认,另外的60%-70%仍然需要人工介入。

田传科强调,单纯的云架构和传统架构的运维方式是不同的,因为有标准化和非标准化的差别。所以新云态下,客户一定需要的是在云架构和传统架构中都非常专业的服务商,来帮助他们做好基础架构的运维。

对于IT基础架构的自主可控,田传科也表达了自己的看法。自主可控的*步应该首先是在服务上减少对国外厂商的依赖,在更换存量设备条件还不成熟的时候,国内的IT基础架构服务商有责任通过服务自主可控,为国产厂商的发展成熟争取时间。并且,像中亦科技这种IT基础架构全生命周期全架构覆盖能力的服务商已经完全有能力代替国外厂商的运维服务。
————————————————

原文链接:https://blog.csdn.net/sch881226/article/details/80776035

Python基础知识点及运用方法

Python基础知识点及运用方法
一、变量
变量:’装’程序中的数据

变量名—- 标识符: 是独一无二的

​ 1.标识符可以由字母、数字、下划线(_)组成,其中数字不能打头

​ 2.标识符不能是Python关键字,但可以包含关键字

​ 3.标识符不能包含空格

赋值:将数据放入变量的过程

name = 1 # name 就是变量名又称标识符,1 是变量名的赋值
print(name)

二、运算
运算中的类型
1. + —- 加法运算
a = 1
b = 2
c = a+b
print(c)

2. — —- 减法运算
a = 3
b = 2
c = a-b
print(c)

3. * —- 乘法运算
a = 3
b = 2
c = a*b
print(c)

4. / —- 除法运算
a = 4
b = 2
c = a/b
print(c)

5. % —- 取余运算
a = 4
b = 3
c = a%b
print(c)
1 # 这里为什么会是 1 呢,因为3不能被整除,还有余数1

a = 4
b = 2
c = a%b
print(c)
0 # 能被整除时,余数就是0呢

6. ** —- 幂运算(平方)
a = 2
b = 2
c = a**b
print(c)
4 # 2平方 2*2=4

a = 2
b = 4
c = a**b
print(c)
16 # 2的4次方 2*2*2*2=16

7. // —- 整除运算 向下取整
a = 3
b = 2
c1 = a/b
c2 = a//b
print(c1)
1.5 # 不能被整除时,会有小数点
print(c2)
1 # 但在整除运算时,会把小数点去掉,只要整数

8. == —- 判断
a = 1
b = 1
print(a == b)
True # True 布尔值 判断 a 是否等于 b 是返回 True

a = 1
b = 2
print(a == b)
False # False 布尔值 判断 a 是否等于 b 不是返回 False

9. round() —- 取整 四舍五入
a = 7
b = 5
c = a/b
print(round(c))
1 # 7/5 = 1.4 不能被整除,舍掉小数0.4 向下取整

a = 7
b = 4
c = a/b
print(round(c))
2 # 7/4 = 1.75 不能被整除,大于0.5 向上取整

a = 1
b = 2
d = 10
c = a/b
e = a/d
print(round(c))
0
print(round(e))
0 # 当分子为1时 不会四舍五入取整,会直接取值为0

10. math —- 函数模块
import math

a = 6.6
b = math.ceil(a)
c = math.floor(a)
print(‘向上取整为’, b)
向上取整为 7 #向上取整数为 7
print(‘向下取整为’, c)
向上取整为 6 #向下取整数为 6
#这里不管小数点后面的大小

网上查找到的一些math函数模块运用方法
d = 3
e = math.sqrt(d)
print(‘平方根的值为’, e)
1.7320508075688772

f = math.exp(d)
print(‘e的N次幂的值为’, f)
20.085536923187668

g = 625
h = 5
i = math.log(g,h)
print(‘对数计算的值为’, i)
4.0

11. decimal —- 模块 精度计算
import decimal # 数值需要传入字符串中,未放入字符串的会同下方一样
a = decimal.Decimal(‘2.2’)
b = decimal.Decimal(‘2.0’)
c = a-b
print(decimal.Decimal(c))
0.2

import decimal #只是用decimal模块来计算时,会精确到小数点后50位数
a = 2.2
b = 2.0
c= a-b
print(decimal.Decimal(c))
0.20000000000000017763568394002504646778106689453125

三、数值类型
1. int —- 整数
1, 2, 3, 4, 5 # 整数类型
1
2. float —- 浮点数
0.5, 1.1, 3.6, 7.7 # 浮点数类型
1
3. bool —- 布尔值
bool: Ture(1) False(0) # 在布尔值中只有两种方式,所对应的就是1和0
1
4. complex —- 复数
complex(1+2j) # 前面的1是实部,后面的2j是虚部,加起来就是一个复数
1
5. type —- 查看数据类型 注:重点 重点 重点 一个常用的类型
print(type(1))
<class ‘int’> # 1 是一个整数类型

print(type(2.5))
<class ‘float’> # 2.5 是一个浮点数类型

print(type(Ture))
<class ‘bool’> # Ture 是一个布尔值类型

print(type(‘1’))
<class ‘srt’> # 1 在这里是一个字符串类型

四、数据类型
1. srt —- 字符串
‘’ —- 单引号
“” —- 双引号
“””””” —- 三引号 在没有变量命名时可作为注释使用
字符串的基本方法: 增 删 改 查
⑴. 增
字符串拼接: + 拼接符
a = ‘风陨’
b = ‘老师’
c = ‘很帅’
d = a + b +c
print(d)
风陨老师很帅 #输出结果

⑵. 删
replace 替换 使用方法 重点 重点 重点
A = ‘adfhkmaehfd’
B = ‘adfhkmaehfdadfhkmaehfd’
print(A.replace(‘d’, ”))
print(B.replace(‘d’, ”))
afhkmaehf
afhkmaehfafhkmaehf #*参数’d’为赋值里待删除参数,第二参数”里无任何对像时在原有的赋值里删除所有待删参数

print(A.replace(‘d’, ‘ ‘))
print(B.replace(‘d’, ‘ ‘))
a fhkmaehf
a fhkmaehf a fhkmaehf # 第二个参数为空格时,赋值里待删除参数替换为空格

print(A.replace(‘d’, ‘帅’, 1))
print(A.replace(‘d’, ‘帅’, 2))
print(B.replace(‘d’, ‘帅’, 1))
print(B.replace(‘d’, ‘帅’, 3))
a帅fhkmaehfd
a帅fhkmaehf帅
a帅fhkmaehfdadfhkmaehfd
a帅fhkmaehf帅a帅fhkmaehfd # 第三个参数为,赋值里待删除替换参数的替换次数

⑶. 改
upper —- 改大写 针对的是字母
a = ‘ddhf’
b = ‘1235’
c = ‘小星星’
print(a.upper())
print(b.upper())
print(c.upper())
DDHF #输出结果:全部改成了大写字母
1235 #输出结果:当是数字时无任何变化
小星星 #输出结果:当是文字时无任何变化

lower —- 改小写 针对的是字母
a = ‘FdHk’
print(a.lower())
fdhk #输出结果:全部改成了小写字母

capitalize —- 首字母大写
a = ‘year’
b = ‘new year’
print(a.capitalize())
print(b.capitalize())
Year
New year #输出结果:首字母改成了大写,第二个单词仍然是小写字母

title —- 每个单词首字母大写
a = ‘year’
b = ‘new year’
print(a.title())
print(b.title())
Year
New Year #输出结果:每个首字母单词改成了大写

split —- 切割
a = ‘new year’
print(a.split(‘e’))
[‘n’, ‘w y’, ‘ar’] #输出结果:显示待切割参数删除,余下切割分离留下的参数

strip —- 去空格
b = ‘ new year ‘
print(b.strip())
print(b.lstrip())
print(b.rstrip())
new year #去掉开头和结尾空格
new year #去掉左边空格
new year #去掉右边空格 因空格无法完全显示出来,自己可以去验证下空格的位置

⑷. 查
索引切片:
下标:位置从*个开始 编号从0开始 特性:左闭右开

先切片,给下标,索引位置

​ a = ‘1 2 3 4 5 6 7 8 9 0 a b c d’

下标编号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13……以此类推

count —- 查次数 重点 重点 重点
a = ‘hhgauehjdiosdhieh’
print(a.count(‘h’))
5 #输出结果:显示待查参数’h’出现5次

a = ‘hhgauehjdiosdhieh’
print(a.count(‘h’, 4, 14))
2 #输出结果:
#*参数待查’h’出现2次,
#第二参数’4’为待查参数下标位置第4位参数’u’开始
#第三参数’14’为待查参数下标位置第14位参数’i’结束

index —- 查下标 左边开始查,查到*个就结束 ,如果找不到就报错 重点 重点 重点
a = ‘gauehjdhhiosdhieh’
print(a.index(‘h’))
4 #输出结果:当参数待查’h’下标位置在赋值中的第4个位置,

a = ‘hhgauehjdiosdhieh’
print(a.index(‘h’, 5, 14))
6 #输出结果:
#*参数为待查参数’h’
#第二参数’5’为待查参数在赋值中下标位置第5位开始
#第三参数’14’为待查参数在赋值中下标位置第14位结束

a = ‘gauejdiosdie’
print(a.index(‘h’))
Traceback (most recent call last):
File “D:/Python/Python_notebook/课堂笔记/学习Python第二课3.26.py”, line 110, in <module>
print(a.index(‘h’))
ValueError: substring not found
#输出结果:当参数待查’h’不在赋值中时就会报错

find —- 查下标 左边开始查,查到*个就结束 ,如果找不到不报错
a = ‘gauejdhiosdhieh’
print(a.find(‘h’))
6 #输出结果:当参数待查’h’下标位置在赋值中的第6个位置,

print(a.find(‘h’, 3, 13))
6 #输出结果:当参数待查’h’下标位置在赋值中的第6个位置,
#*参数为待查参数’h’
#第二参数’3’为待查参数在赋值中下标位置第3位开始
#第三参数’13’为待查参数在赋值中下标位置第13位结束

print(a.find(‘z’))
-1 #输出结果:当参数待查’z’在赋值中没有时,不会报错,但会显示-1结果,这个根计算机系统有关
#在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
#在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
#long(长整型)  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
#注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。(网络查找资料,有待查证,如有问题,请告知,谢谢!)

isdigit —- 判断是否为纯数字
a = ‘1256’
b = ’12ssd’
print(a.isdigit())
True #输出结果:a变量中的赋值是纯数字
print(b.isdigit())
False #输出结果:b变量中的赋值不是纯数字

isalpha —- 判断是否为纯字符
a = ‘1256’
b = ’11ssd’
c = ‘星星*棒’
print(a.isalpha())
False #输出结果:a变量中的赋值不是纯字符
print(b.isalpha())
False #输出结果:b变量中的赋值不是纯字符
print(c.isalpha())
True #输出结果:c变量中的赋值是纯字符

starwith —- 判断开始
a = ’23kjidheyghg’
b = ‘kjidh23eyghg’
print(a.startswith(’23’))
True #输出结果:判断a变量中的赋值’23’是开始的
print(b.startswith(’23’))
False #输出结果:判断b变量中的赋值’23’不是开始的

endswith —- 判断结束
a = ’23kjidheyghg’
b = ‘kjidh23eyggh’
print(a.endswith(‘g’))
True #输出结果:判断a变量中的赋值’g’是结束的
print(b.endswith(‘g’))
False #输出结果:判断b变量中的赋值’g’不是结束的

islower —- 判断全为小写
a = ‘ddhf’
b = ‘AsfD’
c = ‘ASDFH’
print(a.islower())
True #输出结果:判断a变量中的赋值是全部为小写
print(b.islower())
False #输出结果:判断a变量中的赋值不是全部为小写
print(c.islower())
False #输出结果:判断a变量中的赋值不是全部为小写

isupper —- 判断全为大写
a = ‘ddhf’
b = ‘AsfD’
c = ‘ASDFH’
print(a.isupper())
False #输出结果:判断a变量中的赋值不是全部为大写
print(b.isupper())
False #输出结果:判断a变量中的赋值不是全部为大写
print(c.isupper())
True #输出结果:判断a变量中的赋值是全部为大写

《小白初识python之第二章基础语法》

《小白初识python之第二章基础语法》

 

 

一、数据类型
1、标准数据类型
Python3 中有六个标准的数据类型:

Number(数字)
String(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
Python3 的六个标准数据类型中:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)
2、Number(数字)
Python3 支持 int、float、bool、complex(复数)

在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。

像大多数语言一样,数值类型的赋值和计算都是很直观的。

内置的 type() 函数可以用来查询变量所指的对象类型。

>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class ‘int’> <class ‘float’> <class ‘bool’> <class ‘complex’>
二、运算符
1、算术运算符
a:  +、-、*、/

b:  // 取整

c:  % 取余

d: ** 幂运算

>>> 5 + 4 # 加法
9
>>> 4.3 – 2 # 减法
2.3
>>> 3 * 7 # 乘法
21
>>> 2 / 4 # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余
2
>>> 2 ** 5 # 乘方
32
2、赋值运算符
简单的赋值运算符: =

加法赋值运算符: +=

减法赋值运算符: -=

乘法赋值运算符: *=

除法赋值运算符: /=

取模赋值运算符:%=

幂赋值运算符: **=

取整除赋值运算符://=

#!/usr/bin/python3

a = 21
b = 10
c = 0

c = a + b
print (“1 、 c 的值为:”, c)

c += a #等价于c = c+a
print (“2 、 c 的值为:”, c)

c *= a #等价于c = c*a
print (“3 、 c 的值为:”, c)

c /= a #等价于c = c/a
print (“4 、 c 的值为:”, c)

c = 2
c %= a #等价于c = c%a
print (“5 、 c 的值为:”, c)

c **= a #等价于 c = c**a
print (“6 、 c 的值为:”, c)

c //= a #等价于c = c//a
print (“7 、c 的值为:”, c)
3、比较运算符
以下假设变量x为10,变量y为20:

大于号: >      返回x是否大于y

小于号:<       返回x是否小于y

大于等于:>=   返回x是否大于等于y

小于等于:<=   返回x是否小于等于y

不等于:  !=  比较两个对象是否不相等

等于:==     比较对象是否相等

注意:一个等号是赋值 ,两个等号是等于(比较两个数是否相等);!= 是不等于

x = 10
y = 20
print(x>y)#返回x是否大于y
print(x<y)#返回x是否小于y
print(x>=y)#返回x是否大于等于y
print(x<=y)#返回x是否小于等于y
print(x!=y)#比较两个对象是否不相等
print(x==y)  #比较对象是否相等
4、逻辑运算符
与: and   (and进行条件判断时,需要条件都成立才返回True,只要有一个不成立就返回False)

或:or       (or:进行条件判断时只要有任何一个条件满足就返回True,都不成立才返回False)

非:  !     (!:进行取反,不满足条件时才返回TRUE)

a = 10
b = 20
print(a==10 and b==10) #返回false
print(a==10 and b==20) #返回true

print(a==10 or b==10) #返回true
print(a==20 or b==10) #返回false

print(a!=20) #返回true
print(a!=10) #返回false
三、字符串
1、字符串定义
Python中的字符串用单引号 ‘ 或双引号 ” 括起来,”””也可以。

2、字符串操作
字符串访问
a、通过索引访问,索引从0开始,空格也占一个索引位置

索引值以 0 为开始值,-1 为从末尾的开始位置。%title插图%num

 

字符串切片
a、遵循左闭右开的原则(取左边下标的值,不取右边下标的值)

b、步长  str[起始索引:结束索引:步长]

str[0:5:2]    表示步长为2,每隔两个进行取值

注意:1、str[::-1]步长为负数表示倒叙

2、起始索引的*对值要小于结束索引的*对值,要不会取不到值

c、字符串的截取的语法格式如下(步长默认为1,可以省略不写):

变量[头下标:尾下标]
d、倒序切片

str1[起始索引:结束索引:步长]

步长: 正数:表示正序切片,负数:倒序切片

正序、倒序 本质是一样的,只是切片的方向不一样,起始索引不一样 ,

切片正序还是倒序只跟步长正负有关系 正序切 用正数 ,倒序切 就用负数 ;

不管是正序切片,还是倒序切片,都有两种写法

1:索引从0开始正序取值;2:索引从-1开始倒序取值

原则:你需要的取值保证在这个范围内

倒序切片起始索引是-1

注意: 正序:索引取值从0开始

倒序:索引取值从-1开始

字符串运算
1、字符串的拼接是用 + 连接起来的

2、重复输出用 *

#!/usr/bin/python3

str = ‘python’

print (str) # 输出字符串
print (str[0:-1]) # 输出*个到倒数第二个的所有字符
print (str[0]) # 输出字符串*个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
print (str[2:]) # 输出从第三个开始的后的所有字符
print (str * 2) # 输出字符串两次,也可以写成 print (2 * str)
print (str + “TEST”) # 连接字符串
3、字符串转义字符
1、 \n    换行

2、 \  转义字符

3、 r   不进行转义

4、 \\  反斜杠符号

print(“python\hello”)
print(“python\nhello”)
print(r’python\nhello’)
print(‘python\\hello’)
print(r’python\\hello’)
转义字符 描述 实例
\(在行尾时) 续行符
>>> print(“line1 \
… line2 \
… line3”)
line1 line2 line3
>>>
\\ 反斜杠符号
>>> print(“\\”)
\
\’ 单引号
>>> print(‘\”)

\” 双引号
>>> print(“\””)

\a 响铃
>>> print(“\a”)
执行后电脑有响声。
\b 退格(Backspace)
>>> print(“Hello \b World!”)
Hello World!
\000 空
>>> print(“\000”)
>>>
\n 换行
>>> print(“\n”)
>>>
\v 纵向制表符
>>> print(“Hello \v World!”)
Hello
World!
>>>
\t 横向制表符
>>> print(“Hello \t World!”)
Hello      World!
>>>
\r 回车,将 \r 后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将 \r 后面的内容完全替换完成。
>>> print(“Hello\rWorld!”)
World!
>>> print(‘google runoob taobao\r123456’)
123456 runoob taobao
\f 换页
>>> print(“Hello \f World!”)
Hello
World!
>>>
\yyy 八进制数,y 代表 0~7 的字符,例如:\012 代表换行。
>>> print(“\110\145\154\154\157\40\127\157\162\154\144\41”)
Hello World!
\xyy 十六进制数,以 \x 开头,y 代表的字符,例如:\x0a 代表换行
>>> print(“\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21”)

 

如何给已有的服务器代码添加单元测试?

大佬们,小弟*近接手了公司的服务器代码( C++),比较尴尬的是之前没做过服务器开发,只做客户端开发。还有之前也从来没写过单元测试。由于以前的服务器代码写的比较凌乱飘逸,所以我准备大改一下,由于没有单元测试加上对服务器代码逻辑没有完全掌握,所以一点改动都会造成很多 bug。

所以想请教大佬们,如果给已经写好的,不算太小的项目添加单元测试?如何测试像 timer,异步操作这样的情景? 非常感谢!

arrow8899 2019-08-08 15:25:39 +08:00
重构一时爽,改 BUG 改到火葬场:doge:
c0011 2
c0011 2019-08-08 18:01:38 +08:00
@arrow8899 哈哈哈
des 3
des 2019-08-08 18:50:37 +08:00 via Android
劝你别改
kaedea 4
kaedea 2019-08-08 18:51:55 +08:00 via Android
几乎没办法,单元测试是一个研发流程,而不是测试流程
comwrg 5
comwrg 2019-08-08 19:13:29 +08:00 via Android
大家都说这是屎山 你应该知道咋办了吧
c0011 6
c0011 2019-08-08 21:56:00 +08:00
@des 就我一个人,不改的话自己以后还是难受。
c0011 7
c0011 2019-08-08 21:56:22 +08:00
@comwrg 要怎么办嘛
MiffyLiye 8
MiffyLiye 2019-08-08 22:24:00 +08:00
学习一下 Re-Engineering Legacy Software
https://book.douban.com/subject/26382368/
c0011 9
c0011 2019-08-08 22:45:08 +08:00
@MiffyLiye 也不算遗留代码,一直线上运行,就是代码写的很随意。耦合度超级高。然后就是代码量不算太多,不过业务逻辑超级复杂,

对于搭建小型 OpenStack 平台,如何采购服务器

目前学院有 10 万美元用于采购服务器,计划搭建 OpenStack 平台供学院的师生科研和实验使用。因为本人对专业服务器不太了解,所以向各位咨询一下服务器配置的选择以及架构的可行性。

架构方面,目前计划一台服务器作为控制服务器用于一系列基础服务(Keystore, Horizon, Glance,有可能再加上 Heat),一台或者两台分别用于块存储和对象存储 (Cinder, Swift,如果一台服务器不可以同时安装这两个服务的话就上两台),一台用于网络服务 (Neutron),若干台用于计算服务 (Nova)。目标用户大概包括 10~20 个老师和 100 以内的学生。每个用户单个 instance 的配置并不高,主要在于做实验的时候可能用到的 instance 数量较多。

针对上述架构的话,我认为网络服务器和计算服务器的瓶颈在于 CPU、内存和网络,存储服务器的瓶颈在于硬盘和网络。然后计划采购戴尔的 PowerEdge 系列的 Rack Server,不知道针对上述架构在配置的选择上大佬们有没有什么建议。当然如果有更好的选择的话,品牌也可以不限于戴尔。另外大家也可以分享一下自己搭建 OpenStack 平台的架构。谢谢大家的帮助!

感谢各位的回复。以下是*终和老师商议后暂定的方案,希望对其他人有所帮助:

pfSense Firewall Dell PowerEdge R740 Rack Server CPU: 2x Intel Xeon Gold 5217 3.0G 8C/16T RAM: 64G RDIMM 2933MT/s Hard drive: 2x 600GB 10K RPM SAS with RAID 1 Network: Intel X520 Dual Port 10GbE SFP+ & i350 Dual Port 1GbE BASE-T Price: $6600

OpenStack Controller (Keystone, Horizon, Glance, Swift, Cinder, Nova Server, etc) Dell PowerEdge R740 Rack Server CPU: 2x Intel Xeon Gold 5218 2.3G 16C/32T RAM: 128G RDIMM 2933MT/s Hard drive: 2x 600GB 10K RPM SAS with RAID 1 Network: Intel X520 Dual Port 10GbE SFP+ & i350 Dual Port 1GbE BASE-T Price: $7400

OpenStack Network (Neutron) 同pfSense Firewall

Distributed Storage Dell PowerEdge R740 Rack Server CPU: 2x Intel Xeon Silver 4216 2.1G 16C/32T RAM: 64G RDIMM 2933MT/s Hard drive: 2x 300GB 15K RPM SAS with RAID 1 & 8x 2.4T 10 RPM SAS with RAID 5 Network: Intel X520 Dual Port 10GbE SFP+ & i350 Dual Port 1GbE BASE-T Price: $12000

2x OpenStack Compute (Nova) Dell PowerEdge R840 Rack Server CPU: 4x Intel Xeon Gold 5218 2.3G 16C/32T RAM: 512G LRDIMM 2666MT/s Hard drive: 2x 600GB 10K RPM SAS with RAID 1 Network: Intel X520 Dual Port 10GbE SFP+ & i350 Dual Port 1GbE BASE-T Price: 2x $24000

$100k经费的话,这样选配下来还剩$20k左右,还可以再选购10Gbps的交换机等等。目前考虑到初期内部测试使用,暂不对外开放,就没有对Controller部分没有做HA。这套选配可能还存在着种种问题,欢迎大家的意见与建议。

uleh 2019-07-31 08:49:57 +08:00 ❤️ 1
一个 instance 按 4G ram + 50G hd 来算,120 个 Instance 就是 480G 内存 + 6T 硬盘
品牌选戴尔、联想都可以,配置用 2U + 128GRAM,买 6 台组成 2 控+4 算 的集群
一台 1 万多刀,一共估计在 8w 刀之内,剩下钱买硬盘、光纤卡、交换机
uleh 2
uleh 2019-07-31 08:51:10 +08:00 ❤️ 1
如果对数据可靠性有要求就不加硬盘,增一台存储服务器
swulling 3
swulling 2019-07-31 09:13:26 +08:00 via iPhone ❤️ 1
两个控制节点,其他计算节点。虽然集群小,也要*起码有个主从…

如果钱不多,控制节点也可以跑计算
swulling 4
swulling 2019-07-31 09:14:57 +08:00 via iPhone ❤️ 1
存储和计算混部
littlewey 5
littlewey 2019-07-31 09:20:09 +08:00 via iPhone ❤️ 1
可以试试用 airship 来部署
x7395759 6
x7395759 2019-07-31 09:29:24 +08:00 ❤️ 1
搭建 OpenStack 有太多坑了,我不是很喜欢这个方案哈哈哈哈哈

主从我觉得可以不用,一般来说内存是*缺的,CPU 可以超并且影响不大,网络也还好,专业交换机上了也没有瓶颈。
zrp1994 7
zrp1994 2019-07-31 09:31:17 +08:00
@uleh
@swulling
请问两控是指一个 Network Controller 另一个是其他 Controller services 么?还是两个同样的 controller 做 high availability ?
zrp1994 8
zrp1994 2019-07-31 09:34:00 +08:00
@x7395759 因为之前在现有服务器上搭过 OpenStack 并且 Research 与 OpenStack 相关所以选用了 OpenStack。正如你所说的,OpenStack 坑太多,而且如果不深入优化的话性能不是很好。请问除了 OpenStack 有没有其他的平台建议?
x7395759 9
x7395759 2019-07-31 09:40:44 +08:00 ❤️ 1
@zrp1994 之前我司也自建了 OpenStack,后来搭建了 k8s+docker。个人感觉后者利用率是高一些,不过和 OpenStack 还是有很大的区别,如果要私有云的话好像是没有别的方案了。

也许科研学习实验用途对性能要求没有那么高也无所谓,主要还是看用途。
swulling 10
swulling 2019-07-31 10:01:50 +08:00 via iPhone ❤️ 1
@zrp1994 做 HA,控制节点你这么小规模没啥资源需求的

uleh 2019-08-06 10:43:38 +08:00 ❤️ 1
@zrp1994 做 HA 就行了
如果主要需求是提供虚拟机给学生 /老师用,其实用 proxmox 或者 oVirt 搭建集群更方便。。
httplife 12
httplife 2019-08-08 13:59:25 +08:00 ❤️ 1
pfSense Firewall 这个应该可以省去, 加个好点的 Layer 7 Juniper / Cisco 交换机(就是需要额外学一下怎么用 Junos OS/Cisco)
Dell 本身 software raid 不怎样, 用硬件 RAID,SSD 代替 SAS .

如果愿意折腾, 建议用 SuperMicro, 可以搭配更好点配置. 省下的钱还可以买备件
p200635 13
p200635 2019-09-27 07:39:33 +08:00 via Android
虚拟化 上 dell 这个方向没错。 但是为什么要上 OpenStack 而不是 ovirt 我司就是全套 VMware 爽到*限
p200635 14
p200635 2019-09-27 07:44:13 +08:00 via Android
从构架分析 你需要超融合方案 成熟的商用有 VMware nitanix 其他的不推荐 计算和存储是要分离的 网络是要支持软件定义的 还需要自动化运维 或者是桌面云 基本上数下来的话 直接找开源的话 ovirt 或者 pve 是*好的 也可以直接上 nutanix 的一体机 也是便宜还带有成熟的解决方案

“出彩”可信云,京东云创新归来!

如今,火热的容器技术已然成为传统基于管理程序虚拟化的一种实力替代品。

业界普遍认为,容器与传统的虚拟机相比,在启动速度、体积、应用和生态等诸多方面确实表现不俗。

毕竟容器足够轻载而且可以提供增强的可移植性,高效应用在移动平台之间完全不用返工或者让应用程序的开发者再重新设计。

当然这种易用性也在相关数据中得到了印证。

有关数据显示,随着容器技术的普及,接近一半的企业受访者表示目前正在使用容器。

其中占比40%的企业只使用容器进行测试和开发,另外60%甚至会同时选择将其用于生产。

之所以选择容器,企业主要考量的还是其表现出来的高扩展性以及可以简化并加速测试的功能。

容器技术“不俗的表现”除了引起行业的高度关注外,同时也被当作可信云评估的重要技术方向而提上日程。

%title插图%num

据了解,可信云评估作为国内高度认可的云计算标准和评估方法,是衡量云服务技术能力和服务水平的重要标准,如果企业获得可信云大会*项,也意味着是对其服务能力及技术创新能力的高度认可。

而云计算行业后发者京东云在近日刚刚召开的可信云大会上斩获“容器虚拟化”技术创新*,备受业界关注。

%title插图%num

放眼如今巨头林立的云服务市场,京东云入局并不算早,但却可以被视作进步快速的云服务商之一。不但爆出战略投资EasyStack,将在云计算、分布式存储、容器三大开源技术领域进行合作的重头新闻,其针对容器服务的探索更是技术能力创新的*好展现。

总体来说,京东云容器服务基于其在容器方面的的技术积累,同时融合了容器与虚拟机的双重优势,高度整合了存储、网络、安全等整体服务。

提供的容器服务不但无需管理虚拟机或集群,还可以做到快速部署以及弹性扩展,在保证安全、易用、全面几个重要指标的基础上计费模式更加精细化,对降低成本助力巨大。

据悉,不久之前京东云刚刚推出了完全托管的Kubernetes集群服务,“高可用性”是其显著特征。

具体来说,在京东云上可以通过全自动的方式完成跨区域的节点部署以及管理,同时还支持不同地域的数据中心节点的均衡部署,且为自动部署。

更重要的一点,京东云的Kubernetes集群可同时支持Serverless模式和非Serverless模式。不用考虑节点自身的复杂性,像原生容器一样调动所有API,无论是在创建环节还是调度上都确保*大的灵活可用性。

在这样深厚的技术积累之下,面对企业普遍反映的调度效率带来的成本提升以及诸多管理与规划的问题,京东云容器服务采用在hypervisors上直接运行Docker镜像,充分融合Docker容器和虚拟化的优点,既简化了平台复杂度又提高了性能和可靠性。

其中的独立内核技术,以虚拟机的隔离性为基础,避免容器间共享内核的安全隐患,同时凭借SDN技术实现不同租户实现完全隔离。

此外,由于集成了京东云VPC,服务可以通过安全组、网络ACL设置更细粒度的网络访问权限、提供基础的DDoS防护功能,哪怕是在同一私有网络中实现容器实例与公有云计算、存储、网络等资源内网互通,也可以充分利用产品资源。

%title插图%num

由于京东云容器服务的技术特性,无论是微服务架构还是持续集成与部署都妥妥的适用。

具体来看,微服务架构将传统分布式服务继续拆分解耦,形成一些更小服务模块,服务模块之间独立部署升级,所以容器特性非常适用于微服务架构部署。

例如,每个容器中可以运行完全不同的镜像服务,容器启动后就会产生了一个独立的微服务主机节点,还可以直接将云平台提供的各种云服务与自定义的微服务整合成一个强大完整的服务集群。

此外,使用京东云容器服务,开发人员在提交新代码后,可立即开始构建、测试应用,测试通过后还可以随时将新版本镜像更新到线上并完成服务升级。

整个过程全自动化,*大程度地简化了运维成本,而且保证线上、线下环境完全一致。通过持续集成与持续交付提供的优秀的DevOps环境,*大提高软件发布效率,十分顺应行业内的敏捷开发要求。

京东云容器服务不但实现了基于虚拟化的底层强隔离,还同时保留了容器的轻量级特性,可谓是集高性能、便捷性、高可用性于一身。

此次可信云大会上,京东云不但凭借“容器虚拟化技术”获得可信云评估的高度认可,还通过“数据库技术”摘得了存储类的技术创新*。

据了解,京东云分布式关系型数据库DRDS将拆分解决单机数据库容量无法满足业务需求的问题,通过事件驱动的多路复用模型外加把压力,打散到多个RDS实例上,从而解决单机数据库性能无法满足业务需求的困难。

通过实时备份解决数据高可靠,让DRDS与RDS融合支持用户快速便捷搭建分布式数据库服务以及落地两地三中心方案,提升用户的开发效率以及降低运维成本。

%title插图%num

据悉,DRDS完全兼容MySQL的传输协议,用户可以快速便捷的从原生MySQL切换至DRDS服务,以*低的代价分钟级搭建一整套高性能高并发的分布式数据库解决方案,该服务尤其支撑了京东内部众多核心0级系统在618及双11的考验。

除了技术领域的创新成绩,依托自身“政务云解决方案”,京东云还助力宿迁市电子政务办公室荣获了“可信云十大用户*”,以京东云公有云以及自建私有云的混合云模式为基础而建成的市级政务云平台有效助力宿迁实现了“云端发展”。

有数据显示,此次获*的宿迁市政务云平台已完成迁移上云146个,上云率达95.4%。其中政务服务网、公积金系统、市政府门户网站群、居民信用积分平台等核心系统均稳定运行其上。

除了“宿迁政务云”典型项目之外,京东云目前已在多达15个城市进行了智能城市布局,通过“政务云”建设等形式为各地赋能。

%title插图%num

其中,京东云政务云以城市新经济合伙人的身份出发深耕本地服务市场,从城市需求入手,通过技术赋能将京东云计算、大数据、AI、物联网、移动互联网等技术能力整体输出。

如今京东云进入“申元庆时间”,势头猛烈。他表示:“此次京东云获得可信云大会的*项,表明了业界对京东云技术能力以及政务云解决方案的认可和肯定。一直以来,京东云致力为用户提供安全、稳定的云计算服务并在技术方面努力创新;同时也希望通过自身云计算的技术赋能,助力智能城市的发展。”

目前京东云已经拥有108个云计算产品和服务,能够提供IaaS、PaaS、SaaS全栈式云服务,未来还将继续夯实自身的技术能力,开启属于自己的“云加速计划”。
————————————————

原文链接:https://blog.csdn.net/sch881226/article/details/81703830

python

python

***python习题##***
问题
已知列表data中有若干字符串,要求编写程序,对data中的字符串进行过滤,只输出重复字符不超过一半的字符串。

提示:以下是本篇文章正文内容,下面案例可供参考

一、分析
键盘输入字符串后需要使用split()来进行分割操作
需要引入collections中的Counter来方便计数
通过for循环来对字符串计数
通过if语句找出每个字符串中字母重复*多的
字母重复*多的那个字母重复的个数与该字符串长度进行比较决定要不要输出该字符串
二、步骤
1.引入库中方法
代码如下(示例):

from collections import Counter #导入Counter
1
2.键盘输入数据
代码如下(示例):

print(“输入字符串”)
data=input() #手动输入
datalist=data.split(“,”) #分割字符串
data=datalist
print(data) #输出字符串列表

代码
from collections import Counter #导入Counter
print(“输入字符串”)
data=input() #手动输入
datalist=data.split(“,”) #分割字符串
#print(datalist)
data=datalist
#data=[‘Hello’,’World’,’python’,’aaabbb’,’cccdd’]
print(data) #输出字符串列表
for i in data: #for循环
a=Counter(i) #对列表中每一个字符串进行计数
#print(Counter(i))
maxlen=0
for j in a:
#print(key,a[j]) #输出的是字母和个数,例如 “all” 输出 a 1 l 2
if maxlen< a[j]:
maxlen= a[j] #得到字符串中字母重复*多的
#print(maxlen) #输出重复数量
if maxlen <= len(i)/2: #重复*多的字母的重复个数与该字符长度比较,没有超过一半则输出该字符串
print(i)

%title插图%num

不遵循 restful_api 设计,所有的 api 使用 POST 提交

GET ( SELECT ):从服务器取出资源(一项或多项)。
POST ( CREATE ):在服务器新建一个资源。
PUT ( UPDATE ):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH ( UPDATE ):在服务器更新资源(客户端提供改变的属性)。
DELETE ( DELETE ):从服务器删除资源。
把所有的 API 都设计为 POST 提交方式,你们是如何看待的。

ieiayaobb 2019-08-26 14:37:22 +08:00
当 GET 超过了 URL 限制,只能用 POST 替代
qq292382270 2
qq292382270 2019-08-26 14:43:29 +08:00
我觉得挺好的. 因为我的客户大部分只会 post .
mokeyjay 3
mokeyjay 2019-08-26 14:48:46 +08:00
没啥好看待的,有些人只知道获取资源用 GET,其他所有情况用 POST
至于用这种还是用 restful 看具体情况谁话语权大了
Cyron 4
Cyron 2019-08-26 14:50:37 +08:00
无所谓,文档写好就行了
wingoo 5
wingoo 2019-08-26 14:52:24 +08:00 ❤️ 1
restful 并不是标准, 不用就会出错
hnbcinfo 6
hnbcinfo 2019-08-26 14:53:20 +08:00
严格遵循 restful 我觉得不现实,也不一定就好。我一般就用 Get Post。读操作 get,写操作 post,当然也会偶尔有例外。只要文档写好,有一套规则,别随便用就好。
rockyou12 7
rockyou12 2019-08-26 14:55:32 +08:00 ❤️ 1
远古时代,http 的 get 请求会被各种服务商做缓存,所以请求都用 post 还算合理的设计。现在反正都 https 了,不存在了
mcfog 8
mcfog 2019-08-26 15:02:51 +08:00 ❤️ 1
不如何看待,工作那么多年了就没见过纯按标准来的 PATCH 或者 PUT 方法的接口

顺便,楼主你的理解也并不准确,PUT 同样适用于新增
learnshare 9
learnshare 2019-08-26 15:03:04 +08:00
没有*佳实践,不专业才是正常的,多数上层应用不遵守协议也能凑合运行嘛

@rockyou12 也不知道谁遇到过这个问题,并把他的垃圾经验推广开了
ikaiguang 10
ikaiguang 2019-08-26 15:30:42 +08:00
@mcfog

嗯呢。上面的理解,摘自“ 阮一峰”的。

ikaiguang 2019-08-26 15:32:50 +08:00
@Cyron
@qq292382270

我们的项目都是 post,不使用 get.

为了贪图方便
est 12
est 2019-08-26 15:49:10 +08:00 ❤️ 1
挺好的。

real world 如果只能用这 5 种方式操作资源简直是智障设定。比如我登出操作,如何对应这 5 种资源操作?
mcfog 13
mcfog 2019-08-26 15:53:18 +08:00 via Android
@est 可以当然是可以的,虚拟资源虚拟万物即可
DELETE /session/current 或者 /session/:sid
baiyi 14
baiyi 2019-08-26 16:10:24 +08:00 ❤️ 2
不赞成所有的 API 都是用 POST

但同样不赞成将 HTTP 方法对应 CRUD,例如说 POST:确实有“创建新资源”的语义,但是它还有“向数据处理过程提交数据块”的语义,这个“ data-handling process ”描述的太模糊了,所以 POST 方法完全可以替代 PUT、DELETE、PATCH,就像 HTML 的 form 标签,只支持 GET、POST,也完全符合语义的。在《 RESTful Web APIs 》这本书里叫它“ whatever ”……

所以我个人更倾向于用业务逻辑的安全性、幂等性来定义 API 该是用哪种方法。

举个例子:转账,使用 CRUD 就很难去对应,有的可能会用 PUT,因为修改了两个账户的余额信息,有的用 POST,但可能是强行将主体对象从账户转为转账记录这样的资源上,就会让人感觉很混乱。

但如果使用幂等性来判断就很简单,PUT 幂等,POST 不幂等,那转账,肯定是不幂等的。按照这个思路换个例子:修改用户余额,可能这样的场景比较少,但主要是为了说明。这个就应该使用 PUT,应为它是幂等的。
beyond99 15
beyond99 2019-08-26 16:18:21 +08:00
@mcfog 这种为了 restful 而 restful 的方式有什么意义?只会让接口更难懂
baiyi 16
baiyi 2019-08-26 16:23:35 +08:00
@mcfog #13 不建议这样构建资源

对于用户来说,POST “/user/logout ” 比 DELETE “/session ” 更容易理解,用户需要额外的去理解 session 这个资源的意义
ArJun 17
ArJun 2019-08-26 16:28:44 +08:00
所谓的规矩就是用来打破的,且意义上的 restful 都用 POSt 请求方式并没有什么影响
wu67 18
wu67 2019-08-26 16:46:27 +08:00
post 没什么毛病啊. 上面也说了 get 会被缓存, 这是其一; 统一 post 的话, 前端 /客户端封装请求方法也简洁很多, 不会出现 新来的菜鸡实习生搞不清楚为什么出错到处发问(笑) 的情况…
hmzt 19
hmzt 2019-08-26 16:54:22 +08:00
挺方便的,甚至一开始就不该设计那么复杂
Vegetable 20
Vegetable 2019-08-26 17:12:11 +08:00 ❤️ 1
挺方便的,信息更集中,通过 json 传递的参数带基本类型,减少犯错空间.比如 querystring 的 a=1&a=2 这种设计,很容易让新手犯错.

你可能觉得不遵守规范是不对的,实际上这就是一种权衡,严格遵守 restful 很难,复杂业务下,只要有一份规则,大家共同遵守就可以,没有圣经.
Cyron 21
Cyron 2019-08-26 17:16:03 +08:00
@ikaiguang #11 json api 全用 post 也没问题,时间可以花在命名规范上
westoy 22
westoy 2019-08-26 17:20:54 +08:00
还有就是跨浏览器和避开一些防火墙对 delete、patch、put 的阻断, 你永远不知道真实世界里会出啥妖蛾子

框架里*早提倡 REST 实践的是 rails 2 吧, 但是貌似直到现在 rails 都是通过 POST 传_method 字段来做的
nnqijiu 23
nnqijiu 2019-08-26 17:29:49 +08:00
都用 post
otakustay 24
otakustay 2019-08-26 17:49:28 +08:00
总比都用 GET 好,对吧
est 25
est 2019-08-26 18:06:42 +08:00
@mcfog 那带 CAPTCHA、2FA 的登入呢?

验证邮箱的 API 呢?

明明一个 资源名字 + 动词就能描述很清晰的东西,非得限定只用 5 个 verb 去套。。这是削足适履。

而且正规的 RESTful 还要区分单数复数的。。这个就是个笑话。章鱼有 3 种复数形式。做 log 统计的时候就想把 RESTful 作者砍死。

对了 RESTful 作者的发明其实就是 Adobe CodeFusion 没啥值得吹的。而且 RESTful *好的应用也就 WebDAV 了。协议来说其实设计出发点听起来不错,用起来各种问题。性能也不高。
mayne95 26
mayne95 2019-08-26 18:09:34 +08:00 via Android ❤️ 2
谢邀(并没有)
既然楼主用知乎的提问体,那么我就用知乎的回答体。

抛开业务场景谈 API 设计的都是耍流氓(加粗)

规则是个约定俗称的东西,能减少沟通成本,但规则本身也有学习成本。如果 rest 是有 RFC 支持,白纸黑字明文规定的规则。那非常好,大家都按这个来,不会出什么幺蛾子。V 站也不会有人隔三差五的出来讨论 rest 规范。

(不管对不对,先踩一番显得自己很高明的亚子)
像 REST 这种含糊不清的约定本来就是一坨 shit,restful ful ful 风格你懂吗,你的 API 有自己的 freestyle 嘛?真是滑天下之大稽!正如 5 楼所说,rest 不是标准,不是标准,不是标准。API 能在符合 HTTP 协议的情况下运行起来即可。

这个问题就像是,你觉得空格好还是 tab 好。又比如函数式之于面向对象。如果今后 graphql 普及,这个问题还有意义嘛?
拿前朝的剑斩本朝的官?(大雾)

在那个 API 风格混乱的年代,rest 的出现如同指路明灯。大家都按着这个来,减少了混乱,降低了沟通成本。这是值得肯定的。但是随着业务场景逐渐复杂,API 的设计已经没法完全符合 rest 的理念了。花心思去设计一个看起来美好的格式高度统一的 API,不如直接加个接口来的简单。

全用 post 是有缺陷的。举个例子,如果前端要上 service worker,这时候 API 全用 post,请求是没法被拦截并缓存的,也就谈不上什么离线应用。这种场景下用 rest 是保险的。

GitHub 的 API 堪称业界典范,程序员都喜欢。notion 获取数据全用的 post 请求,但这并不妨碍我喜欢它。重要的是产品。

好的 API 是自描述的,能够自洽的,符合直觉的。用户在使用某个接口后,能够推导出其它接口的用法。API 面向的用户群体是程序员,对于程序员来说文档*重要。文档是*好的约定,rest 不 rest 无所谓啦。
mcfog 27
mcfog 2019-08-26 21:25:29 +08:00 via Android
@est 我说 restful 能做,又没说建议用 restful 做。

如果你不懂怎么在一个 restful 风格的体系里设计符合 restful 风格的 2fa 也好 captcha 也罢我可以和你讨论一下我的想法,但我觉得你肯定没有兴趣

哦对了,我也不喜欢 restful,但喜不喜欢一门技术和是否理解这门技术的优缺点,还有能否理性地讨论一门技术是三件不一样的事情,希望你不会因此错过一些更有价值或是有趣的技术
artandlol 28
artandlol 2019-08-26 21:27:20 +08:00 via Android
建议用 grpc 吧
akira 29
akira 2019-08-26 22:13:13 +08:00
文档齐全的 API 就是好 API
dodo2012 30
dodo2012 2019-08-26 22:20:47 +08:00
@westoy rails 到现在也是按 rustful 来的,所以写习惯 rails 后,写所有其它语言的接口全会自学按 restful,
AngelCriss 31
AngelCriss 2019-08-26 23:08:43 +08:00 via Android
不用 http 不就行了
chocotan 32
chocotan 2019-08-26 23:13:02 +08:00
从上面的回复来看,不同的人对 restful 理解会出现偏差
那就别用了,全用 POST 吧
chocotan 33
chocotan 2019-08-26 23:14:17 +08:00
刚看到二楼…
我的客户连 content-type 都不懂,指望对方懂这些 http method ?
tedzhou1221 34
tedzhou1221 2019-08-27 08:13:00 +08:00 via Android
我司现状,强制 Post + json 也不知道好不好,但我知道拍板的人不懂技术。
liuxey 35
liuxey 2019-08-27 08:33:50 +08:00 ❤️ 1
能完全参照 RESTful 的有几个,所以也不能 50 笑百,

只要文档清晰, 沟通顺畅,工具好用,HTTP+XML 我也没意见
est 36
est 2019-08-27 10:07:54 +08:00
@mcfog 说得好。。。。
switch100 37
switch100 2019-08-27 13:01:46 +08:00 via iPhone
前端就是屁事多,给你 api 非得挑三拣四的,乖乖切页面不就可以了吗,还管到后端来了
StarkWhite 38
StarkWhite 2019-08-27 17:23:30 +08:00
GET, PUT, DELETE 等会对参数转义,调试麻烦,而且浏览器对字符长度限制也比较大,
GraphQL 就是只用 HTTP POST 了,参数内用 query 和 mutation 标识,多简单~
话说大家经常讨论的那个 APIJSON 也跟风全用 HTTP POST 了 /狗头

Android System WebView 和 Google Chrome 無法更新

各位先进大家好,Android System WebView 和 Google Chrome 无法更新,按一下更新,圈圈转一下就停了,试了好多方法,例如清除缓冲区的资料,网路上能找到的方法都试了,就是没用,想请较大家 网上搜索有一样的情况的也没出处理结果。 手机 piexl3 代理开的,其他软件都正常更新,就 这两个不行的 已解决了https://www.youtube.com/watch?v=Q1UmyIZHOLg

4 条回复  •  2021-03-25 17:36:34 +08:00    
1 yyyb   4 天前 我这里是不能更新 ph,按一下更新,圈圈转一下就停了,试了好多方法,例如清除缓冲区的资料,网路上能找到的方法都试了,就是没用,*后换了个毛子的梯子更新成功了    
2 LuciferGo   3 天前 有时候是网络问题,有时候双清就好,看情况的,判断是否网络问题,打开 Google app 看下 assistance 信息流就可以判别    
3 szx300   3 天前 via iPhone @yyyb #1 我按视频的教程更新好了!应该不是梯子的问题!还是谷歌系统问题!    
4 szx300   3 天前 via iPhone @LuciferGo #2 清了好多次了!目前处理好了!

现在移动端的应用主流都用什么模式开发?

为什么我感觉原生程,都没有什么热度

  • ios : object-c swift
  • android : java kotlin

然后就是 web 开发的,被吐槽各种不好用和 BUG 多

  • cordova ionic framework7
  • vue weex
  • react RN

虽说上面提及的东西用都是可以用着,但是生产环境线上项目都使用的是什么样子的技术做支撑?

 

15 条回复  •  2021-03-24 14:44:11 +08:00

1 SystemLight   6 天前 补充一下,我感觉 python 的 Kivy 也可以,还不错

2 EasonC   6 天前 via iPhone swift or flutter

3 ychost   6 天前 flutter + 原生 混合开发貌似可以试试水

4 nicevar   6 天前 需求复杂的就选原生为主,弄其他花里胡哨的没什么好处

5 tanranran   6 天前 现在主流还是原生 [kotlin 、swift] , [object-c 、java] 慢慢用的人越来越少了,除了老项目 web 开发,的话,react [taro] 和 vue [uniapp] 吧

6 JHExp   5 天前 flutter+原生的体验是真的可以 但是 flutter 不能热更 所以很多还是走的 h5

7 d7sus4   5 天前 内容、服务类应用更注重开发和维护成本,目前就是 RN 和 Flutter,个人认为还是 RN 比较靠谱,Flutter 感觉一直在横向扩张,目前还是不太敢在生产环境里用,保持关注吧。 复杂的工具类或重型应用,或者注重个性化体验和设计的,毫不犹豫选原生。 没有历史包袱的话直接 swift/kotlin 就好。

8 Roardeer   5 天前 我一直用的 Xamarin

9 OldActorsSmile   5 天前 uniapp

10 IGJacklove   5 天前 via Android 一般都是混合开发吧 rn,flutter 大厂都在用,没啥好担心的,还是看你自己的需求。

11 abcbuzhiming   5 天前 @Roardeer 很少看见用这个的,这东西的生态圈能赶得上 RN 吗?

12 Roardeer   5 天前 微软的生态,国内不算主流吧。我主要是全栈都用 C#

13 newHunter   5 天前 uniapp 一把梭

14 guiyun   5 天前 flutter 的话大厂用的话还挺好的,小厂还是算了吧,当时技术总监要我们用 flutter,结果技术总监一走,我们 flutter 的项目都不知道怎么维护了

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速