0%

之前在《理解冲突》一文中,谈到了两类冲突,一个是认知冲突,另一个是立场冲突。今天发现,还不够完备,生活中还存在其他类型的冲突,比如价值冲突或说偏好冲突。

价值冲突,又叫偏好冲突。简单说,它就是萝卜咸菜各有所爱的冲突。萝卜和咸菜,各执一词,也都很有道理,双方也都既无法证实,也无法证伪,更多是一种执念或选择。

它不同于认知冲突,认知冲突主要是双方信息不对称,如果对称起来了,这种冲突会消除。

它也不同于立场冲突,立场冲突是违背自己内心真实判断的,如果双方角色互换,彼此的观点会立即转到对方去。

价值冲突,仅仅是萝卜咸菜的问题,但冲突起来非常棘手!甚至无解。笔者向从生活、工作和治国,三个角度,分享几个例子。

阅读全文 »

《海蒂和爷爷》是个人最喜爱的一部电影,没有之一。建议每个家长都陪孩子看看。很暖心。Heidi和Klara的生活,原本完全不可能有交集,但故事安排的恰如其分,让大家对不同的生活,有不同的感悟,关于生命力,关于幸福感。曹雪芹在《红楼梦》里,也刻意写了刘姥姥进大观园,刻意让刘姥姥与贾母的生活有了个交集,也是这种强烈的对比,启发读者对人生追求的思考。

今天重温这部片子,末尾注意到之前不曾注意的经典桥段——我想写故事

坚定地书写自己的人生

image-20200223220635501

阅读全文 »

真实的一个应用,不会像之前演示的那样,只有一个Tomcat,而是还有依赖的应用,比如数据库。

以大家熟知的WordPress博客软件为例,它需要连MySQL以存储博客。当然我们可以先启动mysql容器,然后启动WordPress容器,并且用--link参数让WordPress容器能够访问mysql容器。

但是Docker提供一种更简单,更自动化的方式来支撑多依赖关系的应用的整体运行,这一点对于微服务应用特别重要。这个机制就叫docker-compose,它的表现形式是写一个docker-compose.yml,里面描述好整个应用分多少个服务,每个服务间的依赖关系和每个服务自身配置。

docker-compose.yml

编辑一个docker-compose.yml的文件:

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

version: '3'

services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:

语义表达的很明白,上述docker-compose.yml定义了两个services:一个是db,另一个是wordpress。并且wordpress依赖于db(配置中的depends_on节点),当然如果还有其他依赖,可以写多个。类比我们熟悉的maven,一个JAR可以依赖于多个其他的JAR,最终会形成一个依赖树。同样,service最终也会形成依赖树。

阅读全文 »

本文主要讲解如何在Docker下部署SpringBoot代码,特意借用了Spring官方教程 Spring Guides: Building a RESTful Web Service 的代码。本教程涉及的代码详见 downgoon/hello-world/springboot-docker-hello-world

本地直接运行

  • 编译
1
$ mvn clean package
  • 运行
1
$ java -jar target/springboot-docker-hello-world-0.1.0.jar
  • 访问
1
2
$ curl http://localhost:8080/greeting
{"times":1,"content":"Hello, World!"}%

本地Docker运行

要在Docker环境运行SpringBoot,需要以下几个步骤

制作镜像

1
$ docker build . -t springboot-docker-hello-world

它等效于

1
$ docker build . -f Dockerfile -t springboot-docker-hello-world
阅读全文 »

在讲解Docker之前,我想请问大家,我们是如何给手机安装App的?

我想大家一定会说,这也需要考吗?这太简单了,直接在AppStore搜索你想要的软件,然后点击安装呀。

没错 !接着我想请大家回忆下,尤其是80后、70后,在PC时代,尤其是360软件管家出现之前大家是如何安装软件的?那时候可不像现在这样“一站式”的,那时候很费劲,大概会有这么几个步骤:

  1. 百度搜索: 在百度搜索我们需要的软件名。
  2. 跳转软件网站: 接着跳转到中关村在线或者是下载天空等软件下载类网站。
  3. 迅雷下载: 为了加速下载,往往会弹出迅雷,几分钟后,软件下载到本地了。
  4. 手动安装: 在迅雷的下载目录,找到要刚才的软件,点击安装。然后输入若干信息,比如安装目录和数据目录等。如果遇到写注册表的,还需要输入机器密码等。
  5. 开始菜单: 最后在“开始”里找到刚安装的软件,点击运行。当然有的软件安装后,会提示是否直接运行。
  6. 更糟糕的: 如果这个软件是.Net或Java开发的,运行的时候,还会报错,提示我们得先下载.Net Framework或JRE,否则无法运行。

辛亏如今一切变得那么顺畅。然而,如果我们把视线从客户端App,转移到服务端看一看呢?程序员们安装服务器软件,多数公司还处在PC时代安装软件一样。研发人员需要把软件打包给运维人员,复杂点的,还可能需要附带一个安装手册,里面可能包含如何链接到数据库、如何做数据初始化、如何设置对其他服务的依赖等。我们就会想,难道服务端程序的部署就不能像AppStore那样吗?搜索,点安装,两步完成了。甚至更简单,程序写完了就自动部署?

的确可以,这就是今天要说的Docker。在Docker的世界里,要求程序员把程序打包成一个叫做镜像的东西,英文叫Docker Image。接着把这个镜像,上传到镜像的AppStore,也就是术语里说的Docker Hub镜像中心。最后其他人员(包括运维,甚至其他网友)都可以一键“点击部署/运行”。

阅读全文 »