Istio在服务网络中统一提供了许多关键功能:

  • 流量管理:控制服务之间的流量和API调用的流向,使得调用更可靠,并使网络在恶劣情况下更加健壮。

  • 可观察性:了解服务之间的依赖关系,以及它们之间流量的本质和流向,从而提供快速识别问题的能力。

  • 策略执行:将组织策略应用于服务之间的互动,确保访问策略得以执行,资源在消费者之间良好分配。策略的更改是通过配置网格而不是修改应用程序代码。

  • 服务身份和安全:为网格中的服务提供可验证身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流转。

Istio针对可扩展性进行了设计,以满足不同的部署需要:

  • 平台支持:Istio旨在在各种环境中运行,包括跨云, 预置,Kubernetes,Mesos等。最初专注于Kubernetes,但很快将支持其他环境。

  • 集成和定制:策略执行组件可以扩展和定制,以便与现有的ACL,日志,监控,配额,审核等解决方案集成。

Envoy:

    istio 使用Envoy 代理的扩展版本,Envoy是以c++开发的高性能代理,用于解释服务网格中所有服务的所有入站和出站的流量,Envoy的许多内置功能被iosio发扬光大,例如动态发现,负载均衡,TLS终止,HTTP1/2&Grpc代理,熔断器,健康检查,基于百分比流量拆分的分段推出,故障注入和丰富指标。

    Envoy被部署为边车,和对应服务在同一个pod中,这允许istio将大量关于流量行为的型号作为属性提取出来,而这些属性又可以在Mixer中用于执行策略决策,并发送到监控系统,以提供整个网格行为的信息

Mixer:

    负责在服务网格上执行访问控制和使用策略,并从Envoy代理和其他服务收集遥测数据,代理提取请求级属性,发送到Mixer进行评估。

Pilot

   负责手机和验证配置,并将其传播到各种istio组件,它从Mixer和Envoy中提取环境特定的实现细节,为他们提供用户服务的抽象表示,独立于底层平台,此外,流量管理规则可以在运行时通过pilot进行编程。

lstio-auth

     提供强大的服务间认证和终端用户认证,使用交互tls,内置身份和证书管理,可以升级服务网格中的未加密流量,并为运维人员提供基于服务身份而不是网络控制来执行策略的能力。

安装Istio Sidecar

在Kubernetes 1.9及更高版本中默认启用。从Istio 0.5.0开始,自动代理注入使用突变webhooks,并且已经删除了对初始化程序注入的支持。无法升级到Kubernetes 1.9的用户应使用手动注入。

自动把 sidecar 插入到 pod中, 需要在api中打开

[root@master1 addons]# cat /lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target [Service]
User=root
ExecStart=/usr/local/bin/kube-apiserver \
--admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota,,MutatingAdmissionWebhook,ValidatingAdmissionWebhook \
--advertise-address=192.168.200.51 \
--allow-privileged=true \
--anonymous-auth=false \
--apiserver-count=1 \
--audit-policy-file=/etc/kubernetes/audit-policy.yaml \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/var/log/kubernetes/audit.log \
--authorization-mode=Node,RBAC \
--bind-address=0.0.0.0 \
--secure-port=6443 \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--enable-swagger-ui=true \
--etcd-cafile=/etc/kubernetes/ssl/ca.pem \
--etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \
--etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \
--etcd-servers=https://192.168.200.51:2379,https://192.168.200.52:2379,https://192.168.200.53:2379 \
--event-ttl=1h \
--kubelet-https=true \
--insecure-bind-address=192.168.200.51 \
--insecure-port=8080 \
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-cluster-ip-range=10.254.0.0/16 \
--service-node-port-range=30000-32000 \
--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
--enable-bootstrap-token-auth=true \
--token-auth-file=/etc/kubernetes/token.csv \
--requestheader-client-ca-file=/etc/kubernetes/ssl/front-proxy-ca.pem \
--proxy-client-cert-file=/etc/kubernetes/ssl/front-proxy-client.pem \
--proxy-client-key-file=/etc/kubernetes/ssl/front-proxy-client-key.pem \
--requestheader-allowed-names=aggregator \
--requestheader-group-headers=X-Remote-Group \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-username-headers=X-Remote-User \
--runtime-config=admissionregistration.k8s.io/v1alpha1 \
--runtime-config=api/all=true \
--enable-aggregator-routing=true \
--v=0
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536 [Install]
WantedBy=multi-user.target

Pod规格要求

1.服务关联

2.命名端口

服务端口必须命名。端口名称必须是形式<protocol>[-<suffix>]与 HTTP, http2, GRPC,或 Redis的作为<protocol>,以便采取的Istio的路由功能。例如,name: http2-foo或者name: http是有效的端口名称,但name: http2foo不是。如果端口名称未以可识别的前缀开头,或者端口未命名,则端口上的流量将被视为纯TCP流量(除非端口明确用于Protocol: UDP表示UDP端口

3. 使用应用标签进行部署:建议使用Kubernetes部署的Pod在部署规范中Deployment具有明确的app标签。每个部署规范都应该有一个明确的app标签,其中有一个值表示有意义的值 该app标签用于在分布式跟踪中添加上下文信息

自动边车注入

使用webhook准入控制器,可将Sidecars自动添加到适用的Kubernetes Pod中。此功能需要Kubernetes 1.9或更高版本。验证kube-apiserver进程是否已设置admission-control标记,MutatingAdmissionWebhookValidatingAdmissionWebhook按照正确的顺序添加并准许控制器,并且启用许可注册API。

kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1

安装webhook

kubectl apply -f install/kubernetes/istio.yaml

Webhooks需要签名的证书/密钥对。使用install/kubernetes/webhook-create-signed-cert.sh来产生由Kubernetes' CA签名的证书/密钥对 生成的证书/密钥文件作为Kubernetes机密文件存储,供边车注入器webhook使用。

注意:Kubernetes CA批准需要创建和批准CSR的权限

./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs

安装边车注入配置图。

kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml

Set the caBundle in the webhook install YAML that the Kubernetes api-server uses to invoke the webhook.

cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh > \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

Install the sidecar injector webhook.

kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

The sidecar injector webhook should now be running.

kubectl -n istio-system get deployment -listio=sidecar-injector

NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
istio-sidecar-injector 1d

NamespaceSelector根据该对象的名称空间是否与选择器匹配来决定是否在对象上运行webhook,默认的webhook配置使用istio-injection=enabled

查看显示istio-injection标签的default名称空间并验证名称空间未被标记。

kubectl get namespace -L istio-injection

NAME           STATUS        AGE       ISTIO-INJECTION
default Active 1h
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h

default名称空间标签istio-injection=enabled

kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection

NAME           STATUS    AGE       ISTIO-INJECTION
default Active 1h enabled
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h

部署一个应用程序

kubectl apply -f samples/sleep/sleep.yaml 

禁用default名称空间的注入

kubectl label namespace default istio-injection-

卸载webhook

kubectl delete -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
kubectl -n istio-system delete secret sidecar-injector-certs
kubectl delete csr istio-sidecar-injector.istio-system
kubectl label namespace default istio-injection-

流量管理
介绍演示Istio服务网格的流量路由功能的任务。

配置请求路由:  此任务向您展示如何根据权重和HTTP标头配置动态请求路由。
故障注入  :  此任务显示如何注入延迟并测试应用程序的弹性。
交通转移  :  此任务向您显示如何将流量从旧版本迁移到新版本的服务。
设置请求超时:  本任务向您展示如何使用Istio在Envoy中设置请求超时。
Istio Ingress  :  介绍如何在Kubernetes上配置Istio Ingress。
控制出口流量:  介绍如何配置Istio以将流量从网格中的服务路由到外部服务。
控制出口TCP流量:介绍如何配置Istio以将TCP流量从网格中的服务路由到外部服务。
断路    :  这项任务演示了弹性应用的断路能力
镜像    :  演示Istio的流量投影/镜像功能

deployment 和 service 模版 ,使用标签 app version, 一个服务对应不同的deployment

apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
spec:
type: NodePort
ports:
- port:
name: http
selector:
app: reviews
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: reviews-v1
spec:
replicas:
template:
metadata:
labels:
app: reviews
version: v1
spec:
containers:
- name: reviews
image: 192.168.200.10/istio/examples-bookinfo-reviews-v1:1.5.
imagePullPolicy: IfNotPresent
ports:
- containerPort:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: reviews-v2
spec:
replicas:
template:
metadata:
labels:
app: reviews
version: v2
spec:
containers:
- name: reviews
image: 192.168.200.10/istio/examples-bookinfo-reviews-v2:1.5.
imagePullPolicy: IfNotPresent
ports:
- containerPort:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: reviews-v3
spec:
replicas:
template:
metadata:
labels:
app: reviews
version: v3
spec:
containers:
- name: reviews
image: 192.168.200.10/istio/examples-bookinfo-reviews-v3:1.5.
imagePullPolicy: IfNotPresent
ports:
- containerPort:

配置请求路由

原理: 首先使用istio将100%的请求流量路由到了 v1 版本上, 然后设置了一条路由规则, 该规则基于请求header(一个用户的cookie)将流量路由到了 v2 版本,  如果v2 版本经过测试后满足要求,我们就可以一次性

或者渐进的路由到v2版本上。

1. 默认访问 version v1 版本

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
spec:
destination:
name: reviews
precedence:
route:
- labels:
version: v1

2. 将特定用户的请求路由到 version v2上

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-test-v2
spec:
destination:
name: reviews
precedence:
match:
request:
headers:
cookie:
regex: "^(.*?;)?(user=jason)(;.*)?$"
route:
- labels:
version: v2

故障注入

istio 注入延迟 测试应用弹性

2个服务, serverA  和 serverB

serverA 用户(feng) 和 serverB 之间 注入7秒延迟,    serverA 针对 serverB 服务设置了10秒超时,期望 端对端的流程能无错持续。

注意: 其他用户没有注入7秒延迟。

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: ratings-test-delay
spec:
destination:
name: ratings
precedence:
match:
request:
headers:
cookie:
regex: "^(.*?;)?(user=jason)(;.*)?$"
route:
- labels:
version: v1
httpFault:
delay:
percent:
fixedDelay: 7s

使用账户 feng 登录, 如果应用首页已经设置了正确处理延迟,那么首页将会在 7秒加载完成,但是 serverA 到 serverB 需要等待10秒,那么将超时。

流量转移:

应用流量 逐步有旧版本的服务 迁移到新版本, 通过istio 可以使用不同权重的规则,将流量平稳的从旧版本服务 迁移到新版本上, 金丝雀 灰度发布。

1. 请求v1 版本

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
spec:
destination:
name: reviews
precedence: 1
route:
- labels:
version: v1

2. 把50% 的流量从 v1 版本 转移到 v3版本

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
spec:
destination:
name: reviews
precedence:
route:
- labels:
version: v1
weight:
- labels:
version: v3
weight:

用 kubectl  apply/ replace 替换

3. v3 和 v1 版本交替出现后, 将100%的流量路由到v3 版本中

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: reviews-default
spec:
destination:
name: reviews
precedence:
route:
- labels:
version: v3
weight:

###################################################################################################

实战:

一个服务,对应3个deployment, 最后通过istio-ingress 映射域名

nginx.yaml

apiVersion: v1
kind: Service
metadata:
namespace: fengjian
name: nginx
labels:
app: nginx
spec:
type: NodePort
ports:
- port:
name: http
protocol: TCP
targetPort:
selector:
app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: fengjian
name: nginx-v1
spec:
replicas:
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- name: nginx
image: 192.168.200.10/test/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: fengjian
name: nginx-v2
spec:
replicas:
template:
metadata:
labels:
app: nginx
version: v2
spec:
containers:
- name: nginx
image: 192.168.200.10/test/nginx:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: fengjian
name: nginx-v3
spec:
replicas:
template:
metadata:
labels:
app: nginx
version: v3
spec:
containers:
- name: nginx
image: 192.168.200.10/test/nginx:v3
imagePullPolicy: IfNotPresent
ports:
- containerPort:

2. 通过istio-ingress 让外网访问,注意: pod 注入 enovy后,nodeport 不起作用了,服务无法访问。

istio-ingress-bookinfo.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gatewayfengjian
namespace: fengjian
annotations:
kubernetes.io/ingress.class: "istio"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: nginx
servicePort:

创建执行

[root@master1 nginx-istio]# kubectl create -f booktest.yaml  -f istio-ingress-bookinfo.yaml 

默认情况, 访问应该轮训到 3个deployment的上的nginx ,  通过流量管理中的 配置请求路由规则,指定到 deployment  nginx:v1 版本上

vim rule-choice-deployment-nginx-v1.yaml

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
namespace: fengjian
name: nginx-default
spec:
destination:
name: nginx
precedence:
route:
- labels:
version: v1

创建规则

kubectl create -f rule-choice-deployment-nginx-v1.yaml

访问istio-ingress

注意的问题:

流量转移

流量从 旧版本中迁移到新版本中, 通过istio,可以使用一系列不同权重的规则(10%,20%.....100%),将流量平稳的迁移到新版本中

1. 迁移50%到新版本中

route-rule-reviews-50.yaml

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
namespace: fengjian
name: nginx-
spec:
destination:
name: nginx
precedence:
route:
- labels:
version: v1
weight:
- labels:
version: v3
weight:

通过访问页面,基本上是50%的轮训到页面。

2. 迁移100%到新版本中

route-rule-reviews-100.yaml

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
namespace: fengjian
name: nginx-
spec:
destination:
name: nginx
precedence:
- labels:
version: v3
weight:

是更新,不是创建

kubectl apply -f route-rule-reviews-.yaml

注意该方式和使用容器编排平台的部署特点来进行版本迁移是完全不同的,容器编排平台使用了实例scaling来对流量进行管理,而通过istio,两个版本的的服务可以独立进行

scale up 和 scale down,并不会影响这两个版本的服务之间的流量分发。

熔断

限制因为故障、延迟高峰以及其他预计外的网络异常所造成的影响范围。

服务端使用 nginx

配置目的策略,对nginx 的调用过程进行断路设置。

nginx-destinaionpolicy.yaml

apiVersion: config.istio.io/v1beta1
kind: DestinationPolicy
metadata:
name: nginx-circuit-breaker
spec:
destination:
name: nginx
labels:
version: v1
circuitBreaker:
simpleCb:
maxConnections:
httpMaxPendingRequests:
sleepWindow: 3m
httpDetectionInterval: 1s
httpMaxEjectionPercent:
httpConsecutiveErrors:
httpMaxRequestsPerConnection:
kubectl  create -f  nginx-destinaionpolicy.yaml

istioctl get destinationpolicy

NAME                    KIND                                            NAMESPACE
nginx-circuit-breaker DestinationPolicy.v1alpha2.config.istio.io istio-samples

设置客户端

客户端调用ginx服务的规则, 创建一个客户端,向服务端发送流量, 使用负载测试工具fortio, 使用fortio 可以控制连接数量,并发数以及外发http调用的延迟。

kubectl apply -f <(istioctl kube-inject -f samples/httpbin/sample-client/fortio-deploy.yaml)

使用-curl 指定只执行一次调用。

FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/local/bin/fortio -- load -curl http://nginx:8000

测试断路器

在断路器设置中,我们指定maxConnections: 1以及httpMaxPendingRequests: 1。这样的设置下,如果我们并发超过一个连接和请求,istio-proxy就会断掉后续的请求和连接。设置两个并发链接(-c 2),发送20个请求(-n 20):

[root@master1 httpbin]# kubectl exec -it fortio-deploy-d86464f9d-ks4hm   -c fortio /usr/local/bin/fortio -- load -c  -qps  -n  -loglevel Warning http://nginx.fengjian
:: I logger.go:> Log level is now Warning (was Info)
Fortio 0.9. running at queries per second, -> procs, for calls: http://nginx.fengjian
Starting at max qps with thread(s) [gomax ] for exactly calls ( per thread + )
Ended after .157183ms : calls. qps=1101.5
Aggregated Function Time : count avg 0.0016854434 +/- 0.0008323 min 0.000847509 max 0.004309432 sum 0.033708867
# range, mid point, percentile, count
>= 0.000847509 <= 0.001 , 0.000923755 , 15.00,
> 0.001 <= 0.002 , 0.0015 , 65.00,
> 0.002 <= 0.003 , 0.0025 , 95.00,
> 0.004 <= 0.00430943 , 0.00415472 , 100.00,
# target % 0.0017
# target % 0.00233333
# target % 0.00283333
# target % 0.00424755
# target 99.9% 0.00430324
Sockets used: (for perfect keepalive, would be )
Code : (100.0 %)
Response Header Sizes : count avg +/- min max sum
Response Body/Total Sizes : count avg +/- min max sum
All done calls (plus warmup) 1.685 ms avg, 1101.5 qps

设置两个并发链接(-c 100000),发送20个请求(-n 200000

kubectl exec -it fortio-deploy-d86464f9d-ks4hm   -c fortio /usr/local/bin/fortio -- load -c  -qps  -n  -loglevel Warning http://nginx.fengjian

>  <=  , 62.5 , 42.37,
> <= , 87.5 , 47.88,
> <= 283.465 , 191.733 , 100.00,
# target % 107.452
# target % 195.459
# target % 248.263
# target % 279.945
# target 99.9% 283.113
Sockets used: (for perfect keepalive, would be )
Code - : (62.9 %)
Code : (19.6 %)
Code : (17.6 %)
Response Header Sizes : count avg 46.731345 +/- 94.69 min max sum
Response Body/Total Sizes : count avg 86.594238 +/- min max sum
All done calls (plus warmup) 123391.636 ms avg, 352.1 qps

策略实施

限流

如果是一个外部付费API服务, 限制1 qps免费, 使用istio 控制。

istio 配置解读的更多相关文章

  1. Python Fabric ssh 配置解读

    Python Fabric ssh 配置解读 Fabric 2.4简介: Fabric is a high level Python (2.7, 3.4+) library designed to e ...

  2. Spring Security(三) —— 核心配置解读

    摘要: 原创出处 https://www.cnkirito.moe/spring-security-3/ 「老徐」欢迎转载,保留摘要,谢谢! 3 核心配置解读 上一篇文章<Spring Secu ...

  3. k8s istio 配置请求的路由规则

    使用istio我们可以根据权重和HTTP headers来动态配置请求路由. 基于内容的路由 因为BookInfo示例部署了3个版本的评论微服务,我们需要设置一个默认路由. 否则,当你多次访问应用程序 ...

  4. web.xml中常见配置解读

    文章转自:http://blog.csdn.net/sdyy321/article/details/5838791 有一般XML都必须有的版本.编码.DTD <web-app>下子元素&l ...

  5. nginx配置解读

    nginx.conf基本配置 ##Start. ##Basic 基础配置 user www www; #运行用户 worker_processes ; #启动进程,通常设置成和cpu的数量相等 wor ...

  6. Maven settings.xml配置解读

    本文对${maven.home}\conf\settings.xml的官方文档作个简单的解读,请确保自己的maven环境安装成功,具体安装流程详见Maven安装 第一步:看settings.xml的内 ...

  7. istio 配置https gateway

    沒有親手實驗,参考官方文档:  https://istio.io/docs/tasks/traffic-management/secure-ingress/

  8. Spring batch学习 详细配置解读(3)

    第一篇讲到普通job 配置 那么spring  batch 给我们提供了丰富的配置,包括定时任务,校验,复合监听器,父类,重启机制等. 下面看一个动态设置读取文件的配置 1.动态文件读取 <?x ...

  9. logback.xml解读----日志配置解读

    初次接触javaweb项目的日志是log4j文件,但是后来发现通过配置logback.xml文件实现日志输出非常好用.经过上午的学习,现总结如下: 直接上配置文件和注释: <?xml versi ...

随机推荐

  1. xshell复制粘贴

    用户看到这个标题肯定会觉得小编脑子坏掉了,复制粘贴不就是Ctrl+C,Ctrl+V嘛,但是在xshell却不尽然. 现象: 在xshell界面中需要用到之前的一段代码,自然是选中,熟练的键入Ctrl+ ...

  2. vue.js 开发环境配置

    1. node.js环境(npm包管理器) 下载: https://nodejs.org/en/download/current/ 下载解压版的方便 添加path环境后运行 npm包管理器,是集成在n ...

  3. 移动端点击输入框,弹出键盘,底部被顶起问题(vue)

    这个问题相信做移动端开发的童鞋会有深刻体会,以前用jq开发时就很头疼这个问题,每次底部footer部分需要用position:fixed,如果页面内容不是很长,没有超出屏幕范围,那就还好,没有问题:一 ...

  4. 全功能开发团队(FSD)

  5. Pwn with File结构体(二)

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 最新版的 libc 中会对 vtable 检查,所以之前的攻击方式 ...

  6. 前端构建工具 Gulp.js 上手实例

    在软件开发中使用自动化构建工具的好处是显而易见的.通过工具自动化运行大量单调乏味.重复性的任务,比如图像压缩.文件合并.代码压缩.单元测试等等,可以为开发者节约大量的时间,使我们能够专注于真正重要的. ...

  7. C# 中 DataTable 使用详解。

    在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...

  8. NodeJS做中转服务器,转发接口

    搬家后的博客地址:http://www.cnblogs.com/shihaibin821/p/7683752.html

  9. [翻译] M13BadgeView

    M13BadgeView M13BadgeView is a customizable badge view for iOS applications. The badge is built to b ...

  10. 初学Linux(一)关闭操作shutdown halt reboot

    1.shutdown –h 10 #这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中. 2.Shutdown –h now #立马关机 3.Shutdown –h 11:1 ...