WongBin技术博客 技术分享博客,内容涵盖生活故事、Java后端技术、Spring Boot、Spring Cloud、微服务架构、大数据演进、高可用架构、中间件使用、系统监控等相关的研究与知识分享。 https://coding-now.github.io/ Thu, 30 Apr 2020 06:19:36 +0000 Thu, 30 Apr 2020 06:19:36 +0000 Jekyll v3.8.5 k8s基础概念介绍 <p>k8s组件介绍 从开发者角度来理解kubernetes,了解数据模型,常用组件,为二次开发做好基础准备。</p> <h1 id="1-部署架构">1 部署架构</h1> <h2 id="11-部署单元组件">1.1 部署单元组件</h2> <p>## master节点</p> <p><a href="https://kubernetes.io/docs/concepts/overview/components/#master-components">官方介绍</a></p> <p>### kubeapi-server</p> <p>server-api接口服务</p> <p>### etcd</p> <p>分布式k-v存储</p> <p>### kube-scheduler</p> <p>待办pod任务创建、跟踪</p> <p>### kube-controller-manager</p> <p>node controller 监控node状态 rc 运行时deployment等监控 endpoint(service,pod)等服务监控 RBAC等资源管理</p> <p>## node节点 ### kubelet</p> <p>### kube-proxy</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> 负责节点deployment创建,调度 </code></pre></div></div> <p>### container-runtime 典型如docker镜像</p> <h1 id="2-基础概念模型">2 基础概念模型</h1> <h2 id="namespace">namespace</h2> <p>逻辑上的资源分组概念,可以基于namespace设置ResourceQuota: CPU,内存总额大小,pod,deployments数量限制</p> <h2 id="cluster">cluster</h2> <h2 id="master">master</h2> <p>k8s集群调度的大脑核心,可以基于集群方式保证高可用。</p> <h2 id="node">Node</h2> <p>官方文档(https://kubernetes.io/docs/concepts/architecture/nodes/#node-status) k8s管理的物理机或虚拟机,node的创建管理,不受k8s控制,k8s只是通过health check方式确认节点是否可用 节点通过label,annotations方式和k8s集群建立关联关系。</p> <h2 id="pod">Pod</h2> <p>k8s管理的最小调度单元,一般情况下一个node会创建一个pod. 一个pod里面可以启动多个紧密关联的deployment <a href="https://www.cnblogs.com/DaweiJ/articles/8683787.html">pod网络相关参考这个链接</a></p> <h2 id="service">service</h2> <h1 id="controllers">controllers</h1> <h2 id="deployment">Deployment</h2> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Deployment 是最常用的 Controller,最常用的就是通过创建 Deployment 来部署stateless应用。 Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。 </code></pre></div></div> <h2 id="replicaset">ReplicaSet</h2> <p>实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。</p> <h2 id="daemonset">DaemonSet</h2> <p>用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。</p> <h2 id="statefulset">StatefulSet</h2> <p>能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。 同时 StatefulSet 会保证副本按照固定的顺序启动、更新或者删除。</p> <h2 id="configmap">ConfigMap</h2> <h2 id="daemonset-1">DaemonSet</h2> Tue, 04 Dec 2018 00:00:00 +0000 https://coding-now.github.io/life/2018/12/04/k8s%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5%E4%BB%8B%E7%BB%8D.html https://coding-now.github.io/life/2018/12/04/k8s%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5%E4%BB%8B%E7%BB%8D.html life life markdown常用编辑技巧 <h1 id="一级标题">一级标题</h1> <h2 id="二级标题">二级标题</h2> <h3 id="三级标题">三级标题</h3> <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">java</span> <span class="err">代码</span> </code></pre></div></div> <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c">#/bin/bash</span> <span class="nb">echo</span> <span class="s1">'hello'</span> </code></pre></div></div> <ul> <li><code class="language-plaintext highlighter-rouge">--feature-gates=RotateKubeletServerCertificate=true</code>:开启 kublet server 证书的自动更新特性;</li> <li><code class="language-plaintext highlighter-rouge">--horizontal-pod-autoscaler-*:</code>:custom metrics 相关参数,支持 autoscaling/v2alpha1;</li> </ul> <p><strong>文字加粗显示</strong></p> Mon, 03 Dec 2018 00:00:00 +0000 https://coding-now.github.io/life/2018/12/03/markdown%E7%BC%96%E8%BE%91%E6%8A%80%E5%B7%A7.html https://coding-now.github.io/life/2018/12/03/markdown%E7%BC%96%E8%BE%91%E6%8A%80%E5%B7%A7.html life life 参加线下活动-卓越研发之路,微服务时代下的研发之路 <p>参加线下活动-卓越研发之路,微服务时代下的研发,四位讲师的分享都很接地气。</p> <h3 id="活动链接在这里-httpwwwhuodongxingcomevent2467622448100">活动链接在这里 http://www.huodongxing.com/event/2467622448100</h3> <h3 id="详细演讲视频-在微软云课-app可以查看">详细演讲视频 在微软云课 app可以查看</h3> <h3 id="邀请到了来自贝壳金服高级架构总监-赵文乐分享基于springcloud的微服务技术实践介绍">邀请到了来自贝壳金服高级架构总监 赵文乐–分享基于springcloud的微服务技术实践介绍</h3> <p>个人收获 1 skywalking,apm类开源软件,国内开源的监控类软件,需要关注下,更接地气,以后有空了可以研究研究,他们公司已经投入使用了,跟进比较快的。 2.一些开源软件还不熟悉:tidb,prometheus,glasterfs 3.网关层设计,jwt-token技术</p> <h3 id="bilibilib站架构师负责工程效率团队-毛剑分享grpc的使用">bilibili(B站)架构师、负责工程效率团队 毛剑–分享grpc的使用</h3> <p>技术专家,开源软件研究的比较多,牛人的眼界,学习研究能力确实值得模仿实践之。 go,grpc云时代的基础技术,需要去深入学习。</p> <h3 id="英捷创软-ceo-首席架构师徐磊-分享devops实践过程">英捷创软 CEO 首席架构师徐磊– 分享Devops实践过程</h3> <p>敏捷教练,实践中的可参考流程:看板墙,电子版看板,daily-standby,15分钟,研发,测试配合过程。 逐步熟悉,没有最佳实践,团队磨合有一个过程</p> <h3 id="微服务时代下的研发管理黄勇互联网创业者前阿里架构师">微服务时代下的研发管理–黄勇–互联网创业者,前阿里架构师</h3> <p>研发团队架构划分,产品团队,技术团队 个人书籍:轻量级微服务架构上下册</p> Sat, 01 Dec 2018 00:00:00 +0000 https://coding-now.github.io/life/2018/12/01/crossroads.html https://coding-now.github.io/life/2018/12/01/crossroads.html life life Spring Boot 2 (九):【重磅】Spring Boot 2.1.0 权威发布 <p>如果这两天登录 <a href="https://start.spring.io/">https://start.spring.io/</a> 就会发现,Spring Boot 默认版本已经升到了 2.1.0。这是因为 Spring Boot 刚刚发布了 2.1.0 版本,我们来看下 Spring Boot 2 发布以来第一个子版本都发布了哪些内容?</p> <h2 id="21-中的新特性">2.1 中的新特性</h2> <ul> <li>将<code class="language-plaintext highlighter-rouge">spring-boot-starter-oauth2-oidc-client</code>重命名为<code class="language-plaintext highlighter-rouge">spring-boot-starter-oauth2-client</code>命名更简洁</li> <li>添加 OAuth2 资源服务 starter,OAuth2 一个用于认证的组件。</li> <li>支持 <code class="language-plaintext highlighter-rouge">ConditionalOnBean</code> 和 <code class="language-plaintext highlighter-rouge">ConditionalOnMissingBean</code> 下的参数化容器</li> <li>自动配置 applicationTaskExecutor bean 的延迟加载来避免不必要的日志记录</li> <li>将 DatabaseDriver#SAP 重命名为 DatabaseDriver</li> <li>跳过重启器不仅适用于 JUnit4,也适用于 JUnit5</li> <li>在 Jest HealthIndicator 中使用集群端点</li> <li>当 DevTools 禁用重启时添加日志输出</li> <li>添加注解:<code class="language-plaintext highlighter-rouge">@ConditionalOnMissingServletFilter</code>提高 Servlet Filters 的自动装配。</li> </ul> <p>同时还有一大堆以来组件进行了升级:</p> <h2 id="21-中的组件升级">2.1 中的组件升级</h2> <ul> <li>升级 Hibernate 5.3,Hibernate 的支持升级到了 5.3</li> <li>升级 Tomcat 9 ,支持最新的 tomcat 9</li> <li>支持 Java 11,Java 现在更新越来越快,Spring 快赶不上了。</li> <li>升级 Thymeleaf Extras Springsecurity 到 3.0.4.RELEASE ,<code class="language-plaintext highlighter-rouge">thymeleaf-extras-springsecurity</code> 是 Thymeleaf 提供集成 Spring Security 的组件</li> <li>升级 Joda Time 2.10.1,Joda-Time, 面向 Java 应用程序的日期/时间库的替代选择,Joda-Time 令时间和日期值变得易于管理、操作和理解。</li> <li>升级 Lettuce 5.1.2.RELEASE ,Lettuce 前面说过,传说中 Redis 最快的客户端。</li> <li>升级 Reactor Californium-SR2 ,Californium 是物联网云服务的 Java COAP 实现。因此,它更专注的是可扩展性和可用性而不是像嵌入式设备那样关注资源效率。不过,Californium 也适合嵌入式的 JVM。</li> <li>升级 Maven Failsafe Plugin 2.22.1 ,Maven 中的测试插件。</li> <li>升级 Flyway 5.2.1 , Flyway是一款开源的数据库版本管理工具</li> <li>升级 Aspectj 1.9.2 ,AspectJ 是 Java 中流行的 AOP(Aspect-oriented Programming)编程扩展框架,是 Eclipse 托管给 Apache 基金会的一个开源项目。</li> <li>升级 Mysql 8.0.13 ,Mysql 支持到 8。</li> <li>升级 Undertow 2.0.14.Final , Undertow 是一个用 java 编写的、灵活的、高性能的 Web 服务器,提供基于 NIO 的阻塞和非阻塞A PI。</li> <li>升级 Rxjava2 2.2.3 ,RxJava是一个在 Java 虚拟机上的响应式扩展:一个用于通过使用可观察序列来编写异步和基于事件的程序的库。</li> <li>升级 Hazelcast 3.11 ,Hazelcast 是一个开源的可嵌入式数据网格(社区版免费,企业版收费)。你可以把它看做是内存数据库,不过它与 Redis 等内存数据库又有些不同。</li> <li>升级 Spring Kafka 2.2.0.RELEASE ,Kafka 高吞吐量、内置分区、支持数据副本和容错的 消息中间件。</li> <li>升级 Spring Batch 4.1.0.RELEASE ,Spring 的批处理框架。</li> <li>升级 Micrometer 1.1.0 ,Micrometer 是一款监控指标的度量类库,可以让您在没有供应商锁定的情况下对JVM 的应用程序代码进行调整。</li> <li>升级 Spring Integration 5.1.0.RELEASE,Spring integration,它是一种便捷的事件驱动消息框架。</li> <li>升级 Spring Data Lovelace SR2 ,<strong>网上查了一下,仍然不知道 Spring Data Lovelace 是什么鬼,了解的朋友留言给我</strong></li> <li>升级 Spring Framework 5.1.2.RELEASE ,对于的 Spring 也进行了升级。</li> <li>升级 Byte Buddy 1.9.3 ,Byte Buddy 是一个字节码生成与维护的库,主要用于在 Java 应用运行时生成和修改 Java 类,并且不需要编译器来辅助。</li> <li>升级 Spring Session Bean-RELEASE ,Spring 提供 Session 管理的组件。</li> </ul> <p>详细内容参考这里:<a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes">Spring Boot 2.1 Release Notes</a></p> <p><strong>每次看 Spring Boot 发布指南都要更新一遍脑子里面的技术名词,Spring Boot 体系太大,几乎集成了 Java 领域所有知名框架。</strong></p> <p>我在 <a href="https://gitbook.cn/gitchat/column/5b86228ce15aa17d68b5b55a/topic/5b968861780fdb5e97d3e157">Spring Boot 2.0 升级的时候说过一段话</a>:</p> <blockquote> <p>Spring Boot 2.0 是历时 4 年开发出来的巨作,在 Spring Boot 1.0 的基础上进行了大量的优化,淘汰了很多过期的 API,同时引入了一大批最新的技术,这些新技术在未来的一段时间内都具有引导性。</p> </blockquote> <blockquote> <p>如果不是特别需要使用 Spring Boot 2.0 上面提到的新特性,就尽量不要着急进行升级,等 Spring Boot 2.0 彻底稳定下来后再使用。如果想要升级也请先从早期的版本升级到 Spring Boot 1.5X 系列之后,再升级到 Spring Boot 2.0 版本,Spring Boot 2.0 的很多配置内容和 Spring Boot 1.0 不一致需要注意。</p> </blockquote> <p>这是因为 Spring Boot 2.0 刚刚发布会有一段时间的稳定期,现在 Spring Boot 2.1.0 的发布,意味着 Spring Boot 2.0 已经彻底稳定下来,如果公司比较喜欢尝新,现在可以大胆的使用了。</p> <p><a href="https://gitbook.cn/gitchat/column/5b86228ce15aa17d68b5b55a#catalog">另外我在 GitChat 的课程《精通 Spring Boot 42 讲》也会基于最新的 Spring Boot 2.1.0,大家感兴趣可以关注</a></p> Sat, 03 Nov 2018 00:00:00 +0000 https://coding-now.github.io/springboot/2018/11/03/spring-boot-2.1.html https://coding-now.github.io/springboot/2018/11/03/spring-boot-2.1.html springboot springboot 小米从北京迁往武汉南京,一线大厂逃离或为新常态? <p>近日有网友爆料小米将从北京迁往武汉南京的政策,在2019年年底3月前完成搬迁的员工可享受3万元补贴,可申请当地人才公寓。</p> <p><img src="http://www.itmind.net/assets/images/2018/it/xiaomi.png" alt="" /></p> <p>按照这份公告的爆料,小米员工从北京“搬迁”到武汉南京后,工资待遇基本不变,公司会为员工提供15天酒店住宿补贴,标准为400元/天。除此以外,还有3万元的搬迁福利费,但是领取过的员工必须在新工作地服务满2年。</p> <p>住房方面,小米可为员工提供人才公寓,武汉租金为1000元/套,南京租金为2000-3000元/套,想要购房的员工不受当地限购政策影响,可立即获得购房资格。</p> <p>去年小米先后在武汉、南京建立了总部。其中小米武汉总部以万人规模来规划的,并被定位为“超大研发总部”。而位于南京的总部则致力于新技术、新业态的突破和智能硬件、物联网的发展,通过整合上下游产业和企业,打造小米生态链。</p> <h2 id="情况基本属实">情况基本属实</h2> <p>从一位小米员工处获悉,搬迁邮箱通知仅仅针对某些部门员工,其称自己并没有收到相关邮件。另外一位小米程序员则表示“搬迁早就在做了,北京的五彩城早不够用了”。“不是迁移,是基于未来做的新生布局,应该会有北京的骨干去往武汉、南京推进当地的业务发展。”一位接近小米集团高层的人士透露小米“南飞”。</p> <p>经过这两天的持续发酵,小米官方也没有对此进行澄清,基本证实情况属实,小米必定不会将所有业务全部搬迁到武汉南京,为了平滑过渡,“搬迁”可能是一个缓慢的过程。大胆猜测,北京未来肯定还需要留有研发中心,但武汉南京研发团队也会持续壮大成为小米研发体系的重要部分。</p> <p>其实在这之前,小米已经在武汉南京建立总部。</p> <p>小米集团创始人雷军是湖北人,他的大学时光是在武汉大学度过。2017年武汉市政府、东湖高新区分别与小米、金山、顺为资本签署战略合作框架协议,武汉也有望成为小米的第二总部。雷军当时表示,小米将在武汉投入230亿元。武汉作为中国的强二线城市,这些年在互联网行业发展迅速,人才环境等方面也有了一定的积累。</p> <p>同年10月,小米创始人雷军在微博上表示:小米6年前就在南京设立了研究中心,现在手机和MIUI研发团队在南京有将近100人,目前正在大规模扩招,未来会成为小米最主要的研发中心之一。小米在南京,还有供应链、营销等部门的分支机构和多家生态链企业,可见此事小米公司早有规划。</p> <h2 id="一线互联网大厂逃离北上广深或为新常态">一线互联网大厂逃离北上广深或为新常态</h2> <p>2016年5月,一篇名为《别让华为跑了》的文章在朋友圈广泛传播,深圳市政府为了防止华为搬迁,甚至开了专题研讨会来研究如何防止类似事件发生,同时组织专人帮助华为解决所面临的问题,但华为终究还是跑了。</p> <p>今年7月1日,华为公司正式搬迁,40辆8吨货车,共60车次,搬迁车辆往返深圳和东莞松山湖,搬家货车会有一个华为标识,“华为搬迁专用车辆”。而7月2日,有2700人从深圳到东莞松山湖溪流坡村上班,估计车辆约1500辆(其中大巴70辆)。</p> <p>华为搬迁的背后,折射出企业壮大后,对研发成本、城市房地产成本和人员成本急剧扩大,而导致各类成本增加的多种考量。华为搬迁到东莞之后,拥有了可以扩展的大批量土地和当地的优惠政策,同时给研发人员带来了非常大的福利措施。</p> <p>华为员工搬迁到东莞后可以享受到福利分房。按照网传分配方案,不区分楼栋、楼层、户型,单价全部统一为8500元/平米(当地房价2万多),以两房居多,各个部门分配的房型比例也一致,一房占12%,二房占比76%,三房占比12%。分配方案采取的是积分排序形式,入职年限、东莞常驻年限、年度绩效、公司荣誉称号等都能加分,而分房对象也设置了一定门槛,需要华为15-19级,且入职满3年以上正式员工,还要是在东莞常驻或2018年在东莞常驻。</p> <p>其实在这之前,华为、中兴就在西安搭建了研发中心,并且都在西安修建了企业园区,可以容纳几万人同时办公。华为、中兴为什么将大量的研发力量迁移到西安,无非是看上西安便宜的土地和人力成本,西安高校林立,人才储备充分并且成本更低,综合起来比深圳更有竞争力。</p> <h2 id="二线城市的历史机遇">二线城市的历史机遇</h2> <p>尽管小米此次深化南京、武汉两大中心业务发展的行为与华为有所区别,但我认为,这可能是一线大厂将部分产业链从一线城市转往二线城市的缩影。前有无人机“霸主”大疆科技在东莞松山湖设立全球研发和销售中心、中兴通讯在广东省河源市兴建生产基地,后有阿里巴巴西北总部落户西安等。</p> <p>在2010年的时候,二线城市的互联网发展非常落后,作为一个程序员如果你想去一家互联网公司工作只能选择北上广深杭。在2013年的时候西安、成都等二线城市的互联网公司还凤毛麟角,到了现在,随着互联网的迅速发展普及,以及很多一线人才回归到二线,很多强二线城市互联网企业已经慢慢变得丰富起来了,从各地火爆的创业街、孵化器就可以看出一二。</p> <p>首先发展起的强二线城市是杭州,因为阿里巴巴和网易的存在培养了一批互联网人,这些大厂的员工离职之后,又创建或者投资了一批中小型互联网公司。杭州的创业氛围很好,出现了很多初创的独角兽公司,比如:曹操专车、51信用卡、菜鸟网络大等,甚至已经出现了“杭漂”这个流行词语,“杭漂”也慢慢成为了很多程序员的首选。</p> <p>接下来比较突出的是成都,成都在手游领域发展很不错,成都政府的招商引资在所有的二线城市中做得最好。成都排名高的核心原因是知名互联网公司在这里设立分公司,腾讯成都分公司、京东成都分公司、阿里巴巴成都分公司等一系列的分公司。</p> <p>强二线城市中还有武汉、西安、南京等城市,近两年在互联网行业发展非常迅速。各地政府纷纷创建了各种园区和政策来吸引一线大厂落地,并对独角兽企业在本地建立总部给予特殊政策优惠。慢慢的这些强二线城市已经有了星星之火燎原之势,未来上述这些二线城市的互联网行业发展值得期待。</p> <p>但凡互联网企业发展比较快的城市,都离不开一个最核心的因素,那就是人才的支撑。北京之所以成为互联网的中心,最重要的原因之一就是众多高校的支撑。中国高等教育实力较强的城市包括北京、上海、武汉、南京和西安,成都的高等教育发展算不上很强,但是绝对不弱。成都之所以能够超越武汉、南京和西安,除去人才的吸引力之外,那就是环境的吸引力。</p> <h2 id="回还是不回">回还是不回?</h2> <p>一线程序员是否回归二线老家是一个非常热门的问题,也是每个大龄程序员常常思考的一个问题,其中也包含我。作为一个在一线搬砖的程序员来讲,在北京的生活质量奇差,互联网企业更甚,常年996不说,上下班往往需要花费1-2小时的通勤时间。</p> <p>一线城市房价在16-18年又经历了一波高涨,想通过敲代码实现买房的希望基本已经破灭,能真正依靠自己能力在北京买房的人少之又少。随着一线城市城中村拆迁的推进,房租市场也迎来了急剧上涨,前段时间北京甚至出现了几个租聘企业竞相挣抢房源的情况,我租住的小区5年时间房租刚好翻倍。</p> <p>以前是在一线城市买不起房,现在可能租都租不起,二线城市的人们往往羡慕一线工作者的高工资,却不知道工资的很大一部分都要上交给房东,所以有时候我们会开玩笑说,在北京是给房东打工。另外在一线如果有孩子,孩子上学也是一个非常大的问题,好多小夫妻就是因为孩子上学的问题选择了离开。</p> <p>上次坐火车从北京回西安,遇到一个曾经的老北漂大姐带着孩子来北京旅游,在一个车厢里面聊了起来,大姐和我们聊起了她曾经在北京的工作和生活,作为一个报社的编辑,曾经每天坐两三个小时的车上下班,晚上经常由于加班错过最后一班地铁,晚上只能睡20元一晚的床位。说起曾经的苦逼北漂经历,大姐唏嘘不已,并不断语重心长的对我说,要早做打算,并不时庆幸自己早日结束了北漂,在西安买房成了家。</p> <p>现在很多二线城市开放了户口,只要提交资料就可以落户。比如:西安,只要网上填个资料就行,都不需要跑路。二线城市的房价虽然也大涨了一下,但是使使劲还是能够得上,所以回归二线城市之后,房子、车子、子女教学基本可以一步到位。(最近二线城市房价也有降价的趋势,买房的朋友慎重考虑)</p> <p>同时回归二线也需要考虑一些问题,其中就有薪资的巨大落差,很多人回二线城市之后接受不了薪资的巨大落差又返回一线。比起薪资的差异来讲还有一方面是文化差异,很多一线城市的互联网企业,工作方式和文化比较高大上,回归二线后大多公司比较讲究实际,可能会有所不适应。另外换工作时,比起一线城市海量的工作机会,二线城市可选的范围将大大减少。</p> <p>所以说回还是不回?需要看每个人的情况,如果已经在动摇中,恰好企业有相应的政策补贴,响应公司安排无非是一件好事。如果还想在北京拼搏几年,或者自己的老家城市还真回不去,留下来也未必是一件坏事,毕竟一线城市的工作机会和发展机遇较多。总之,到哪里都是需要奋斗的,Follow your heart!</p> Mon, 15 Oct 2018 00:00:00 +0000 https://coding-now.github.io/life/2018/10/15/crossroads.html https://coding-now.github.io/life/2018/10/15/crossroads.html life life