diff --git a/Makefile b/Makefile index f7d7b27f0..46f738ba0 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ build: .PHONY: lint lint: - htmlproofer --url-ignore "/localhost/,/172.17.8.101/,/172.20.0.113/,/slideshare.net/,/grpc.io/,/kiali.io/,/condiut.io/,/twitter.com/,/facebook.com/,/medium.com/,/google.com/,/jimmysong.io/" $(BOOK_OUTPUT) + htmlproofer --url-ignore "/localhost/,/172.17.8.101/,/172.20.0.113/,/slideshare.net/,/grpc.io/,/kiali.io/,/condiut.io/,/twitter.com/,/facebook.com/,/medium.com/,/google.com/,/jimmysong.io/,/openfaas.com/,/linkerd.io/,/layer5.io/,/thenewstack.io/,/blog.envoyproxy.io/,/blog.openebs.io/,/k8smeetup.github.io/,/blog.heptio.com/,/apigee.com/,/speakerdeck.com/,/download.svcat.sh/,/blog.fabric8.io/,/blog.heptio.com/,/blog.containership.io/,/blog.mobyproject.org/,/blog.spinnaker.io/,/coscale.com/,/zh.wikipedia.org/" $(BOOK_OUTPUT) .PHONY: serve serve: diff --git a/appendix/kubernetes-1.10-changelog.md b/appendix/kubernetes-1.10-changelog.md index d2369aef3..2e5546ab9 100644 --- a/appendix/kubernetes-1.10-changelog.md +++ b/appendix/kubernetes-1.10-changelog.md @@ -24,7 +24,3 @@ ## 获取 Kubernetes1.10已经可以通过[GitHub下载](https://github.com/kubernetes/kubernetes/releases/tag/v1.10.0)。 - -## 参考 - -[Kubernetes 1.10: Stabilizing Storage, Security, and Networking](http://blog.kubernetes.io/2018/03/kubernetes-1.10-stabilizing-storage-security-networking.html) \ No newline at end of file diff --git a/appendix/kubernetes-1.7-changelog.md b/appendix/kubernetes-1.7-changelog.md index c2fea0ad1..80d4a8d3d 100644 --- a/appendix/kubernetes-1.7-changelog.md +++ b/appendix/kubernetes-1.7-changelog.md @@ -41,7 +41,3 @@ - 第三方资源(TPR)已被自定义资源定义(Custom Resource Definitions,CRD)取代,后者提供了一个更清晰的API,并解决了TPR测试期间引发的问题和案例。如果您使用TPR测试版功能,则建议您[迁移](https://kubernetes.io/docs/tasks/access-kubernetes-api/migrate-third-party-resource/),因为它将在Kubernetes 1.8中被移除。 以上是Kubernetes1.7中的主要新特性,详细更新文档请查看[Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md)。 - -## 参考 - -[Kuberentes 1.7: Security Hardening, Stateful Application Updates and Extensibility](http://blog.kubernetes.io/2017/06/kubernetes-1.7-security-hardening-stateful-application-extensibility-updates.html) \ No newline at end of file diff --git a/appendix/kubernetes-1.8-changelog.md b/appendix/kubernetes-1.8-changelog.md index efa308135..15432f5eb 100644 --- a/appendix/kubernetes-1.8-changelog.md +++ b/appendix/kubernetes-1.8-changelog.md @@ -25,7 +25,3 @@ Volume快照、PV调整大小、自动taint、pod优先级、kubectl插件等! 除了稳定现有的功能,Kubernetes 1.8还提供了许多预览新功能的alpha版本。 社区中的每个特别兴趣小组(SIG)都在继续为所在领域的用户提供更多的功能。有关完整列表,请访问[发行说明](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md)。 - -## 参考 - -[Kubernetes 1.8: Security, Workloads and Feature Depth](http://blog.kubernetes.io/2017/09/kubernetes-18-security-workloads-and.html) \ No newline at end of file diff --git a/appendix/kubernetes-1.9-changelog.md b/appendix/kubernetes-1.9-changelog.md index f7ed9cc81..6089af15b 100644 --- a/appendix/kubernetes-1.9-changelog.md +++ b/appendix/kubernetes-1.9-changelog.md @@ -37,7 +37,3 @@ kube-proxy的IPVS模式进入beta版,为大型集群提供更好的可扩展 ## 获取 Kubernetes1.9已经可以通过[GitHub下载](https://github.com/kubernetes/kubernetes/releases/tag/v1.9.0)。 - -## 参考 - -[Kubernetes 1.9: Apps Workloads GA and Expanded Ecosystem](http://blog.kubernetes.io/2017/12/kubernetes-19-workloads-expanded-ecosystem.html) \ No newline at end of file diff --git a/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md b/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md index cf4293c80..8d73f7a81 100644 --- a/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md +++ b/appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.md @@ -37,10 +37,10 @@ 一年里按计划发布了4个版本,详见以下更新日志: -- [Kubernetes1.10更新日志](appendix/kubernetes-1.10-changelog.md) -- [Kubernetes1.11更新日志](appendix/kubernetes-1.11-changelog.md) -- [Kubernetes1.12更新日志](appendix/kubernetes-1.12-changelog.md) -- [Kubernetes1.13更新日志](appendix/kubernetes-1.13-changelog.md) +- [Kubernetes1.10更新日志](../appendix/kubernetes-1.10-changelog.md) +- [Kubernetes1.11更新日志](../appendix/kubernetes-1.11-changelog.md) +- [Kubernetes1.12更新日志](../appendix/kubernetes-1.12-changelog.md) +- [Kubernetes1.13更新日志](../appendix/kubernetes-1.13-changelog.md) 早在2017年的北美 KubeCon 上就有一种论调说 Kubernetes 正变得 boring,因为它已经越来越成熟,在未来不会出现大的变动,从以上更新日志中也可以看到,大多是一些功能进入 beta 或者 stable 状态,很少有新的功能出现。 @@ -58,7 +58,7 @@ ## Kubernetes Operator -以 Kubernetes 为核心来运维上层应用,诞生了一种名为”Kubernetes Native“的新型运维方式,真正践行 DevOps 理念的产物,开发者将于软件的运维逻辑写成代码,利用 Kubernetes 的**控制器模式(Controller Pattern)**和 [CRD](../concepts/crd.md) 来扩展 Kubernetes 的 API,各种 Operator 层出不穷,[awesome-operators](https://github.com/operator-framework/awesome-operators) 列举了目前所有的 Operator。例如我们熟悉的 [Istio](https://isito.io) 中就有50个 CRD。 +以 Kubernetes 为核心来运维上层应用,诞生了一种名为”Kubernetes Native“的新型运维方式,真正践行 DevOps 理念的产物,开发者将于软件的运维逻辑写成代码,利用 Kubernetes 的**控制器模式(Controller Pattern)**和 [CRD](../concepts/crd.md) 来扩展 Kubernetes 的 API,各种 Operator 层出不穷,[awesome-operators](https://github.com/operator-framework/awesome-operators) 列举了目前所有的 Operator。例如我们熟悉的 [Istio](https://istio.io) 中就有50个 CRD。 ![Istio 中的 CRD](https://ws2.sinaimg.cn/large/006tNc79ly1fzna87wmfij30u00zc4qp.jpg) diff --git a/appendix/tricks.md b/appendix/tricks.md index 323880bc2..0795b2a6e 100644 --- a/appendix/tricks.md +++ b/appendix/tricks.md @@ -205,7 +205,7 @@ data: ["8.8.8.8", "8.8.4.4"] ``` -`upstreamNameservers` 即使用的外部DNS,参考:[Configuring Private DNS Zones and Upstream Nameservers in Kubernetes](http://blog.kubernetes.io/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes.html) +`upstreamNameservers` 即使用的外部DNS。 ## 8. 创建一个CentOS测试容器 diff --git a/concepts/apiservice.md b/concepts/apiservice.md index b7ca0cd12..4b47ded87 100644 --- a/concepts/apiservice.md +++ b/concepts/apiservice.md @@ -129,6 +129,4 @@ v1 ## 参考 -[API Conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources) - -[Kuberentes1.8 reference doc](https://kubernetes.io/docs/api-reference/v1.8/#apiservicespec-v1beta1-apiregistration) +- [API Conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources) \ No newline at end of file diff --git a/concepts/concepts.md b/concepts/concepts.md index 428dbb2bb..e25815857 100644 --- a/concepts/concepts.md +++ b/concepts/concepts.md @@ -1,5 +1,7 @@ # Kubernetes的设计理念 +这一章将介绍 Kubernetes 的设计理念及基本概念。 + ### Kubernetes设计理念与分布式系统 分析和理解Kubernetes的设计理念可以使我们更深入地了解Kubernetes系统,更好地利用它管理分布式部署的云原生应用,另一方面也可以让我们借鉴其在分布式系统设计方面的经验。 @@ -8,7 +10,7 @@ Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示 -![分层架构示意图](../images/kubernetes-layers-arch.jpg) +![Kubernetes 分层架构示意图](https://ws4.sinaimg.cn/large/006tNc79ly1fzniqvmi51j31gq0s0q5u.jpg) * 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境 * 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等) diff --git a/concepts/cri.md b/concepts/cri.md index d9793a40c..3e8052c94 100644 --- a/concepts/cri.md +++ b/concepts/cri.md @@ -138,4 +138,3 @@ CRI是由[SIG-Node](https://kubernetes.slack.com/archives/sig-node)来维护的 - [Kubernetes CRI and Minikube](https://sreeninet.wordpress.com/2017/02/11/kubernetes-cri-and-minikube/) - [CRI-O and Alternative Runtimes in Kubernetes](https://www.projectatomic.io/blog/2017/02/crio-runtimes/) - [Docker、Containerd、RunC...:你应该知道的所有](http://www.infoq.com/cn/news/2017/02/Docker-Containerd-RunC) -- [Introducing Container Runtime Interface (CRI) in Kubernetes](http://blog.kubernetes.io/2016/12/container-runtime-interface-cri-in-kubernetes.html) diff --git a/concepts/csi.md b/concepts/csi.md index bf9d8ecc6..ae1adba2c 100644 --- a/concepts/csi.md +++ b/concepts/csi.md @@ -134,5 +134,4 @@ Kubernetes 尽可能少地指定 CSI Volume 驱动程序的打包和部署规范 ## 参考 -- [Introducing Container Storage Interface (CSI) Alpha for Kubernetes](http://blog.kubernetes.io/2018/01/introducing-container-storage-interface.html) - [Container Storage Interface (CSI)](https://github.com/container-storage-interface/spec/blob/master/spec.md) diff --git a/concepts/custom-resource.md b/concepts/custom-resource.md index 544db98bf..1510b4834 100644 --- a/concepts/custom-resource.md +++ b/concepts/custom-resource.md @@ -130,8 +130,6 @@ metadata: 详情参考:[Extend the Kubernetes API with CustomResourceDefinitions](https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/) -使用kubernetes1.7及以上版本请参考[Migrate a ThirdPartyResource to CustomResourceDefinition](https://kubernetes.io/docs/tasks/access-kubernetes-api/migrate-third-party-resource/)。 - ## 自定义控制器 单纯设置了自定义资源,并没有什么用,只有跟自定义控制器结合起来,才能将资源对象中的声明式API翻译成用户所期望的状态。自定义控制器可以用来管理任何资源类型,但是一般是跟自定义资源结合使用。 diff --git a/concepts/ingress.md b/concepts/ingress.md index 0a9780070..663ba3169 100644 --- a/concepts/ingress.md +++ b/concepts/ingress.md @@ -315,5 +315,4 @@ test - 178.91.123.132 - [Kubernetes : Ingress Controller with Træfɪk and Let's Encrypt](https://blog.osones.com/en/kubernetes-ingress-controller-with-traefik-and-lets-encrypt.html) - [Kubernetes : Træfɪk and Let's Encrypt at scale](https://blog.osones.com/en/kubernetes-traefik-and-lets-encrypt-at-scale.html) - [Kubernetes Ingress Controller-Træfɪk](https://docs.traefik.io/user-guide/kubernetes/) -- [Kubernetes 1.2 and simplifying advanced networking with Ingress](http://blog.kubernetes.io/2016/03/Kubernetes-1.2-and-simplifying-advanced-networking-with-Ingress.html) - [使用Istio控制Ingress流量](https://istio.io/zh/docs/tasks/traffic-management/ingress/) \ No newline at end of file diff --git a/concepts/network-policy.md b/concepts/network-policy.md index 811ee474d..eae8764e5 100644 --- a/concepts/network-policy.md +++ b/concepts/network-policy.md @@ -12,8 +12,6 @@ ## `NetworkPolicy` 资源 -查看 [API参考](https://kubernetes.io/docs/api-reference/v1.7/#networkpolicy-v1-networking) 可以获取该资源的完整定义。 - 下面是一个 `NetworkPolicy` 的例子: ```yaml diff --git a/concepts/pod-preset.md b/concepts/pod-preset.md index 15d96d6aa..807282c05 100644 --- a/concepts/pod-preset.md +++ b/concepts/pod-preset.md @@ -45,7 +45,3 @@ Kubernetes 提供了一个准入控制器(`PodPreset`),当其启用时,P ## 更多资料 - [使用 PodPreset 向 Pod 中注入数据](https://kubernetes.io/docs/tasks/inject-data-application/podpreset) - -本文为 Kubernetes 官方中文文档,地址:https://kubernetes.io/cn/docs/concepts/workloads/pods/podpreset/ - -翻译: [rootsongjc](https://github.com/rootsongjc) \ No newline at end of file diff --git a/concepts/volume.md b/concepts/volume.md index 508a4f059..ca789938a 100644 --- a/concepts/volume.md +++ b/concepts/volume.md @@ -8,7 +8,7 @@ Docker 中也有一个 [volume](https://docs.docker.com/engine/admin/volumes/) 的概念,尽管它稍微宽松一些,管理也很少。在 Docker 中,卷就像是磁盘或是另一个容器中的一个目录。它的生命周期不受管理,直到最近才有了 local-disk-backed 卷。Docker 现在提供了卷驱动程序,但是功能还非常有限(例如Docker1.7只允许每个容器使用一个卷驱动,并且无法给卷传递参数)。 -另一方面,Kubernetes 中的卷有明确的寿命——与封装它的 Pod 相同。所以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes 支持多种类型的卷,Pod 可以同时使用任意数量的卷。 +另一方面,Kubernetes 中的卷有明确的寿命——与封装它的 Pod 相同。所f以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes 支持多种类型的卷,Pod 可以同时使用任意数量的卷。 卷的核心是目录,可能还包含了一些数据,可以通过 pod 中的容器来访问。该目录是如何形成的、支持该目录的介质以及其内容取决于所使用的特定卷类型。 @@ -597,7 +597,7 @@ spec: ### vsphereVolume -**先决条件**:配置了 vSphere Cloud Provider 的 Kubernetes。有关云提供商的配置,请参阅 [vSphere 入门指南](https://kubernetes.io/docs/getting-started-guides/vsphere/)。 +**先决条件**:配置了 vSphere Cloud Provider 的 Kubernetes。有关云提供商的配置,请参阅 [vSphere 入门指南](https://vmware.github.io/vsphere-storage-for-kubernetes/documentation/)。 `vsphereVolume` 用于将 vSphere VMDK 卷挂载到 Pod 中。卷的内容在卸载时会被保留。支持 VMFS 和 VSAN 数据存储。 diff --git a/guide/access-cluster.md b/guide/access-cluster.md index f27b3f0f9..6c14943c6 100644 --- a/guide/access-cluster.md +++ b/guide/access-cluster.md @@ -110,7 +110,7 @@ Python 客户端可以使用与 kubectl 命令行工具相同的 [kubeconfig 文 #### 其他语言 -还有更多的 [客户端库](https://git.k8s.io/community/contributors/devel/client-libraries.md) 可以用来访问 API。有关其他库的验证方式,请参阅文档。 +还有更多的客户端库可以用来访问 API。有关其他库的验证方式,请参阅文档。 ### 在 Pod 中访问 API diff --git a/guide/using-statefulset.md b/guide/using-statefulset.md index bb8933f05..79fd4e6e3 100644 --- a/guide/using-statefulset.md +++ b/guide/using-statefulset.md @@ -323,5 +323,4 @@ spec: ## 参考 - https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ -- [kubernetes contrib - statefulsets](https://github.com/kubernetes/contrib/tree/master/statefulsets) -- http://blog.kubernetes.io/2017/01/running-mongodb-on-kubernetes-with-statefulsets.html \ No newline at end of file +- [kubernetes contrib - statefulsets](https://github.com/kubernetes/contrib/tree/master/statefulsets) \ No newline at end of file diff --git a/practice/dashboard-upgrade.md b/practice/dashboard-upgrade.md index 30b2ab347..3972dcfe2 100644 --- a/practice/dashboard-upgrade.md +++ b/practice/dashboard-upgrade.md @@ -76,8 +76,6 @@ env: value: english ``` -关于 i18n 的设计文档请参考: - 更简单的方式是,如果您使用的Chrome浏览器,则在浏览器中的配置中设置语言的顺序后刷新网页,dashboard将以您在Chrome中配置的首选语言显示。 ## 身份认证 diff --git a/practice/install-kubernetes-on-centos.md b/practice/install-kubernetes-on-centos.md index 1f5be4cb2..62811969b 100644 --- a/practice/install-kubernetes-on-centos.md +++ b/practice/install-kubernetes-on-centos.md @@ -12,7 +12,7 @@ 所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。 -**注:本文档中不包括docker和私有镜像仓库的安装,安装说明中使用的镜像来自 Google Cloud Platform,为了方便国内用户下载,我将其克隆并上传到了 [时速云镜像市场](https://hub.tenxcloud.com/search?q=jimmy&source=tenxcloud),供大家免费下载。** +**注:本文档中不包括docker和私有镜像仓库的安装,安装说明中使用的镜像来自 Google Cloud Platform,为了方便国内用户下载,我将其克隆并上传到了 [时速云镜像市场](https://tenxcloud.com/),搜索”Jimmy“,供大家免费下载。** **欲下载最新版本的官方镜像请访问 [Google 云平台容器注册表](https://console.cloud.google.com/gcr/images/google-containers/GLOBAL)。** diff --git a/practice/install-kubernetes-with-kubeadm.md b/practice/install-kubernetes-with-kubeadm.md index 82d2d0314..c7b06e602 100644 --- a/practice/install-kubernetes-with-kubeadm.md +++ b/practice/install-kubernetes-with-kubeadm.md @@ -5,7 +5,7 @@ Kubeadm 在2018年12月3日发布的 [Kubernetes 1.13](https://kubernetes.io/blo ## 基本介绍 **kubeadm** 是一个工具包,可帮助您以简单,合理安全和可扩展的方式引导最佳实践Kubernetes群集。它还支持为您管理[Bootstrap Tokens](https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/)并升级/降级群集。 -kubeadm的目标是建立一个通过Kubernetes一致性测试[Kubernetes Conformance tests](http://blog.kubernetes.io/2017/10/software-conformance-certification)的最小可行集群 ,但不会安装其他功能插件。 +kubeadm的目标是建立一个通过Kubernetes一致性测试Kubernetes Conformance tests的最小可行集群 ,但不会安装其他功能插件。 它在设计上并未为您安装网络解决方案,需要用户自行安装第三方符合CNI的网络解决方案(如flanal,calico,canal等)。 diff --git a/practice/opentracing.md b/practice/opentracing.md index bd2c60991..976af0f07 100644 --- a/practice/opentracing.md +++ b/practice/opentracing.md @@ -25,7 +25,7 @@ Trace 通常指一次完整的调用链。如上文中的 Jaeger UI 截图就是 每个 trace 都由一系列 Span 组成,一个 span 可以理解为两个微服务之间的调用,如同 Chrome 检查器中查看网络访问瀑布一样。 -![](https://ws2.sinaimg.cn/large/006tNbRwly1fwjkfbvfluj30y70hf0y9.jpg) +![Chrome Inspector](https://ws2.sinaimg.cn/large/006tNbRwly1fwjkfbvfluj30y70hf0y9.jpg) 根据 OpenTracing 的规格约定,每个 Span 都要包含以下状态: diff --git a/usecases/envoy-terminology.md b/usecases/envoy-terminology.md index 8e6b03ac9..eecbaa5df 100644 --- a/usecases/envoy-terminology.md +++ b/usecases/envoy-terminology.md @@ -20,7 +20,7 @@ **Upstream**:上游(upstream)主机获取来自 Envoy 的链接请求和响应。 -**Cluster**: 集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过[服务发现](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/service_discovery#arch-overview-service-discovery)发现集群中的成员。Envoy 可以通过[主动运行状况检查](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/health_checking#arch-overview-health-checking)来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员由[负载均衡策略](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/load_balancing#arch-overview-load-balancing)确定。 +**Cluster**: 集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过[服务发现](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/service_discovery#arch-overview-service-discovery)发现集群中的成员。Envoy 可以通过[主动运行状况检查](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/health_checking#arch-overview-health-checking)来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员由负载均衡策略确定。 **Mesh**:一组互相协调以提供一致网络拓扑的主机。Envoy mesh 是指一组 Envoy 代理,它们构成了由多种不同服务和应用程序平台组成的分布式系统的消息传递基础。 diff --git a/usecases/linkerd-user-guide.md b/usecases/linkerd-user-guide.md index 9ed095fed..5ddbd4a4f 100644 --- a/usecases/linkerd-user-guide.md +++ b/usecases/linkerd-user-guide.md @@ -283,5 +283,4 @@ Hello (172.30.60.14) world (172.30.71.19)!! ## 参考 - https://github.com/linkerd/linkerd-examples -- [A Service Mesh for Kubernetes](https://cdn2.hubspot.net/hubfs/2818724/A%20Service%20Mesh%20for%20Kubernetes_Final.pdf) - [dtab](https://linkerd.io/in-depth/dtabs/) diff --git a/usecases/spring-boot-quick-start-guide.md b/usecases/spring-boot-quick-start-guide.md index 23706b321..e3c8b34ef 100644 --- a/usecases/spring-boot-quick-start-guide.md +++ b/usecases/spring-boot-quick-start-guide.md @@ -10,7 +10,7 @@ Spring Boot旨在简化创建产品级的Spring应用和服务,简化了配置 ## Spring的基本原理 -Spring是一套Java开发框架,框架的作用就是为了减少代码的冗余和模块之间的偶尔,使代码逻辑更加清晰,主要是用了[AOP](https://docs.spring.io/spring/docs/2.5.x/reference/aop.html)(Aspect Oriented Programming,面向切面编程)和[IoC](http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/)(Inversion of Control,控制反转)容器的思想,其中AOP是利用了Java的反射机制实现的。为了便于理解AOP可以参考[一个简单的Spring的AOP例子](http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html)。 +Spring是一套Java开发框架,框架的作用就是为了减少代码的冗余和模块之间的偶尔,使代码逻辑更加清晰,主要是用了[AOP](https://docs.spring.io/spring/docs/2.5.x/reference/aop.html)(Aspect Oriented Programming,面向切面编程)和IoC(Inversion of Control,控制反转)容器的思想,其中AOP是利用了Java的反射机制实现的。为了便于理解AOP可以参考[一个简单的Spring的AOP例子](http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html)。 ## 准备环境