金哥铁码

上善若水,知行合一


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

唯识学

发表于 2018-08-12 | 分类于 佛学

  佛教哲学的一个体系大乘唯识哲学,在民间般若学是显学,读金刚经和心经的比较多,在学界唯识学从出现开始一直到今天都是佛教哲学的显学。按照思想体系来分,唯识学存在两种分类,一类是新旧分类法,另一类是古今分类法。下面就详细聊聊这两块内容。

  唯识学的古今分类法,所谓唯识古学是以世亲大师为代表的,所谓唯识今学是以陈那大师为代表的。两人都是唯识学的宗师,他们学说的区别是古学是顺从旧说,今学则是推演衍新说。唯识学的基本命题是‘唯识无境’,所谓‘唯识无境’是我们如何去认识这个世界的方法问题,世界就是所谓的镜,它是从哪里来的?是从我们的识来的,是我们的识了知来的,所以唯识所以无镜,就是说世界不存在,只是我们识的反映。那我们的识存不存在呢?镜已经不存在了,那识呢?这就是唯识古学和唯识今学的分歧所在。也就是关于识的存在性上两者看法不同。世界已经不存在了,那你感知这个世界的能力到底存不存在?这是唯识无镜的第一个概念。唯识无镜的第二个概念就是识的三分法,识是由三部分组成的,分别是见分,相分,自证分。所谓见分就是我们摄取事物的能力,比如眼睛就是我们看见事物的能力。所谓相分就是世界上的事物反应给我们的形象。见分和相分是如何关联的呢?他们是通过阿赖耶识来相互作用的。见分和相分都是动作,最终我们摄取事物的形象反映在心识上是通过自证分。自证分就是识的本体,它具有认识能力,这个识是实在的。当我们看见一个东西的时候,用我们自己眼睛的见分去摄取物体形象的相分,然后阿赖耶识连接了这个见分和相分,在我们心识的自证分部分感知到了物体的实在性,只是感知了物体的实在性,不是说物体真的实在。这个物体的相分并不是物体自身的,通过我们眼睛的这种见分转化来的,也就是事物的实在性是依托于见分,自证分能感知到事物是依托于见分的,这就是唯识学的依他起性,所以在唯识古学里,这个自证分这个识的本体它必须是实在的。而陈那大师的唯识今学,不承认自证分的实在性。世界不存在,你感知世界的这个能力也不存在。唯识今学认为,所谓的相分并不是世界实体的性质,也并不是眼睛见分去摄取的,而是你眼睛派生出来的幻镜,也就是说你看见什么不是你眼睛的能力问题,是你眼睛的想法问题。当然你眼睛有想法也没用,因为最后真正具有实在性的也不是反映在自证分上的,是梦,也就是相梦。也就是你所看到的东西的形象实际是你先天的经验就知道的是啥东西的梦。这个相梦是实在的,自证分是不实在的。这个先天遗传的相梦说法和西方哲学家康德的先验论有点类似。陈那大师的这套唯识今学后来发展出了一套完整的因明学,也就是逻辑学。

  唯识学的新旧分类法,作为瑜伽行派的中心学说,唯识哲学传入中国以后,它就分成了两套思想体系,一套是旧译的,叫九识说,也就是有九个识:眼、耳、鼻、舌、身、意、末那识、阿赖耶识、无垢净识。这套旧译唯识说也叫如来藏缘起说。还有一套新译的,叫八识说,也就是比旧译的唯识学少一个无垢净识,这个学说也叫阿赖耶识缘起说。在南北朝的晚期,佛教界内部最大的对峙,是北方地论师和南方摄论师之间。北部的学僧是世亲大师的十地经论为指导的,坚持阿赖耶识的八识说,认为末那识是妄识,而第八识阿赖耶识是真识。南方的学僧是以无著大师的摄大乘论为指导的,他们认为阿赖耶识是妄识,他们另立了一个第九识无垢净识为真识。世亲和无著是哥俩,世亲是哥哥,无著是弟弟。当时的时代背景,佛法到底是九识还是八识,一直没有权威来解读。后来玄奘大师为了求取真经,平息心中的疑惑,去印度求取真经来解决这个问题。玄奘大师到印度取的是唯识今学陈那大师的经。不过很遗憾,费尽千辛万苦取回来的经,中国人就读了一百多年,陈那大师的这套学说就没有往下传了。没有往下传的原因主要是印度的逻辑观和中国人有根本冲突,印度人有种姓制度,把人分等级,玄奘大师原汁原味的采取这套学说,中国人是王侯将相宁有种乎?不太认同印度这套说法,这也导致唯识法相宗没有传下去。后来唯识学成为中国佛教理论的武器库,博大精深,只要有需要都可以去拿一点。很快中国人发展出来了自己的一套唯识学体系。不管是新唯识还是旧唯识,他们在传入中国后,就和传入前的都变得不一样了。所以有时我们去看佛经,经常出现偏差,就是因为古人早就做了中国式的改造。改造就是把绝对真理的客体化改造绝对真理的本体化。

  所谓绝对真理客体化就是绝对真理在你外面,是个客体。而绝对真理的本体化就是真理在你心里,在你身上。那唯识学中国化就是把绝对真理客体化转化为内在的本体化。那绝对真理是什么呢?就是真如,无上正等正觉,真谛等等。外域的佛学认为存在一个绝对真理的客体,这个客体不是众生性,也不是自性,是众性和自性以外的实体,这个需要我们去把握和认识。简单说就是真理在外就是客体说。而中国唯识学兴起的代表作是马鸣菩萨的大乘起信论。中国禅宗整整经历了十五代人的努力,用了华严宗的圆融观,用了禅宗的无心观,发挥了中国儒家以一贯百的传统,到了唐朝末期整整十五代人,禅宗五家中的第五家,法眼宗的高僧永明延寿终于用一个一心说统一了新旧唯识。这个概念一出,立刻横扫学界。

  唯识学就介绍到这。我由此得到的启示是:我们总希望通过自己的努力改变外部世界来改变自己命运,但真正要做的是要改变我们自身实现改变自身的外部环境。也就是个人命运不在客体,在本体。

哥德尔不完全定理

发表于 2018-07-24 | 分类于 哲学

前言

  今天聊一个比较严肃的话题,和身边的人交流很多,听过很多关于哥德尔不完全定理的过度解读。学一个东西不会不要紧,最怕的就是一知半解,只学了前半段不了解后半段,所以有时候理解会和作者原意差很远。哥德尔是一个数学家,哥德尔不完全定理也是关于数学方面的定理,我要讲的不是数学,我是尽量给你一个未必准确但是简明的解释,让你通过这个定理对世界有一个深刻的理解。

正文

  数学家研究问题的方法是通过逻辑证明出来的,这个和科学家通过观察世界总结规律的方法有着本质的区别。什么意思?比如你考察几个直角三角形,发现他们的直角边的平方和都正好等于斜边的平方,那你能据此就认为这是直角三角形的普遍性吗?不能。你必须通过严格的数学推导证明这个性质,证明了,这个才能称为勾股定理。

  问题来了,那证明这个定理的依据是什么呢?有的是已经被别人证明过的定理。那最初的定理是从哪里来的?最初的定理不叫定理,叫公理。公理就是逻辑极点,不需要证明的,是人们普遍认可的东西。比如常见的两点之间只能有一条直线,这就是一条公理。

  数学家先认可几条公理,然后在公理的基础上证明各种定理,数学理论大厦就此建立起来。比如我们初中学的欧氏几何,总共才五条公理。决定整个几何学大厦的不是那些定理,而是这五条公理。在初中的时候,我们为了证明一个结论,往往会巧妙构思,而且有时候还比较难。

  在20世纪初的时候,有一些数学家想找到一个机械的方法,从最基本的数学公理出发,自动证明所有的数学定理。当时的数学家主要考虑的是有关自然数的理论体系。数学家经过一番努力,貌似有了一些进展。但是在1931年的一个会议上,25岁的哥德尔做了一个报告,说他证明了一个有关自然数公理系统的定理。哥德尔证明了,在自然数的公理系统中,不但你想要的那种机械化的证明不存在,而且对有些命题来说,连证明本身都不存在。这个就是著名的哥德尔不完全定理。什么意思?用大白话说,只要自然数的公理系统只有有限条公理,那就一定存在一些命题,你既不能说它对,也不能说它错。也就是自然数的公理系统是不完全的。

   请注意上面所说的哥德尔不完全定理是有条件的。很多人把哥德尔不完全定理做引申,认为哥德尔证明了一切有限的公理系统都是不完备的。这个就错了,哥德尔不完全定理只限于自然数系统。事实上,有一个数学家在1948年就证明了如果一个封闭的实数系统,那它就有可能是完备的和自洽的。比如欧氏几何就是一个关于实数的系统,塔斯基就已经证明欧氏几何系统是完备和自洽的。因此不要滥用哥德尔不完全定理。

   哥德尔不完全定理的确说了,对自然数这个领域来说,你不能从有限的几个公理出发推导出整个自然数论系统大厦。自然数的世界里永远有新东西等着你。

启示

  所有可数的系统都等价于自然数系统。那依照哥德尔不完全定理,一个可数的自己,是说明不了自己的。比如某些人迷信炒股宝典,总希望有一个方法,对照方法操作就能在股市上赚钱。宝典上说该做的你就做,不该做的你就不做。如果是哥德尔,他会说总有一些事情,是你的宝典里面没办法判断它对和错的。有时候你得跳出宝典之外,才能判断它对不对。

  哥德尔不完全定理给学术界开了脑洞。后来有人证明了一个类似的理论,说任何一个可以写下来的语言系统,总会有些语句,你用这个语言本身无法判断对和错,你必须跳出这个语言才能判断。也就是说,如果你的全部思考被限制在一种语言里,有些事情对你来说永远不知道怎么做决定。你得跳出这个语言才行,得有一些在这个语言之外的意思才行。

  从计算机的视角看,计算机系统本质上是一个可数的系统,符合哥德尔不完备定理的条件。依照哥德尔不完全定理,在这样的封闭系统内,总有一些语句是这个系统无法判断对错的。如果真实的世界是数字的,我们的大脑都是计算机,那迟早有一天,人类会对这个系统能想明白的全想明白了,剩下的都是永远不可能想明白的。从那天起,人类将浑浑噩噩的活着。

  如果真实的世界不是可数的,是实数,人脑不是计算机,那我们就有可能随时跳出任何能写成文字的认知系统,我们永远都有一个只可意会不可言传的思路。人类可以不断跳出旧系统,探索新知识,发明新语言,建立新系统,科学家可以永远琢磨新的物理定律,艺术家可以永远创造新意境,工程师永远可以发明新模型。

软件开发原则

发表于 2018-07-23 | 分类于 技术

前言

  我从事软件架构设计也有一些年了,以前在学校学习设计模式,当时学习只是当做一门技能,没有实际应用很难体会设计模式带给软件开发的真正好处。GoF传说中的四位大神搞出了23种经典的设计模式,我在实际工作中用到了其中一些,现在回过头来看这23种设计模式其实是遵循了一些原则,今天就聊聊这些原则。

正文

1. 单一职责原则(Single Responsibility Principle - SRP)

原文:There should never be more than one reason for a class to change.

译文:永远不应该有多于一个原因来改变某个类。

理解:对于一个类而言,应该仅有一个引起它变化的原因。说白了就是,不同的类具备不同的职责,各施其责。这就好比一个团队,大家分工协作,互不影响,各做各的事情。

应用:当我们做系统设计时,如果发现有一个类拥有了两种的职责,那就问自己一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分吧。千万不要让一个类干的事情太多!

2. 开放封闭原则(Open Closed Principle - OCP)

原文:Software entities like classes, modules and functions should be open for extension but closed for modifications.

译文:软件实体,如:类、模块与函数,对于扩展应该是开放的,但对于修改应该是封闭的。

理解:简言之,对扩展开放,对修改封闭。换句话说,可以去扩展类,但不要去修改类。

应用:当需求有改动,要修改代码了,此时要做的是,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能够确保对整体架构不会产生任何影响,那么也没必要搞得那么复杂了,直接改这个类吧。

3. 里氏替换原则(Liskov Substitution Principle - LSP)

原文:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

译文:使用基类的指针或引用的函数,必须是在不知情的情况下,能够使用派生类的对象。

理解:父类能够替换子类,但子类不一定能替换父类。也就是说,在代码中可以将父类全部替换为子类,程序不会报错,也不会在运行时出现任何异常,但反过来却不一定成立。

应用:在继承类时,务必重写(Override)父类中所有的方法,尤其需要注意父类的 protected 方法(它们往往是让你重写的),子类尽量不要暴露自己的 public 方法供外界调用。

4. 最少知识原则(Least Knowledge Principle - LKP)

原文:Only talk to you immediate friends.

译文:只与你最直接的朋友交流。

理解:尽量减少对象之间的交互,从而减小类之间的耦合。简言之,一定要做到:低耦合,高内聚。

应用:在做系统设计时,不要让一个类依赖于太多的其他类,需尽量减小依赖关系,否则,您死都不知道自己怎么死的。

5. 接口隔离原则(Interface Segregation Principle - ISP)

原文:The dependency of one class to another one should depend on the smallest possible interface.

译文:一个类与另一个类之间的依赖性,应该依赖于尽可能小的接口。

理解:不要对外暴露没有实际意义的接口。也就是说,接口是给别人调用的,那就不要去为难别人了,尽可能保证接口的实用性吧。她好,我也好。

应用:当需要对外暴露接口时,需要再三斟酌,如果真的没有必要对外提供的,就删了吧。一旦提供了,就意味着,将来要多做一件事情,何苦要给自己找事做呢。

6. 依赖倒置原则(Dependence Inversion Principle - DIP)

原文:High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.

译文:高层模块不应该依赖于低层模块,它们应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

理解:应该面向接口编程,不应该面向实现类编程。面向实现类编程,相当于就是论事,那是正向依赖(正常人思维);面向接口编程,相当于通过事物表象来看本质,那是反向依赖,即依赖倒置(程序员思维)。

应用:并不是说,所有的类都要有一个对应的接口,而是说,如果有接口,那就尽量使用接口来编程吧。

结束语

  将以上六大原则的英文首字母拼在一起就是 SOLID(稳定的),所以也称之为 SOLID 原则。只有满足了这六大原则,才能设计出稳定的软件架构!但它们毕竟只是原则,只是四人帮给我们的建议,有些时候我们还是要学会灵活应变,千万不要生搬硬套,否则只会把简单问题复杂化,切记!
  除了以上一些原则,实际上还有其它一些原则:

1. 组合/聚合复用原则(Composition/Aggregation Reuse Principle - CARP)

  当要扩展类的功能时,优先考虑使用组合,而不是继承。这条原则在 23 种经典设计模式中频繁使用,如:代理模式、装饰模式、适配器模式等。可见江湖地位非常之高!

2. 无环依赖原则(Acyclic Dependencies Principle - ADP)

  当 A 模块依赖于 B 模块,B 模块依赖于 C 模块,C 依赖于 A 模块,此时将出现循环依赖。在设计中应该避免这个问题,可通过引入“中介者模式”解决该问题。

3. 共同封装原则(Common Closure Principle - CCP)

  应该将易变的类放在同一个包里,将变化隔离出来。该原则是“开放-封闭原则”的延生。

4. 共同重用原则(Common Reuse Principle - CRP)

  如果重用了包中的一个类,那么也就相当于重用了包中的所有类,我们要尽可能减小包的大小。

5. 好莱坞原则(Hollywood Principle - HP)

  好莱坞明星的经纪人一般都很忙,他们不想被打扰,往往会说:Don’t call me, I’ll call you. 翻译为:不要联系我,我会联系你。对应于软件设计而言,最著名的就是“控制反转”(或称为“依赖注入”),我们不需要在代码中主动的创建对象,而是由容器帮我们来创建并管理这些对象。

6. 不要重复你自己(Don’t repeat yourself - DRY)

  不要让重复的代码到处都是,要让它们足够的重用,所以要尽可能地封装。

7. 保持它简单与傻瓜(Keep it simple and stupid - KISS)

  不要让系统变得复杂,界面简洁,功能实用,操作方便,要让它足够的简单,足够的傻瓜。

8. 高内聚与低耦合(High Cohesion and Low Coupling - HCLC)

  模块内部需要做到内聚度高,模块之间需要做到耦合度低。

9. 惯例优于配置(Convention over Configuration - COC)

  尽量让惯例来减少配置,这样才能提高开发效率,尽量做到“零配置”。很多开发框架都是这样做的。

10. 命令查询分离(Command Query Separation - CQS)

  在定义接口时,要做到哪些是命令,哪些是查询,要将它们分离,而不要揉到一起。

11. 关注点分离(Separation of Concerns - SOC)

  将一个复杂的问题分离为多个简单的问题,然后逐个解决这些简单的问题,那么这个复杂的问题就解决了。难就难在如何进行分离。

12. 契约式设计(Design by Contract - DBC)

  模块或系统之间的交互,都是基于契约(接口或抽象)的,而不要依赖于具体实现。该原则建议我们要面向契约编程。

13. 你不需要它(You aren’t gonna need it - YAGNI)

  不要一开始就把系统设计得非常复杂,不要陷入“过度设计”的深渊。应该让系统足够的简单,而却又不失扩展性,这是其中的难点。

科学、宗教和信仰

发表于 2018-07-21 | 分类于 杂说

前言

  昨天下班和一拨同事吃了顿散伙饭,席间聊到了以前携程一个同事出家了,我虽然学佛久矣,但是极不赞成在没有安排好家人后代后半生物质生活时,男人抛家舍业去求心灵解脱修佛。今天我就借着这次契机,聊聊科学宗教信仰这个话题。

正文

  大体上人类思想经历了主要三个阶段:神学,哲学,科学阶段。这三个阶段我个人看法:人类的理性主观能动性到达极致的就是哲学,神学阶段是人类把生存危机的思考交给神,自己保留一份对大自然未知的敬畏,科学阶段则是对人类精神宁静的极大破坏。关于科学我极其赞成王东岳老师的看法,科学不是真理,它是人类生存能力弱化的代偿现象,科学只有工具性,没有真理性。但是国内的科普读物好像有点科学宗教主义了,人要相信科学,把科学当真理。

  宗教来自于古人对世界的解读,在科学和知识不完备的时候,古人先哲们试图解释世界的缘由,并为苦难的人生带来慰藉,从某种意义来说,宗教本身就有安抚情绪和治疗抑郁的功效,从古至今,很多人在尘世中走投无路,或者感到疲惫和厌倦的时候,往往会选择宗教作为最后的情感庇护。

  当然科学与宗教也并不一直是对立的,实际上相当多科学家,特别是国外的科学家,相当高的比例是虔诚的教徒。那么我的理解是,这个世界有太多无法解释的事情,有太多科学无法覆盖的领域,我觉得,能让科学解释的,用科学来解读,暂时无法用科学解释的,求助于宗教,也无可厚非,毕竟宗教本身也是无法证伪的,但科学找到正确解读后,还是应该相信工具性的科学。

  现在有些国内的科学家也开始信奉宗教,我觉得信仰自由其实也可以宽容一些,信仰宗教与科学研究真的可以不冲突,但因宗教而拒绝科学,否定科学,是非常糟糕的。

  很多西方人觉得没有宗教信仰是很可怕的事情,这和我们的思维完全不同,很多西方人认为无信仰者是不可以信任的,我不点评孰是孰非,但从他们的思考方式来说,没有信仰可能也就意味着缺乏敬畏,缺乏对行为的约束。我们古人说,头上三尺有神明;人在做,天在看;

  宗教是一种信仰,但信仰不只是宗教,有坚定的信仰,可能意志力和精神力就会强大一点,而行为方式也会有所约束。

  我觉得不信宗教没事,但是人应该有信仰。我曾经以为正常人都应该有最基本的行为底线和价值观认知,但这些年越来越觉得人性之恶,瞠目结舌。某些台上冠冕堂皇的成功商人和创业新贵,为了一己之私,真的是可以谎话连篇,真的是可以随意的出卖信用,真的是可以伤害无辜的人而毫无顾忌。以前某些人还都不显山不露水,躲在角落里偷偷搞搞黑产,开开赌场,卖点仿冒商品,或者微信上洗洗稿什么的,最近这两年一窝蜂扎到币圈来了。一些曾经还挺在意形象和口碑的大佬们也疯狂了,连吃相都不顾了。

结束语

  世界和社会有很多糟糕的地方,有很多糟糕的人,有很多糟糕的事情,有些东西会冲击你的价值观和信仰,要直面这样的事情,必要时甚至要学会委屈求全,但心底要保留光明的一面,留住自己的底线,维系自己的信用。要入世修行,行雷霆手段,施菩萨心肠。
  心存善良,但不能说无节制的容忍和妥协,要有斩妖除魔的决心,才能拯救善良和无辜的人。对坏人善良,就是对好人造恶。
  孔子曰:以德报怨,何以报德,以直报怨,以德报德。

网关系统

发表于 2018-07-16 | 分类于 技术

前言

  过去一年多时间,我负责公司目前三套网关(无线网关、H5网关、第三方网关)的架构研发工作。参考Netflix开源的zuul定制化了一套基于异步servlet机制的网关系统,经过一年多线上流量冲击的考验,目前这套机制运行比较稳定可靠。今天从个人角度聊聊对网关的理解,以及实践过程中所遇到的一些问题和解决方案。

正文

  在开始之前,先了解一下下面两个问题:

什么是服务网关?

服务网关 = 路由转发 + 过滤器

1、路由转发:接收一切外界请求,转发到后端的微服务上去;

2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

为什么需要服务网关?

上述所说的横切功能(以权限校验为例)可以写在三个位置:

1、每个服务自己实现一遍
2、写到一个公共的服务中,然后其他所有服务都依赖这个服务
3、写到服务网关的前置过滤器中,所有请求过来进行权限校验
  显然第一种方式太过臃肿,并不符合工程化的架构理念。第二种相较于第一种就好很多,代码开发不会冗余,但是有两个缺点。由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好;由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。
  而服务网关恰好可以解决这样的问题。将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小;如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务。
  当然上面只是从横切面一个方面谈到了需要网关的必要性,实际上网关要做的事情远不止这一个,一个典型的网关系统必须包含以下几个基本功能:
智能路由:服务发现和路由寻址,将外部请求转发到后端服务。
权限校验:检验外部访问的合法性。
API监控:可以监控后端服务的一些性能指标和业务指标,比如响应时间,调用次数,出错比例等等。对异常服务提前做一些告警处理,比如熔断机制。
限流容错:与监控配合,进行限流和容错操作,保护后端服务不会受到异常飙升的流量崩溃。
A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,可以实现分流引擎。
  随着微服务成为业界互联网的趋势,网关已经成为重要的基础设施,它可以做到不将服务直接暴露给外部访问,屏蔽了一些安全和服务升级发布所带来的风险,这些也都是网关比较关键的核心功能。

网关整体架构

  开源的zuul网关采用的是同步servlet机制,我们采用的是异步servlet机制,这种方式可以提高网关响应的请求数。这套机制在携程也运行良好,我们只不过是直接拿来,结合Cat做了一些监控告警定制,替换现有的.Net网关,比.Net网关多了熔断监控告警,而且zuul采用groovy脚本处理相关逻辑,可以做到动态修改和热部署,将变更风险降到了最低。架构图如下所示:

  整个架构还是比较清晰,流量从外网过来先经过软负载nginx,然后转发到网关集群,网关再根据一定的路由规则将流量转到特定的服务上。网关会对接配置中心,管理路由服务的动态配置信息,比如超时、并发量,连接池大小等相关信息,还会对接elk,把一些出错请求的header头写入日志系统,方便故障定位。

存在的问题

  这套网关系统现在线上也还是这样,没有出现重大问题。问题主要集中在测试和日常维护中,可以说占据了大量的精力,这些事情做了不算功劳,但是不做又会影响测试体验,经常会收到一些抱怨。

1、安装部署
  目前我们将网关代码的打成一个war包部署在tomcat中,如果tomcat的版本不一致会带来jar冲突。前期没有考虑到会有多套网关问题,默认将脚本放在指定目录,如果安装多套网关会有脚本冲突问题,而且由于linux和Windows的目录规则还不一样,导致每次部署都要修改配置文件中的目录配置。实际上测试人员并不关心这些问题,他们需要的是网关服务。加上还要制定一些环境参数,比如网关名称,远程配置url地址等等。这些都会给测试人员带来麻烦。

2、配置问题
  配置问题主要是两类配置:一个路由配置,一个是参数配置。路由配置主要是新服务上线,需要通过网关对外提供访问,根据路由规则配置路线信息,比如是否需要验证token或者验签。参数配置主要是配置一些连接池,并发超时等相关信息。两类配置会极大消耗网关维护人员的精力。而且这些配置还不能开放给测试人员,需要对网关机制有比较深入的了解。

3、测试问题
  这类问题是比较多也比较头痛的。先看下面一张图的场景:

  网关定期拉取esb的路由配置信息实现服务发现,网关到后端的调用是通过域名的方式访问。由于只有生产环境做了域名解析,开发测试本地联调时会配置本地host,而且host配置还比较多,必须配置所有访问的域名host。如果两个测试人员都在测试,而且是测试同一个应用的不同版本,由于网关没有做版本路由,所以测试人员还不能使用同一个网关来测试,必须每个测试都搭建自己的网关,这样大家就可以独立的修改自己本地host,互不影响。这种host配置方式还会带来另一个问题,就是一旦服务地址发生变更迁移,还必须通知到所有的用户修改host配置。

解决方案

  下图可以看出,我们整个架构理念是基于网关为中心架构的,而且配置比较分散。网关维护人员要操作三个系统,在esb系统中配置路由信息,在apollo中配置超时并发信息,在filter过滤器系统中修改过滤器状态。对网关维护者来说体验极差,定位问题必需具备一定的门槛。网关使用者很难有参与感,而且出了问题只能找网关开发者来定位问题。

  实际上刚开始来公司的时候,起初接到的任务是替换现有的.net网关,根本没有好好的设计。经过一年多的修改打磨,我提出了一个解决方案,请看下图:

  从上图中可知我们改变了以网关为中心的架构理念,变为以网关治理为中心的架构理念。将网关开发者和网关使用者平等对待,即使网关使用者不具备太多的网关上下文,也能通过治理中心解决以上所说的大部分问题。

以上架构的总体原则:
1、平台化(强调治理)
  首先是将网关集群化,不同的集群使用不同的路由表,各个路由表之间不相互干扰。对网关集群实行治理,目前网关有多少测试人员用,我们是不知道的,所以经常修改host要通知到人非常麻烦。通过对网关集群实行治理,我们可以很清楚知道目前有哪些网关,哪些网关集群,是哪些测试人员在使用。

2、服务化(强调控制)
  网关作为一种服务开放出去,避免重复造轮子。将配置路由信息也作为一种服务,开发测试可以直接操作治理中心实现日常的维护工作,这样可以极大的释放网关开发者的精力,不必为日常的一些维护耗费太多时间。

  以网关治理为中心架构以后,整体流程调整为如下:

  首先治理中心只有两类用户,一类是管理员,一类是普通用户。管理员相当于超级用户,他负责维护网关模板和管理所有的网关集群,享有一切操作权。只有网关模板在治理中心注册以后,普通用户才能申请集群下载代码,启动网关集群。
  对于聚合网关而言,可以通过接入注册中心,到时由同步协调器同步到kong内网网关,实现网关集群的动态扩容缩容。如果是开放平台网关,可能要通过f5配置域名解析等。

结束语

  目前参考开源的spring cloud zuul源码,我实现了一版基于异步servlet和groovy机制的简化版,使得网关不用在依赖tomcat,直接下载jar,指定启动参数启动即可。不仅解决了安装部署问题,也解决了日常维护配置工作,极大的提高app测试人员的测试效率,并提升了网关的使用体验。

战略思维

发表于 2018-07-14 | 分类于 杂说

  所谓战略,就是你决定做什么。战略是选择一个方向。战术就要低一级了,战术是方向已经确定了的情况下,你琢磨怎么做。攻略更低,是照着别人的经验把这事做下来。底层学习攻略,中层研究战术,高层选择战略。

  战略的本质是取舍。在你自己看来,战略是对命运的主动选择。在你手下的人看来,战略也是利益分配,就是你得根据公司的未来发展,把钱投到最有前途的方向上去。

  CEO 的最重要任务不是公司日常管理,而是战略。但是一般的CEO只有“内部视野”,平庸的公司,靠惯性运营。只听内部人怎么说,或者最多再盯着几个直接的竞争对手看的思维模式,叫做“内部视野”。内部视野带给公司的只有惯性。

  战略的关键是选择做什么。做什么不能以自己过去为参考,也不能以公司内部人的意见为参考,而应该是往外看。往外看,你就会发现外面真实的世界绝对不是一个稳态的运行,最应该做的就是把资源迅速投入到一个快速增长的领域中去,而不是均分资源。

  战略思维首先要往外看。当你往外看的时候,你发现世界上充满了不平等,平庸和成功的差距实在太大了。头部公司拿走了90%的利润;平庸公司的利润非常低;头部公司优势将来还可能还会进一步增大。选对了行业,你就选对了50%。所谓战略,就是你在利润分布图上是一个什么位置。真正的战略选择,就是决定你在利润争夺版图中的位置。

  收获从来都不是由付出决定的。做什么,比怎么做,比做得努力不努力重要的多。

  所谓战略意识就是时刻想想我是不是该调整发展方向。新趋势刚刚出来的时候,传统公司根本就感受不到任何影响;趋势清晰了,传统公司仍然傲慢,并不羡慕什么新行业;新模式已经被证明是更好的,转型要面临非常大的公司内部压力;旧模式已经不行了,转型已经来不及,直接退出是唯一的办法。

  好战略应该走极端。战略不是做动作,而是做大动作,CEO们经常低估了什么叫大。市场竞争就是这样,跟上队伍不算厉害甚至都不算动作,你只有领先才能叫大动作。

  做大动作是最安全,也是最有利的战略选择。并购、提高生产力和产品创新,都不但增加了公司在利润分布曲线上上行的概率,而且减少了下行概率。资源重组既增加了上行概率,也增加了下行概率,但是上行远远大于下行。资本支出使得上行和下行概率都增加了,而且幅度一样。

  从战略的角度考虑,集中力量的本质是有选择的投入,也可以说是有选择放弃。在这个方向上集中力量,就意味着在那个方向上要放弃力量。要点在于第一,必须要有选择和放弃;第二,战略目标都是跟别人比出来的,不是算你投入多少绝对资源。

  集中力量办大事的精髓就是选择一个战略方向,把有限的力量集中在这个方向上谋求突破。能选对方向,能调动资源,才叫有战略能力,否则四平八稳什么都做,那叫过日子。

  所谓战略就是选择方向,集中力量,做几件能让你在利益分配曲线上有一个更好位置的大事。

技术的悲哀

发表于 2018-07-07 | 分类于 杂说

  最近徐峥主演的一部电影《我不是药神》,还没有正式上映,就已经在朋友圈成为热门话题。我虽然还没有去电影院看,但是从网上也搜集了一些相关剧情方面的东西。其实我个人觉得电影题材很好,是难得的反映现实主义题材的好的国产电影。医药技术的进步本是人类的福音,却成为某些利益集团谋利的工具。今天我就聊聊技术相关的话题。

  以前听过很多大佬关于技术方面的演讲,比如京东老总就描绘过,未来技术进步以后,人只用工作2-3小时,其它的都给机器人来做,进入按需分配的共产主义社会并不遥远。总之这些大佬描绘的都是技术带给人类的都是美好。但是如果放大时间维度,人类从原始社会进入到现代社会,技术进步了多少,但是产生的社会问题一样不比以前的少。物质水平是进步很多,但是工作强度并没有因此减少,就是如此的工作强度,大部分都没有过上有尊严的生活。所以稍加推敲,技术并不能解决一切问题。

  在美国1978年发生过邮件炸弹事件,就是美国哈佛大学一个数学天才,有感于技术带给人的奴役,给一些理工科的教授寄去了16封邮件炸弹,炸死了不少知名的教授学者。这件事很有名,事件的主导者甚至还威胁纽约时报,如果全文刊登他的文章,他就停止邮件炸弹袭击。大家有兴趣可以去看看卡辛斯基的警告,里面从哲学的角度论述了技术带给人类的负面影响。

  目前全球的问题是阶层垄断,资源聚集,然后希望利用技术打破这种平衡,让人类变得更好,更和谐。任何一个人反抗垄断,权威,出发点都是朴素的,但是结果往往只是一个轮回游戏而已。技术从一千多年的历史来看,他并没有让社会变得更幸福,更美好,更和谐。从自杀率角度来看,反而提升更多。技术是解决不了人性的问题的,人不会因为技术而变得更加愿意付出,更加愿意珍惜,更加愿意宽容,却因为技术变得更容易盲从,贪婪,自私,他放大了人性恶的一面,更加激荡了人性。

  比如我现在身处P2P行业,相关这个金融科技的负面报道也看了不少。比如我们公司的口号就是金融触手可及,信用改变中国,实现普惠金融,但是实际不是这样。我就问公司创始人一个很简单的问题,让你愿意放弃全部家产,投身到这个技术革命去,然后技术实现了,世界和平,人类富裕,但是你自己却一点好处也没有,你晚上睡觉的时候摸摸你的良心,你愿意么?其实,支撑那么多人前赴后继往前走的根本性目的,并不一定是理想,而是赚到足够多的钱,或者说一定是赚钱基础上的商业理想,但是一个阶层赚钱越多,必然别的阶层赚钱越少。这本质上一定是个悖论,你改变不了。

  古人说过,民不患寡而患不公,也就是说如果社会很难实现所谓的公平正义,就很难会有所谓的幸福感。贫富分化差距的拉大,只会进一步降低幸福感,所以从这个角度来看,很多人都指望技术的发展来进一步限制贫富分化和差距的拉大,然后维护社会公正公平,本意都是好的。但是现实的结果就是我前面的结论所说的。

  因为技术的存在,使得底层人民的质量是抬高的,但是生活差距其实是在拉大的,而且还在不断拉大,因为新技术带给强者的机会是更多的,强者有更多的资源、权利、去使用好技术维护自己的权利。技术只是解决便利性的问题,他或许可以提高整体民众的生活质量,但是很难解决社会幸福感的问题,而幸福感的背后其实很大程度上是来自社会公平问题。

  我说技术带给人是负面的,并不是说技术本身是坏的。技术是中性的,中性的技术往往会被更有权利,或者是说更有钱的人使用,像打仗一样。有钱人可以买到更好的军火,用来灭掉没有钱的人,所以技术的结果是强者越强,弱者越弱,有一些技术可以用来维护社会公平和公正的时候,强者一定会把这个技术干掉,不让社会使用,为什么?

  因为社会一旦公平公正就意味着他所占有的权益会被损害,原来他可以赚80块钱,一公平就只能赚40块钱了,公平意味着强者的利益损失和弱者利益提升,两者慢慢靠近中心点就是公平。

  如果技术可以实现这个能力的话,有钱人会用这么好的技术来进行自我革命么,把自己给变得没钱么?换成你,你愿意么。现实的结果恰恰是相反的,许多有钱人反而利用技术更好的进行收割民众。

  当一个技术如果会对他们的地位构成了威胁,他们第一想到的不是发展这个技术,而是垄断和搞死这个技术,这个就是社会现实,好的技术如果真能解决社会公平问题,一定意味着没有有钱人会去支持这种技术,限制发展,扼杀发展,都是常用套路。

  在医疗领域其实是很明显的,其实有很多特效药的存在,但是他们都未被大规模普遍性应用,从而使得价格高昂的存在,甚至可能压根就没有投入市场,理由是还不完善,但是现实是真不完善么?对于一个面临绝症等死的人来说,还有什么可以不完善的么?不投放市场的原因就是因为很多药企的新药会对老药品的商业利润进行冲击,从而雪藏更好的新技术,直到老药品的利润被压榨倒极致在进行新药品的投放,这个也是为什么印度仿制特效药的空间的存在。

  还有大量国外已经普遍存在的特效药,为什么国内企业不列入药品清单,那也是因为既得利益者的存在,这些药品的进入对国内药企的冲击会很大。这个就是社会现实。你也很难指责他们,因为换成你,或许你也一样选择,当然更残酷的事实是如果你不这么选择,你可能压根就无法获得足够的利润去支持新药的研发,赚取更多的利润,有时候讲商业是最大的慈善,在宏观和微观,群体和个体之间是悖论的存在。

  过去五六年所谓新技术的使用背后都是阶层利益争夺的加剧。这是我对互联网提出的观点,互联网是什么,赢者通吃,基本上一家独大,金融是暴利,寡头垄断,暴利,也有是说两个合在一起的结果是赢者越来越暴利。

  人类社会走到今天,10%的人会变得越来越强,90%的人变得越来越弱,估计再走下去还会更极端,2%的人越来越强,98%的人越来越底层。

基于Mesos的容器调度系统

发表于 2018-07-02 | 分类于 技术

前言

  从去年下半年开始到今年上半年时间,我一直致力于容器云平台PaaS系统的建设。从概念设计到整体架构,我全程参与其中,期间经历过激烈的争吵讨论最终定型,上个月底已经上到生产环境接收第一个版本的流量冲击考验。
  当时纠结于是否直连和代理两种方式实现微服务之间的调用。走直连模式会带来客户端升级的问题,比如版本冲突和兼容,走代理模式会带来性能损耗,但是微服务之间调用的客户端实现可以非常轻量,同时也给代理网关层提出了非常苛刻的要求。当时领导想的很简单,采用zuul网关去做这层代理,我很快实现出来,还发现了netflix的ribbon客户端的一些bug。下图是领导设计的第一版架构图:

  上图采用zuul做内网网关,服务之间调用使用服务名+http协议通过zuul网关发起调用,网关层面去做服务发现和负载均衡,这样服务之间调用的客户端就会很轻量,这和当下的service mesh的理念也比较契合。但是这里面最核心的问题,zuul采用的同步调用,意味着一个请求会占用一个线程,在极端情况下会导致线程数爆增。再有就是这套东西很难和目前公司的esb相兼容,这样导致这个新体系只能接受新项目,老项目还不能嵌入到我们的发布体系中。可能老大也是考虑这个原因,参考携程的基于nginx的slb来替换内网zuul网关。其实早在携程我就研读过nginx的源码,对第一版slb的源码也很熟悉,到平安以后研究过点评的slb方案camel源码。客观评价,携程slb源码的代码质量和组织架构不敢恭维,相对而言camel更优秀一些。其实私底下,我和团队成员说了,完全可以参考camel定制我们自己的slb。后来确实携程slb的代码没法进行下去,这么重要的东西,必须完全掌握才行,而且领导的这版本只是发包,还不是发的docker镜像。
  后期架构就演变成nginx做内网网关,在nginx层上做负载均衡,流量切换和服务治理,发布系统改成基于mesos的调度方式,相对于上图,架构变化很大。我们加班加点确实做完了,代码质量确实不错,临到快要上线的时候,领导想法又变了,slb废弃掉,采用直连的模式。然后我跟领导说,我来重新设计整个体系,其实我是去携程交流以后有的一个大概想法,下面是我设计的架构图:

  可以从图中看到,虽然是直连,我还是把slb放到架构里面了,当时的一个想法是想和目前的esb体系兼容,这样用新框架的服务也能被老的服务调用,因为服务总得要有一个域名,不然这个新的服务框架很难被用起来。新服务之间的调用是很省事,通过服务名就可以了,然后服务框架提供客户端。其实我当时设计还有另一层考虑,我是负责无线网关和H5网关的,如果有域名,这样无线网关就能直接复用老的方式,不用从新做调整。而且前面也讨论过,直连和走代理的方式,直连还是存在一些问题,要不然service mesh现在也不会这么有市场。所以我的方案是取了个折中,直连和代理都走的通,方便后期切换,而且兄弟们开发了这么久的slb,好歹劳动成果不能浪费。源码我也看了还是比较靠谱,由于前期争论过多,小组成员还有点小矛盾了。后面和领导争取了,不知道他是故意的还是我没有表达清楚,把我的方案直接给否定了。下面是领导给的第二份架构:

  从上图中可以看到没有代理层了,服务之间调用是直连模式。如果是一家从零开始的公司,这套方案到没什么,但是彻底断绝了和现有服务框架兼容的可能性。新服务调用老的esb服务麻烦,老的服务调用新的框架服务也麻烦,更严重的是直连会带来治理的困难。我原先是做过分布式缓存,对客户端版本升级有过切肤之痛。好吧,领导说这么办就这么办,我虽然做的是容器调度,但是对微服务rpc框架也很有兴趣,以前也看过dubbo和motan的源码,我自己也按照这套方式写了一个RPC框架finix,有兴趣的可以看看代码。基于这种直连方式,我设计的发布流程如下:

  这段插曲还没完,做到年底快上线的时候,领导想法又变了,说直连不好要换代理模式。哥还是太单纯,和领导顶撞了一下,不是当面顶撞,只是在企业微信群里面就事论事,我说一个方案好不好不是我们闭门造车想一出是一出,应该先定一个设计目标,实现方式有很多种,如果是不确定,那能不能搞一个折中方案,方便切换。我知道变化是很正常的事情,但是都快上线了,中间实现的期间怎么没提出,快上线了提出,不是一次两次了。团队其它想做成事的人估计也有想法,只是经验老道不说,有的是老江湖了就迎合,其实我也是现在想通的。我原先在平安也和产品撕过逼,产品经理上周需求方案是一种,晚上回去我想实现,下周来上班发现需求全部变了,我是经历过这种情况的。但是中间件需求相对来说还是比较集中,这么来回的变就失去原则了。
  好吧,经过数次的交锋,最终在集体智慧的努力下定型最终版本,连发布模型也变了,架构设计图如下:

  从上图中可以看出代理层从slb换成kong了,之所以换是因为nginx是单机版本的,不是集群版本,每次变更都得更新所有机器的配置文件。实现比较复杂,而且一致性还不一定能保证很好,而kong的配置采用的是数据库存储,天生就支持集群,而且kong从0.11版本以后,变成无状态的了,扩容缩容相当方便,并提供了插件机制可以方便做一些扩展。这块目前是我负责的,也没有做太多的改动,首先是把数据库替换了,换成了mysql,然后就是定制了一个kong的界面管理系统和同步协调器,同步注册中心的一些配置,比如域名集群和IP等信息,相对来说我定制的管理界面是直接操作数据库的,在事务性方面比开源产品直接调用kong admin api的要可靠很多。所以整个的发布流程就是如下的:

  首先用户参考我们提供的demo工程,在自己的项目工程pom文件中添加相应maven插件配置,执行相关命令把镜像推送到镜像治理中心。第二步,就是到我们的资产管理中心atlas去申请资源配额,资源配额是按照部门申请的,如果已经申请了就不用再申请,当然如果配额不够了可以申请扩容,这样既能保证资源治理比较合理,也能减少用户操作步骤。第三步,用户可以使用发布系统发布相应的镜像,在发布镜像之前,用户必须选择发布的规格,需要多少CPU和内存,发布系统会去altas去检查是否有剩余配额可以使用,如果不够就提示用户申请扩容,如果可以就进入第五步调用galaxy的api发布容器实例。到了第六步,galaxy通过向mesos发起调度task,这时mesos的执行器启动docker容器,docker engine会拉取镜像。docker镜像启动以后,会将appid,appname,cluster,ip等相关信息注册到radar注册中心。最终这些信息在第九步的时候同步到kong网关。发布系统可以根据发布类型,比如蓝绿部署,金丝雀部署修改注册中心的状态。

  以上就是过去一年多经历的架构演进,走到今天相当不容易。我目前是负责基于mesos的容器调度系统,下面我就重点介绍这块内容。

正文

  其实在做这个之前,我是毫无头绪的,以前做一个单一系统对我来说不是太难,一旦涉及到跨系统交互,确实有点难为我了。期间我调研了kubernetes,marathon,singularity等相关的东西,也看了docker和虚拟网络相关的东西。kubernetes对我们来说是黑盒子,而且整体架构又复杂,通过和饿了么的同事交流,kubernete他们试下来并不太稳定,所以最终我们决定是上mesos。基于mesos的容器调度,在携程和饿了么都已经经过生产级验证,稳定性和可靠性方面还是比较有保证。
  我实现的基于mesos的容器调度系统主要是参考的singularity,因为singularity使用的是java开发的,不像marathon是scala开发的,只不过singularity搞的过于复杂,而且数据和状态全部存储在zookeeper里面,我自己正常测试和非正常测试下来,不太稳定,如果是zookeeper的数据模型被破坏,就有可能造成不可用,还有可能造成cpu和内存泄露。所以我只是参考它的源码,采用springboot+mysql的方式来重新定制调度逻辑,到现在为止,已经迭代了三个版本。

Mesos原理

  在介绍调度系统之前,有必要先了解一下mesos的整体架构原理。同其他大部分分布式系统一样,Apache Mesos为了简化设计,也是采用了master/slave结构,为了解决master单点故障,将master做得尽可能地轻量级,其上面所有的元数据可以通过各个slave重新注册而进行重构,故很容易通过zookeeper解决该单点故障问题。其官网给出的架构如下图所示:

  从图中可知Apache Mesos由四个组件组成,分别是Mesos-master,mesos-slave,framework和executor。
(1) Mesos-master:整个系统的核心,负责管理接入mesos的各个framework和slave,并将slave上的资源按照某种策略分配给framework。
(2) Mesos-slave:负责接收并执行来自mesos-master的命令、管理节点上的mesos-task,并为各个task分配资源。mesos-slave将自己的资源量发送给mesos-master,由mesos-master中的Allocator模块决定将资源分配给哪个framework,当前考虑的资源有CPU和内存两种,也就是说,mesos-slave会将CPU个数和内存量发送给mesos-master,而用户提交作业时,需要指定每个任务需要的CPU个数和内存量,这样,当任务运行时,mesos-slave会将任务放到包含固定资源的linux container中运行,以达到资源隔离的效果。
(3) Framework:是指外部的计算框架,如Hadoop,Mesos等,这些计算框架可通过注册的方式接入mesos,以便mesos进行统一管理和资源分配。Mesos要求可接入的框架必须有一个调度器模块,该调度器负责框架内部的任务调度。当一个framework想要接入mesos时,需要修改自己的调度器,以便向mesos注册,并获取mesos分配给自己的资源, 这样再由自己的调度器将这些资源分配给框架中的任务,也就是说,整个mesos系统采用了双层调度框架:第一层,由mesos将资源分配给框架;第二层,框架自己的调度器将资源分配给自己内部的任务。
(4) Executor:主要用于启动框架内部的task。由于不同的框架,启动task的接口或者方式不同,当一个新的框架要接入mesos时,需要编写一个executor,告诉mesos如何启动该框架中的task。当然也可以用mesos默认的执行器。

  我实现的容器调度系统galaxy,就相当于是实现一个mesos的framework,负责接受来自mesos-master的资源,根据实际需要决定是否启动容器。整个过程如下图所示:

  第一步,调度器通过实现resourceOffers接口,接受来自mesos-master的空闲offer(包含目前空闲的cpu内存磁盘),第二步,调度器根据一定规则匹配,是否满足需求,如果满足就调用lanchTasks向mesos-master发起调用进入第三步,否则就直接拒绝offer。第三步,mesos-master向mesos-slave发指令启动task,这时mesos-slave收到指令后,开始向executor发起task调用,或是启动容器,或是启动jar包。启动完成之后,进入第四步,执行器会将task的状态上报给mesos-slave,mesos-slave再上报给mesos-master,最终由mesos-master告知调度器task的最终状态。注意mesos不保证消息的可靠性,也就是说有可能会丢失消息,但是mesos提供了确认机制,可以基于增量和全量的同步,这样保证了状态的最终一致性。

容器调度系统Galaxy

功能设计

1、支持JOB、Service、Worker、One-Off
  支持定时任务,也支持瞬时任务,同时也支持长期运行任务,service和worker都是长期任务,区别在于service要接入负载均衡,worker是后台进程不对外提供服务,也就是不用接入负载均衡。
2、支持发布镜像和jar包
  支持两种方式,不仅能启动docker容器,也能直接启动springboot的jar包。
3、动态伸缩容器实例
  能直接在线扩容缩容docker实例。
4、销毁容器
  销毁容器实例。
5、IP资源池管理
  由于我们生产目前采用的是macvlan的网络模型,所以为了解决ip冲突问题,添加了ip资源池的管理。我们不仅支持host,还支持bridge网络模式。
6、故障转移
  故障转移就是当有容器实例挂掉以后,能自动的重启相应容器实例。
7、日志审计
  我们提供了后台管理界面,提供日志审计方便日后的维护工作。
8、故障告警
  当有容器或者机器挂掉以后,必需给出相应告警。
9、集群管理
  我们对物理主机进行了逻辑隔离划分,能管理集群和机器的上下线,当然这部分目前没有使用。

整体调度逻辑

  虽然整个调度逻辑不复杂,但是刚开始比较匆忙没有设计好,在实际开发测试过程中,经常因为状态不一致导致拆了东墙补西墙,而且前面两个版本对数据库冲击比较大,到目前第三个版本已经比较稳定了,各个模块之间都解耦了。调度逻辑如下图所示:

  首先是用户通过api或者界面添加相应的Deploy,我们定义一次发布单元叫Deploy,添加完Deploy之后,就等待mesos框架的调用,这时galaxy会根据一定规则先搜索Deploy库,找出active状态的Deploy,然后和mesos传过来的offer匹配,如果匹配上了就发起调用,否则拒绝offer。当发起完调用之后,galaxy就要等着更新task的状态,只有一个Deploy的所有task都启动完了,这个Deploy才算完成了调度,否则就算超时或失败。这里面涉及到几个状态的更新,还有事务。

Galaxy界面

  目前处于最小可用版本,优先保证稳定性。整个操作简单易用,界面风格如下:

  用户可以在主界面查看现有的Deploy列表和状态,也能激活和停止Deploy,还能扩容缩容Deploy。如果要添加Deploy,可以通过以下界面:

  用户填好相关内容,选择启动的类型,jar包或者image,然后指定相应的网络模型,如果是bridge还要指定相应的端口映射。其它还有一些相关操作就不做具体介绍了,有兴趣的朋友可以留言给我。

Galaxy API

  除了使用界面添加Deploy,我们也可以通过API来发起调用。以下是添加Deploy的API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
POST /api/deploy
{
"appId": "string",
"appName": "string",
"appType": "string",
"cmd": "string",
"cpus": 0,
"disk": 0,
"dockerParametes": {},
"envMap": {},
"forcePullImage": true,
"instances": 0,
"keepAlive": true,
"memory": 0,
"networkType": "string",
"packageId": "string",
"packageType": "string",
"packageUri": "string",
"portMappings": [
{
"containerPort": 0,
"hostPortIndex": 0,
"protocol": "string"
}
],
"ports": 0,
"privileged": true,
"tag": "string",
"volumes": [
{
"containerPath": "string",
"hostPath": "string",
"mode": "string"
}
]
}

  相关其它API还有很多,可以通过swagger ui查看,下图是通过swagger界面查看的相关Deploy的全部API:

容器监控

  容器监控有很多方案,我们采用的telegraf+grafana+karisdb做的,我也调研了Prometheus的相关方案。目前监控界面如下:

结束语

  Galaxy容器调度系统就介绍到这,从事情经过的来龙去脉到原理架构,以及Galaxy的相关设计,整体脉络我是介绍清楚了,里面的一些细节就不做过多阐述了。去年大半年的时间都在做这些事情,虽然是工作以来最累的,但是收获确实很大。不仅仅是扩展了技术视野和相关技能,也扩展了跨系统解耦相关的一些经验,如何确定系统边界,如何系统交互更好,第一次体会到这种挑战。同时也积累了一些问题,主要管理方面的问题,都强调领导力,其实有时候还真得靠原则强压,领导指望下面的人跳出来,下面的人又一个比一个牛逼,这个时候就需要领导协调,因为只有你看得更远,这样争论来争论去,中国人难免会有小疙瘩。我是见过了见怪不怪,后面发现太浪费时间了,我也就只有私下建议,不在争论了,因为有些事情不一定非得那样走不可,而有些人自己不承担责任非要别人按照他的意愿走。通过经历这些事情也识别了一些比较靠谱的同事,也识别了一些人不坏但是不切实际的同事,为以后转管理方向积累了不少经验值。

有关学习的看法

发表于 2018-06-29 | 分类于 杂说

  最近看了吴军老师有关教育与命运关系的博文,说实话看完以后内心不免刺痛,但是确实现实就是如此。都说人人生而平等,那只是法律意义上的,每个人出生就面临不平等,有的人努力20%就可能比有的人努力100%获得的效果大,连付出与回报都是不平等的。有时候确实令人沮丧,以至于有读书无用论出现。但是不管怎样不应该成为放弃教育和读书的理由,某种程度上教育和读书应该是每个人终生的习惯。不可过分拔高教育,也不可过分轻视教育,其实每个人的命运从出生就已经注定,教育只是加速和减速这一过程的实现。你可能觉得我有点宿命论,其实不是,我是看了了凡四训以后改变了这个看法,吴军老师的真知灼见在我看来并不圆满,当然限于我目前阅历不够,这个话题我还没法聊。我今天只想聊聊学习的一点看法,我觉得教育最重要的是教人学习,能自我教育,我们在学校受教育时间是很短的,大部分时间得靠自己学习获得认知。
  关于学习,我们从小听过头悬梁锥刺股的典故,好像只要把时间花在读书上就行了。因此我们对学习的概念就是除了睡觉,其它时间就应该看书学习,死记硬背。可是高中这套方法下来,我并没有收到良好的效果,学没学好,玩没玩好。我是到大学考研阶段开始怀疑这个认知观念并获得了好处。背英语四六级单词词汇时,是一个北大老师教给我的方法,我不再和自己作对,按照他的方法真的很轻松记住了(当然这是对比以前,其实也不轻松的,看来人有时受点挫折是好处)。不会有以前那种痛苦的经历,只求一时一劳永逸解决问题,但是往往花很大精力当时记住过后忘记了,常常导致自己很自责怎么自己这么笨。
  以上这些都是我以前学校教育时的挫败感,也不能太怪我自己和我以前的老师。当然以前的老师可能很负责,但是只会教书本知识,只是考虑自己的绩效,表面上对学生很严很好,其实不负责任。这也是农村教育和城市教育的差别,城里的老师不仅教知识,还教应试技能和学习方法,甚至还研究出题套路,导致城里学生在学习上在做乘法,农村学生在做加法,只能是城市和农村教育差距越来越大,现在的北大清华农村生源占比很小也就不足为怪了。
  现在有一个流行的学习风格分类模型叫 VARK,你可以到它的官方网站测试一下自己喜欢的学习风格。VARK 把学习风格一共分成四种:视觉、听觉、读写和动手实践。如果你是视觉型的,你可能喜欢用看图片的方式学习;听觉型的可能更愿意听老师讲;读写型的人爱用读书和记笔记的方法;动手实践型的人最爱做实验和演示。测试结果是学生们的确有不同的类型,还有的学生是混合型。
  以前关于学习风格的研究主要是针对课堂教学,比如说如果学生喜欢视觉化的教学,就专门给他视觉化的教育,已经证明这种方法并没有什么好效果。现在网络教育越来越普及,很多时候是学生在家里自学,课堂教学可能不像以前那么重要了。那就自学来说,跟学生喜好匹配的学习方法有没有好处呢?答案……还是没好处。看来“享受”,不等于就能学得更好。研究还发现,特别是有一些很多学生都喜欢的方法,恰恰是对谁都没好处。
  那到底有什么方法是有效的呢?心理学家几十年的研究结果,真正有效的方法对每个人都有效,不管你喜不喜欢都有效。
总结来说,有效的方法是这样的 ——
第一,对于一定的内容,你要在学习时间上安排一定的间隔,不要突击学习。这个间隔学习法的原理是人脑的“记忆曲线”。隔一段时间回想前面学过的,然后再学新的,这个方法最有利于记忆。暂时忘记是为了更好的记住。
第二,你可以在不同的场景下、用不同的方式学习同一个内容。
第三,你要经常参加测验,看看自己是不是真的掌握了相关的知识。
第四,你要把新学到的知识和以前的知识建立连接。
  工作这些年,我发现身边优秀的同事学习模式基本都相识,学习不好的同学各有各的学习方法。有时候学习你得刻意练习,刻意练习同一动作,意味着你不断的在犯错,不断的在沮丧,你要不停地重复这个过程,直到真正学会为止,所以任何进步都是一个艰难的过程。从来没有任何一位先贤说应该寓教于乐。教育哲学家从来都认为获得知识是一件困难的事情,学习是要付出代价的,耐力和汗水不可少。教育的目的,本来应该是摆脱现实的奴役!要想获得出色的思辨能力,对年轻人来说绝非易事,这是异常艰苦卓绝的斗争。
  学习是一场斗争。这个知识你不懂,这个技能你不会,这个现实你改变不了,那你怎么办?你得斗争啊!寓教于乐不是最有效的学习方法。你喜欢愉快的学习过程,但你更喜欢获得真知。管用的方法不好玩,只有付出了努力和汗水,有过挣扎和斗争,你才能真正掌握知识。纪录片吸引观众的唯一办法是讲故事,用讲故事取代说理,用动之以情取代晓之以理。看完故事你得到了精神上的享受,觉得很愉悦,你能记住一件新鲜事儿 —— 但这跟真正的掌握是两码事。

佛学浅谈

发表于 2018-06-29 | 分类于 佛学

前言

  我和佛教结缘是小时候在外婆的熏染下接触到的,真正对佛教有认识和研究的时候是大学期间,为佛祖当年达到的思境之华丽和思维之缜密而震撼。释迦牟尼是人类历史上至今为止最伟大的思想家,没有之一。什么叫思想家?我们经常乱用这个词,所谓思想家应该是将世界归零重新解构世界的人才能成为思想家,举个例子,比如牛顿的万有引力定律,牛顿以前的人认为运动是需要力的,静止是不需要力的,但是牛顿的看法正好相反,认为运动是不需要力的,静止才需要力,普通人之所以认为运行需要力,是因为我们在力的杂项中考虑,根本无法解构力的本源,没有把摩擦力这个变量加入参考,牛顿既然认为运动不需要力,那他就继续追问,最初做惯性运动的那把力是谁推动的,他认为是神是上帝,虽然他找错了,这足以证明牛顿是一个思想家而不是物理学家。按照这个标准人类历史上能称为思想家的不过十几人而已,而释迦牟尼就是其中最伟大的思想家,释迦牟尼将世界归零归到大空境,在大空境的基础上解构世界。

正文

  佛教起源于印度,上个世纪考古学家在印度发现了距今约四千年前的印度土著文明—哈拉巴文明,有用泥土烧制的砖构建的显然经过统一规划的城镇,而且在这个出土遗址里面发现了规模宏大的地下给排水系统,以至于有学者认为罗马帝国在古罗马城修建的地下给排水系统就来源于这个哈拉巴文明,但是这个文明在公元前1500年突然消失,而且这个地方连人种都被替换了,现在的印度人是雅利安人,和西方人是一个人种,印度的语言梵语都是印欧语系。佛教在产生以前,印度就已经有了吠陀文化,吠陀文化包括5大内容,第一是内明(问内心问灵魂的宗教内向探求,表达为婆罗门教),第二是声明(语音相关的体系),第三是因明(逻辑体系),第四是工匠明(工匠技术体系),第五是医方明(医学体系)。吠陀文化的5大部分,前三项是西方环地中海文明所具备的,东方中国文明不具备,中国文明只具备后两项。从思绪上看,印度文明兼具东西方文明共同的特色。印度文明现在的种姓制度,表达的是印度土著逐步被雅利安人取代,对先后取代者划分的四个等级,这个也从侧面说明印度这块地方不仅人口资源关系紧张,人际关系过于扰攘,还面临外族入侵的双重苦难,就其苦难性和压抑性,比中国农业文明更严重更消极。

  佛教在东汉中期传入中国,之所以能在中国发扬光大形成和儒释道三家三足鼎立的局面(以至于现在讲国学,如果不懂佛学,那他肯定讲不明白国学)除了佛学思想华丽和思维缜密外,还必须具备和中国文明冲突不大和互补的特点。其实早在唐朝基督教,拜火教,伊斯兰教等很多宗教传入中国,唐朝的统治者不是汉人是鲜卑人,没有汉人所谓的夏夷之变,所以唐朝成全面开放态势,这些宗教是充分竞争的,除了伊斯兰教在中国西北扎下根外,其他宗教早早退出了中国历史舞台,为什么伊斯兰教能在中国西北扎下根能呢?这和唐朝一个有名的将领叫高仙芝,和当时的大食帝国打了一场著名的败战怛罗斯之战,导致伊斯兰教以武力的方式在新疆地区扎了根,而佛教完全是中下层人自发的精神追求。其实佛教在传入中国时和当时中国文化发生了强烈的冲突,任何文明的对接都相当困难,比如佛教讲究剃发,而中国文化表达的身体发肤受之父母不得毁伤,再比如加入佛门不能娶妻生子,而中国文化表达的是不孝有三无后为大。再就是佛教华丽的思想体系在当时几乎将中国文化全部打垮,以至于后面朱熹不得不借用佛教的逻辑学来改造儒学,产生理学,这相当于近代鸦片战争时期的中国文化受到强烈的质疑。

  佛教是从追问人生开始,这个和中国文化追问人伦社会学问题比较契合,再就是中国文化比较原始,早期的中国思想家都是关注人伦,很少关注自然,除了老子道德经追问过自然之道外,但是也仅仅是只言片语的散点式讨论。而佛教的庞大华丽的宇宙观,即时是今天的科学也很难达到的高度。 而且当时中国的文字很贫乏,无法全面翻译佛经,文化对接相当困难。比如早期将空翻译为无,但是后来发现佛教讲的空和无还不一样,老子讲的无是要生有的,而佛教讲的无是大空境,其实在甲骨文中空表达的是一个器具中间那部分,选择空这个字表达佛教的空只能赋予它更多的含义。早期将佛陀翻译为觉悟,后来发现翻译错了,中国式觉悟是指一个人在社会实现自己意志的一种悟性,而佛教讲的觉悟正好相反,不是实现自己的意志,是认识人生的苦难绝不在这个世界上折腾。再如般若,早期将般若翻译为智慧,后来发现翻译错了,中国式智慧是指一个人将世俗的利益攫夺到自己手中的能力,而佛教的智慧是中国式智慧的相反,最后发现找不到中国字表达佛陀的含义,只能选择梵语的音译。民国时期的梁启超先生曾经根据一部佛教字典,发现佛教带给中国的词汇至少35000个,比如作业,功课,缘分,功德,自由,罪孽,平等,世界,慈悲,博爱等等,如果将佛教从中国文化中剥离,中国的语言文字将极其贫乏。中国古代之所以万邦来朝,是因为当时中国是文明的传播者,不像近代鸦片战争的清朝,固步自封愚昧无知,近代日本之所以迅速崛起和日本是文明的传播者有很大关系,比如化学,物理,生物等一系列词汇均来自日本的翻译。

  公元前6世纪的轴心时代,释迦牟尼佛诞生,在佛陀降生时,佛陀的父亲净饭王请婆罗门教的大沙门为佛陀取名悉达多,大沙门对佛陀进行了预言:赤子或为转轮圣王或为教宗,这导致净饭王十分担心,为此佛陀的父亲为他修建华丽的王官,全是俊男美女相伴左右,以至于悉达多太子在19岁前没有出过王宫,有一天悉达多在他的仆人车匿的带领下第一次走出王宫,看到这个世间的生老病死之苦,给他造成强烈的视觉和思想冲击,这就是四门游观的典故,最终导致他放弃太子的生活,去寻求了生死灭苦悲的解脱之道。在当时尝试了当时几乎所有宗教的各种苦行,苦思冥想若干年不得真谛,曾经差点把他饿死,终于有一天在进食了牧羊女供养的牛奶后,在一棵菩提树下苦思七天七夜终于宣布顿悟成佛。

  佛教是唯一一个无神论宗教,没有偶像崇拜,现在的塑造佛像是对佛教原教旨主义的背叛。现在的人去寺庙求升官发财,去有所求,显然是没有搞清佛教的宗旨。去寺庙应该只要做到四个字静心礼佛就可以了,这才是真正的拜佛。 佛教思想是在佛陀圆寂以后,由500大沙门第一次集结,由佛陀的大弟子诵读出佛陀的言论,将佛陀的言论写在贝多罗树叶上称为贝叶经。显然听过佛陀言论的小沙门也很多,后来的小沙门认为第一次集结不够完整,后来经过多次集结完成了现在的佛经。佛经分三藏,经藏,律藏,论藏。所谓经藏就是记录佛陀的言论,所谓律藏就是修佛所需遵守的戒律,所谓论藏是为了修佛对经藏和律藏所做的阐述。经过学术界研究发现绝大多数佛经都是后人的杜撰,比如父母恩重难报经,学界比较公认的是阿含经,杂阿含经比较符合佛陀的原教旨。

  佛教讲苦,佛家讲东西全是逻辑化的讲解,这个是中国文化所欠缺的。所谓八苦生老病死成住坏空,生老病死指你身体的苦难,成住坏空指你生存环境的苦难。你做任何事情看来是成的,好像也维持住了,但是你很快发现它开始败坏最终流为消失,叫空。也有人认为佛教的八苦是生老病死忧悲恼苦,前四个字是指身体苦,后四个字是指精神的苦难。既然佛教认为人生是苦,那就要问苦的根源在哪里?这就是集谛,贪婪和欲望之恶习是你发生八苦的原因,所以集圣谛也称习圣谛。佛教集谛也分三毒三业,三毒是指贪嗔痴,你的苦难根源就来源于贪婪,发怒,愚痴,所谓愚痴是由于你处在贪婪和嗔晦的虚像之中,所以你无明,你看不清这个世界本身是什么,甚至你看不清自身是什么,这导致了你苦难的开端。业是指对外做的动作,不仅指行为也指思想意识称为意业。佛教认为这个世界本真是大空境,就是什么都没有,所谓世界是什么,就是你作业派生的产物,或者说是你做孽派生的,叫业障也叫孽障。佛教讲三业讲身口意,身指你的身体你的行为,口指你的语言,意指你的念头。也就是你每一个动作,每一句话,每一个念头它都会相应派生出你的世界。佛教所说的世界永远是你派生的那个世界,不是客观世界,客观世界的本真在佛陀看来就是大空境,你所说的世界就是你三业派生的产物。既然找到了根源,佛教肯定要追问怎样消除苦集,这就灭谛,由此引出了涅槃的概念。中国有很多对涅槃的误解,叫凤凰涅槃再生,这完全是搞错了。所谓涅槃可以这样比喻,就是下辈子绝不做人,这样说还不够,下辈子绝不做生命,还不够,下辈子什么都不做。你要通过修证把自己修到下辈子绝不在三界六道中轮回真正把自己归为大空境才叫涅槃。涅槃在佛教上讲的很细,主要分三讲,有余涅槃,无余涅槃,无住涅槃。所谓有余涅槃是指在圆寂肉身毁灭后将自己归为大空境,这个是高僧大德修持终身所能达到的最高境界,所谓无余涅槃是指在肉身没有毁灭就将自己归为大空境,能达到这一境界的目前只有佛陀一人,无住涅槃是佛教大乘化以后引出的一个概念,原始佛教是独善其身,也就是小乘佛教,只是由于中国文化讲究积极入世,所以才导致佛教进入中国大乘化讲究普渡众生。所谓无住涅槃是指进入涅槃状态以后还能普渡众生,目前也只有佛陀一人达到。既然灭除苦集就是进入涅槃,那紧接着就要追问怎样才能进入涅槃,由此导出了道谛。所谓道谛就是修持戒欲以生正觉是摆脱苦难的唯一出路。所谓佛,就是达至正觉。佛不是一个特殊的神,任何人只要达至正觉就是佛。所以佛讲三学讲六度,所谓三学就是戒定慧,戒就是戒绝一切世俗正常生活,因为世俗的生活是在实现自己贪欲的基础上才能维持生计。戒是指肉身不在正常生活中,定是指你的念头不在正常思境中,也就是你的念头不受外界信息的干扰,和外部红尘过来的一切精神世界隔绝。所谓慧是指你在戒和定的基础上修出佛那个觉悟,也就是去掉了痴达到无明境界。所谓六度是指:布施度,持戒度,安忍度,精进度,禅定度,般若度。佛教讲布施度是一个反生命的操作,任何生命要想维系自己的存在必须获取外在资源,而佛教的布施度是向外释放,佛陀当年讲的很细,不仅指财布施和法布施,比如眼布施–对外释放一个柔和的眼光,言布施–对外说一句仁和的话,颜布施–对外释放一个微笑的面容。接下来是持戒度,戒定慧的戒,但是这个不是佛教通常讲的戒规,而是要和世俗生活隔绝叫持戒度。再下来是安忍度,所谓安忍度就是不嗔晦,不怨不怒,将一切苦难视为当然,安之若素叫安忍度。再下来叫精进度,也就是戒定慧一级一级的修持。再接下来就是禅定度,摒弃六尘的干扰并抑制自己的意识流和心理活动,达到心无所住而生其心。最后才是般若度。

  佛教讲人生八苦生老病死成住坏空,生命在一发生就是苦难,生命追求存在必须寻找外在的资源才能新陈代谢,而生命所依附的环境又面临成住坏空,所以生命一发生就很脆弱,它必须依靠外在才能依附。佛教讲业力因果,你做任何一个业都会给你派生一个世界。佛教讲无我讲空,哪里来的业?你怎么理解,你很难理解。康德曾经在哲学上研究发现,人类将理性用到极致就会发生矛盾,他把这个叫二律悖反。比如世界是无限的,这个在逻辑上对,因为你无法想象一个有限世界的外面是什么,比如你说世界是有限,这个在逻辑上也对,因为你无法想象无限的世界是什么样子。上个世纪著名的数学家哥德尔发现在任何一个孤立的数论系统里面,如果是自洽的那它一定是不完全的,称为哥德尔不完全定律。所以佛祖在宣讲他的思想的时经常是一言不发,还因此产生了一个佛教宗派—-禅宗。佛祖当年在面对哲学问题时,经常一言不发,比如你问世有界还是无界,这个问题在佛祖那里是没有的,因为佛祖的世界是大空境,你之所以问这个问题是你对这个世界本真是什么毫无了解。所以佛陀当年讲你要学佛,你不能从逻辑上去学,因为人类的文字很贫乏不足以表达佛学思想,你要用生命去修持自证灭度苦生,你不能用闻思修的方式在纯逻辑的基础上去达到对世界本真的认识。比如佛讲业是根存在你的第八识阿赖耶识中,你做任何一个业都会在第八识留下痕迹,如果你没有修证到大空境,第八识的业会牵引你在六道中轮回。佛学不是哲学,远比哲学深刻。现在物理学超越爱因斯坦的理论提出玄论,认为宇宙是有限的,宇宙外面还有宇宙,整个宇宙是一个泡沫宇宙,这个和佛教讲的大千世界很接近。佛教讲色界,欲界,无色界,佛陀当年就知道我们人能感知世界仅仅是很小的一部分,比如人类不能感知暗物质暗能量。

  佛教的核心是缘起理论,概括起来就是此有则彼有,此生则彼生,此无则彼无,此灭则彼灭。佛教认为通常所说的世界是虚像,不是实像,佛陀认为这个世界本真是大空境。你所说的世界永远是主观世界,根本不是客观世界,是你的身口意三业派生的产物,是虚像不是实像,这叫此有故必有。在大学期间,我们往往认为唯物主义比唯心主义高级,这主要是中国把马克思哲学当做哲学的高峰,其实马克思根本不是哲学家,去读一下康德,佛学著作,其中的思境之高,常人难以达到,这么理性的人他们难道不知道这个世界是客观存在的吗?早期人类的思想都是唯物的,后来哲学发展到认识论阶段,因为人的眼耳鼻舌等感觉器官感受客观世界不是真空的管道,比如在客观世界是没有明亮的,只是光波打在你的视网膜通过末梢神经传导到你的视觉中枢上你错觉为明亮,然后你认为那就是光。注意人将思想加在对象本身上考量,只能表明你还很愚蠢,你只有将思想加在思想本身上考量,你才进入知识的门槛,所以唯心主义是唯物主义的高级阶段,这也是康德的不可知论这一派哲学在西方占有很重要地位的原因。在2500年前,在没有科学知识的情况,佛祖就已经知道你所说的世界是虚像,就达到如此高的思境,简直令人惊叹。人的感官系统是为求存而设立,不是为求真而设立。比如人为什么把对自己有害的物质尝为是苦的,因为你只有把它尝为是苦的你这个物种才安全,比如为什么人要把对你有能量的物质尝为是香甜的,因为你只有尝为是香的,你才能找见自己的能量来源,要不你就会被自然选择淘汰,你就会被饿死。可见人的主观是有规定性的。所以苦的东西一定对你有毒,建议少吃药少吃苦瓜。 佛教讲第七认识末那识,也称我识,佛陀当年发现人类的感官系统感受外部世界是以我为起点,有趋利避害,人类的自私自利都是源于此,而且第七识执着于阿赖耶识的种子,认为那就是我,所以一旦外缘和种子识发生作用,导致做出不可思议的行为,因此佛教讲不执着。第八识阿赖耶识,简称藏识,你对外做的每一个业都会潜藏地根存在你的第八识中,使得你根本不能清除自己的业,从而不能进入涅槃境界,这也是修佛极其困难的原因,这叫此生则彼生。你每做一个业,不是给你派生一个业,而是给你派生一个连环的系列的世界景象,这叫此有则彼有,如果你不能修正到大空境,这些业力将跟随你的第八识在三界中流转。你只有通过修为将你的某一个业消除,那么跟这个业相关的世界的一面也随之消失,这叫此灭则彼灭。你只有把你所有的业都消了,你才能修到大空境。

结尾

  佛学浅谈介绍到这,最后说点题外话。普通人认为佛学是封建迷信,是消极逃避,或者是避世消极的思想。其实佛学不是,佛学包含着终极人文关怀,是让人获得彻底的自由。佛并不反对在世俗中奋挣,反对的是你被某个欲望劫持,追求错误的东西。如果你不是佛教信徒,你也不妨看点佛学方面的东西,就我个人而言确实对身心有好处。生活如此艰辛,就应该多和思想家沟通,这样才不会孤单困惑,难道不是吗?

12345

费永军

简单靠谱,追求自由

41 日志
6 分类
26 标签
RSS
GitHub E-Mail
友情链接
  • 阮一峰
  • 敖小剑
  • 王垠
  • 廖雪峰
  • 云风
  • 王辉
  • 王建硕
  • hellojava
  • 龙泉之声
  • 华尔街见闻
  • markdown
© 2018 费永军
访客数 人 阅读数 次