她眼中的我

作者:zhou; 整理:Acheron ;2017-06

Acheron按:我就像一席被藏于厨房的酱皮,时间久了,容易发霉,所以每隔一段时间,总要被拉到阳光处暴晒一顿,亦或是一只温顺的蛇,每次她晒心泛起,我就成了”遭殃”的对象,被扒皮晒之,而且不全扒完,每次扒一节,每次晒一段。问:为何如此晒我?答曰:先把你的好给晒出去,以后也就不敢如何如何了。回呛:于我,您就像某党一样永远伟大光荣正确啊。明赞暗讽,一个好的台阶。逃~

下面是正文

我眼中的大雄,是一只不像程序员的猿,因为他很帅也话痨。但在有其他人是时候,帅是一样的帅,话却像被吸尘器抽走一样。平时不会骂我,比较在意我的睡眠,我睡迟才会挨批。一般都听我的,唯我是从。时至今日一起经历最大的事除了结婚蜜月就是买车。买车都是大雄定的,我只要选个颜色就好了,挺省心。是这三件大事里我最轻松的一件。

我眼中的大雄,是个留长头发的大男生。本来我是坚决不同意他留长头发的,后来发现留长会有一个非常大的好处,就是扎起来瞬间长高5厘米,我也就欣然同意了。他的头发又黑又密,但因为赚钱太辛苦,现在老是有新的白头发长出来。大雄非常享受我给他拔白头发的幸福时光,反正头发这么多,长几根白头发拔几根白头发应该也没有关系。不过不要看这点头发,留的真心不容易,除了外界诸多的言语评论内心的徘徊彷徨,还需要不断的修剪做发型。而且都必须要我陪在身边,因为他不会和理发师说要怎样的效果,每次都要我传达,还会在进店之前反复和我强调一定要和理发师说清楚,还一定不准我走开。我就这么承担着这艰巨又轻松的任务。

我眼中的大雄,是个“三陪”boy,陪加班加点,陪胡侃乱谈,陪吃喝玩乐。记得去年的8、9两个月,加班加的没日没夜的,身体亚健康严重,但是感觉还好,还能扛住。但是见到大雄躺在大厅座椅上蜷缩着午睡的样子,那感觉,真尼玛心酸。现在日常工作走上正轨,虽然科室人员实在太少,每月加班3、5天总还算扛的牢。胡侃乱谈的基础是两个人有相同的或者接近的兴趣爱好,比如看看电影啥的,虽然现在发现喜欢的电影类型倒是有点差距的,反正互相迁就,就当涨见识吧。吃东西口味一致我觉得还蛮重要的。我记得去年双11领完证就赶去杭州看演唱会,赶时间随便在路过的一家顺旺基(莘时刻)吃晚饭,发现想点的菜完全一致,这样两人都美美的吃了婚后第一餐,味道还不错。大雄比我能宅,但是一天不出门也会带我出去溜溜弯。蜜月是我一直坚持要有的,总算没辜负我。地点倒是大雄挑的,去了一个文明的发祥地(见[希腊行的旁白])。其实我内心还是想去土耳其啊,因为还是想坐热气球啊。生活大致就是凑凑活活吧,健康常乐。比心[爱心]

我眼中的大雄,是一只加班🐶。除了周五周六周日晚上,一般都加班。周末不加班是大雄找工作的最基本要求,然后才是工资。其实,我只关注后面那项。大雄加班,加班费当然是没有的,但是一则可以累计调休,二则晚饭可以吃公司的,对于后面这项我也是相当满意。大雄是相当抗拒加班的,除非必要,工作进度太赶或者背锅了,是绝不会在公司多留一分钟的。在我写下这些话的时候,大雄还在加班……

我眼中的大雄,是个作息规律的读书人。我最敬佩的就是他的生物钟,一到点就马上想睡觉而且秒秒钟睡着,对于夜猫子的我来说不要太神奇;而且早上竟然能到点醒。每天睡前还会看点书,当然不像我是用来催眠用的。纸质书大多在视频里看他在翻,现实中看到的他大多在看电子书。很多他看的书是我连书名都不愿意看的类型,比如《经济学》、《追忆…》、《汽车…》…还有技术书等。关于买书我俩专门讨论过预算,反正我的想法是随他买,或者我买。毕竟我现在天天穿工作服,买衣服的欲望都被大打折扣了,买本书也当是发泄发泄购物欲。当然我也是偶尔会看书的,比如最近我就向大雄借了他那本《世界通史》。

我眼中的大雄,是一个送礼物小能手。送我的-1个礼物是个kindle,逼格高啊,稀奇啊,当时都没见过这新鲜玩意啊,然而懒惰如我,它现在基本都在睡觉。第一次见面送了本太宰治的《人间失格》,当时就想,“呦。这小伙子还蛮上心的,还晓得送书,不错不错”。在过第0个520节时,大概是按照男生的传统惯例送了巧克力,亏的聪明还附带送了两只小熊,就是图中所示的这两只。巧克力我是不喜欢吃的,小熊倒是甚得我心,现在都还保留着。机智如他,正式的第一个礼物送了个手机,极大地改善了我的网络生活,还很经用啊,现在都还在码字呢。最惊艳的礼物,要算是懒人眼镜。那段时间我颈椎相当不好,说是给我买了个利器,等半天快递就是这个可以床上躺平看Pad,不用梗着脖子的眼镜。这眼镜造型是一流,使用率就算了。最歪打正着的礼物,是那个“大锤子”按摩器。记得当时Refa很火,有很多广告,随便就发给他一张让他猜是什么东西,一忙忘了告诉他正确答案,只说是按摩器但没说用途。然后好了,不知过啥节的时候就给我买来那么个比头还大的“大锤子”按摩器。不过误打误撞,还真是蛮有用,按摩起肩背来真还挺爽。好了,不说了,我要按摩去了。

我眼中的大雄,是个会主动发红包的“阔佬”。接下来说说,大佬会发红包的几种情况和发放途径。1.偶遇节日。214、217、520、七夕、春节这些大节日妥妥肯定有红包收,总不能别人都有就我没。大雄也不会留下这种明显可以让我诟病的把柄。2.作为奖励。通常饭菜做的好,就会有小红包作为鼓励。所以几乎主要下厨,就会有红包。3.算作赔礼道歉。大雄深谙,但凡惹我不高兴了,也只有红包能哄好我。请牢记,发红包是道歉最有力的工具,一点要好好利用。4.随机包。比如像今天这样发个朋友圈,通常会有安慰包。大佬发红包的途径,主要有三条:一是支付宝,节日包用这个,通常金额较大;二是微信,通常金额小,但是最频繁;三是现金,印象里只有过年才包现金。以上就是对发红包现象的总结。反过来想想,可能是因为我管理水平太次,经济大权都还没把握牢,所以还有红包收收。好了,不说了,我要找法子收红包去了。

我眼中的大雄,是一个跟我打电话,如果旁边有人,跟我说话就会不好意思的人。[此句大雄回复]

我眼中的大雄,是个冷笑话制造机。但凡平常工作生活中累了、受气了、不高兴了、姨妈快来了,大雄妥妥都要被牵连了。于此,大雄最好的化解方法就是给我讲一个冷笑话。到现在为止也不知道讲了多少了,重点是我记不住啊,就算下次再给我讲同一个我还是会笑得跟傻子一样啊,一扫阴霾的情绪。刚开始恋爱那段时间,每天睡前会跟我讲个冷笑话,一天一个没的多,碰到我心情不好才会来个冷笑话攻击波。我大概就是被冷笑话骗走的。对于男的来说,多储备几个冷笑话总是没错的,大雄哪里找的冷笑话一直没能问出来(不外乎知乎微博豆瓣吧),讲冷笑话的好处我是相当清楚明了的,一是可以用作聊天缓解尴尬的小工具避免尬聊,二是可以拿来当作哄女孩子的利器特别是在她不开心的时候。好了,今天就这么多~

配置管理平台Apollo搭建指南

Acheron注:

Apollo 的官方文档写得非常友好全面,官方地址:https://github.com/ctripcorp/apollo/wiki

这里只是记录一下我在服务器上搭建的过程。

一、环境要求

  • Java: 1.8+
    • 检查:java -version
  • MySql:5.6.5+
    • 检查:SHOW VARIABLES WHERE Variable_name = 'version';

二、部署步骤

2.1 导入数据库生成脚本

官方提供的数据库脚本有两个,在scripts/sql下,apolloportaldb.sqlapolloconfigdb.sql

// 创建:ApolloPortalDB
source /your_local_path/sql/apolloportaldb.sql
// 创建:ApolloConfigDB
source /your_local_path/sql/apolloconfigdb.sql
// 检查是否导入成功:
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;

2.2 Apollo自身的一些配置

2.2.1 配置ApolloPortalDB.ServerConfig

  • 1.apollo.portal.envs – 可支持的环境列表:

默认值是dev,多个以逗号分隔即可(大小写不敏感),如:

DEV,FAT,UAT,PRO

注意:只在数据库添加环境是不起作用的,需要配合修改scripts/build.sh,添加新增环境对应的meta server地址。

  • organizations – 部门列表:
[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
  • wiki.address: portal上“帮助”链接的地址,默认是Apollo github的wiki首页。

####2.2.2 配置ApolloConfigDB.ServerConfig

  • 1.eureka.service.url – Eureka服务Url,如有多个,用逗号分隔(注意不要忘了/eureka/后缀):
http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/

2.3 配置数据库连接信息

  • vim scripts/build.sh
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

2.4 配置各环境meta service地址

  • vim scripts/build.sh:修改各环境meta service服务地址。 如果某个环境不需要,也可以直接删除对应的配置项
dev_meta=http://localhost:8080
fat_meta=http://localhost:8080
uat_meta=http://localhost:8080
pro_meta=http://localhost:8080

2.5 执行编译、打包

./build.sh 

2.6 部署运行

2.6.1 部署apollo-configservice

apollo-configservice/target/目录下的apollo-configservice-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

cd apollo-configservice/target/
scp apollo-configservice-x.x.x-github.zip 209:/opt/apollo/config
ssh 209
cd /opt/apollo/config
unzip apollo-configservice-x.x.x-github.zip
运行:./scripts/startup.sh
停止:./scripts/shutdown.sh

注:如要调整服务的监听端口,可以修改startup.sh中的SERVER_PORT。另外apollo-configservice同时承担meta server职责,如果要修改端口,注意要同时修改scripts/build.sh中的meta server url信息以及ApolloConfigDB.ServerConfig表中的eureka.service.url配置项。

2.6.2 部署apollo-adminservice

同上:

apollo-adminservice/target/目录下的apollo-adminservice-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

注:如要调整服务的监听端口,可以修改startup.sh中的SERVER_PORT

2.6.3 部署apollo-portal

同上:

apollo-portal/target/目录下的apollo-portal-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

apollo-portal的默认端口是8080,和apollo-configservice一致,所以如果需要在一台机器上同时启动apollo-portal和apollo-configservice的话,需要修改apollo-portal的端口。直接修改startup.sh中的SERVER_PORT即可,如SERVER_PORT=8070

三、Java客户端使用

3.1 配置Appid

classpath:/META-INF/app.properties文件:

app.id=YOUR-APP-ID

3.2 配置Environment

  • 对于Mac/Linux,文件位置为/opt/settings/server.properties
  • 对于Windows,文件位置为C:\opt\settings\server.properties

保证settings目录文件权限:chmod 777 /opt/settings

文件内容形如:

env=DEV

3.3 配置本地缓存路径

本地缓存路径位于以下路径,所以请确保/opt/dataC:\opt\data\目录存在,且应用有读写权限。

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data{appId}\config-cache

保证data目录文件权限:chmod 777 /opt/data

3.4 配置日志地址

保证logs目录文件权限:chmod 777 /opt/logs

3.5 Maven Dependency

<dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>0.7.0</version>
 </dependency>

3.6 使用

@Configuration
@EnableApolloConfig
public class AppConfig {
  
}
@ApolloConfig
private Config config;

@Test
public void testApollo(){
	String name = config.getProperty("name", "hello");
    assertEquals(name,"Acheron");
}

使用canal实现redis缓存刷新

背景

假设现有项目P1,是直连数据库(mysql)的。为了提高性能,现在要加上缓存(redis),但是另有项目P2,也对数据库有操作,如何保证当P1加上redis后,P2对数据库修改后,P1从redis中获取的数据是最新的。有两种方案:

  • 一种是P1的开发人员和P2开发人员协调,当P2对mysql有修改、增加等操作,必须清除P1使用到的相关缓存。当P1读redis时,发现缓存失效,再读mysql,获取最新数据。
  • 一种是利用阿里巴巴的canal,获得mysql-binlog,根据mysql-binlog清除相关的缓存。这种方法的好处是不需要修改原来的程序。

使用到的技术

部署配置canal

canal的部署可以参考官方文档:https://github.com/alibaba/canal/wiki/QuickStart 配置的时候要注意:

  • conf/canal.properties是canal本身的配置文件,基本上默认即可
  • conf/example/instance.properties:应用的配置参数,一般需要修改其中的数据库连接配置

使用

1.启动canal:

sh bin/startup.sh

canal 的官方例子: https://github.com/alibaba/canal/wiki/ClientExample

利用canal解析mysql-binlog,能够获取到执行的sql,修改的表数据等信息,我这里获取修改的表,根据表名去清除掉使用到这个表的相关缓存,所以这里有一个对应关系:表名--缓存key

这里表名和缓存key的对应关系,为了方便,我将其存在一个属性文件中:cache.properties,并提供一个web界面来维护这个文件。

2.配置cache.properties

在计算机上任一位置建一文件:cache.properties,在项目的application.properties中有一属性:cache.properties.path,指向cache.properties文件的位置:

cache.properties.path=/Users/acheron/cache.properties

2.配置redis

util/RedisUtil.java中配置redis相关信息,主要是以下三项:

// Redis的地址
private static String HOST = "127.0.0.1";
// Redis的端口号
private static int PORT = 6379;
// 访问密码
private static String PASS = null;

3.添加表-缓存key配置

运行项目,浏览器访问,添加一条记录,数据将会保存到cache.properties

table_name1=herohuang'skey
table_name2=user.name.haha
table_name3=hahaha,com.hero,com.herohuang*
table_name4=com.hahaha,user.name.key,test

注意cachekey的配置:

  • 如果有多个,则用英文逗号隔开
  • 如果要删除所有以com.herohuang开头的缓存,则可以com.herohuang*

源码地址:https://github.com/Ac-heron/hexo-canal

界面展示

canal1canal2