重装系统后程序员要做哪些事

上周我的笔记本主板坏掉了,因为还在保修期内,在apple官方店免费换了主板,也重新安装了系统,花了一天时间,尽量把电脑还原到原先工作状态,我有一套自己熟悉的工作环境,各种常用的设置、工具、软件,大致列个清单,记在这里。

Mac Pro 设置

  • 同步iCloud

  • 自定义touchbar

  • 自定义Trachpad

  • 配置dock

  • 配置Notifications

  • 设置夜览

  • 关闭蓝牙和Siri

  • 设置时间显示

  • 设置keyboard

  • 设置Users & Groups

  • 设置Spotlight

  • 设置输入法

开发环境

  • 安装JDK

vim ~/.zshrc
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0/Contents/Home
export JAVA_HOME=$JAVA_HOME
source ~/.zshrc
  • 配置自定义vimrcsudo cp /usr/share/vim/vimrc ~/.vimrc

  • 安装homebrew

    • fy:xwjdsh/fy

    • nba-live

  • 安装node

    • http-server

  • 安装Python

  • 安装oh-my-zsh

    • wd

    • zsh-autosuggestions

    • extract

    • ZSH_THEME=”ys”

开发工具

  • 安装Intellij IDEA

    • maven

    • Imports

    • File Types

    • plugins

    • Comand+c/option+m/F1

  • 安装DataGrip

  • 安装WebStorm

  • 安装Sourcetree:google帐号登录

  • 安装jemter

  • 安装nginx

  • 安装tomcat

  • 安装mysql

  • 安装docker

  • 安装redis

  • 安装MongoDB

  • 安装zookeeper

  • 安装Visual Studio Code

  • 安装maven,配置settings.xml

  • 安装Postman:google账号登陆

  • 安装StarUML

  • 安装vmware

  • 安装canal

常用工具

  • 安装item2option+space

  • 安装git

git config --global user.email "email"
git config --global user.name "Acheron"
  • 安装mycli alias

  • 安装spacevim

  • 安装Hexo

网络软件

  • 安装chrome

    • 我所有的设置,扩展,书签都存在google

  • 安装mumu

  • 安装MindNode

  • 安装钉钉 工作用

  • 安装pomotodo

  • 安装坚果云

  • 安装typora

  • 安装teamviewer

  • 安装lantern

  • 安装ShadowsocksX

  • 安装Unarchiver

  • 安装LICECap

  • 安装Jump desktop

一些配置

  • 安装ssh

    • 配置config

  • 安装rime

  brew cask install squirrel
  cd /Library/Input Methods/Squirrel.app/Contents/SharedSupport
  cp wubi_pinyin.schema.yaml /Users/acheron/Library/Rime
  cd /Users/acheron/Library/Rime
  vim default.yaml
  在schema_list下增加  - schema: wubi_pinyin
  重新deploy
  在打字过程中按`Ctrl+`` 选择
  • 配置apollo

    1.
    /opt/settings/server.properties
    /opt/data
    2.
    chmod 777 /opt/settings
    chmod 777 /opt/data
    3.
    env=FAT
    idc=test
  • Git项目导入

git remote -v
git remote add upstream http://xxx.git
git fetch upstream
git branch -av
git merge upstream/develop
  • 新建目录Work:

    • software :wd add s

    • IdeaProjects :wd add i – FrontEnd – choice – life – opensource

    • ichoice:wd add c

笔记:SpringBoot如何集成Maven的profile功能

什么是profile

开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,他们的配置文件一般不同。当我们要向各个环境发布程序时,需要人工处理这些配置文件,这显然麻烦且易错。有了profile,一切问题就简单了。只要在maven打包时使用下面命令即可。

 mvn clean package -Dmaven.test.skip=true -P prod

-P prod 就是告诉maven要使用名字为prod的profile来打包,这样打包后的jar包或war包,配置文件里的配置就是prod环境的。

实现思路

maven支持profile功能,当使用maven profile打包时,可以打包指定目录和指定文件,且可以修改文件中的变量。spring boot也支持profile功能,只要在application.properties文件中指定spring.profiles.active=xxx 即可,其中xxx是一个变量,当maven打包时,修改这个变量即可。

具体实现

一个springboot项目,工程中src/main/resourses目录下有以下4个配置文件:

  • application.properties: 包含通用配置的文件。文件中有spring.profiles.active=@profiles.active@的属性。这里的profiles.active和下面pom.xml配置中的profiles.active属性名要一致。这样,在运行mvn命令时,maven就会帮我们将@profiles.active@替换成指定的profile。
  • application-dev.properties: 当-P dev时, 打包这个文件。
  • application-test.properties: 当 -P test时,打包这个文件。
  • application-prod.properties: 当 -P prod时,打包这个文件。

在(父)pom.xml中定义maven的如下各个环境的profile配置,这里的profiles.active属性名可以自定义,其中test环境是默认激活的(activeByDefault为true),这样如果在不指定profile时默认是test环境。

  <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>pre</id>
            <properties>
                <profiles.active>pre</profiles.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>
    </profiles>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
					<exclude>application-dev.properties</exclude>
					<exclude>application-test.properties</exclude>
					<exclude>application-pre.properties</exclude>
					<exclude>application-prod.properties</exclude>
				</excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
					<include>application-${profiles.active}.properties</include>
					<include>application.properties</include>
				</includes>
            </resource>
        </resources>
    </build>

说明:

  1. 这里的excludes 表示打包时,过滤多余其它目录或文件,比如过滤目录:
                <excludes>
					<exclude>dev/*</exclude>
					<exclude>test/*</exclude>
					<exclude>pre/*</exclude>
					<exclude>prod/*</exclude>
				</excludes>
  1. includes表示打包,指定要包含的文件,其中${profiles.active}会根据指定的profile动态替换,当然一般不需要过滤或指定,如下配置就可以了:
 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
  1. filtering 设置true表示处理文件时,可以对文件进行动态替换
  2. 在application.properties属性文件中替换变量时,使用@符号,而不是$, maven的maven-resources-plugin可以定义这个替换的符号。
spring.profiles.active=@profiles.active@
  1. 怎么在启动spring boot应用时,打印正在使用的profile,避免配置错误
public static void main(String[] args) {
  ApplicationContext ctx = SpringApplication.run(RestApiApplication.class, args);
  String[] activeProfiles = ctx.getEnvironment().getActiveProfiles();
  for (String profile : activeProfiles) {
    logger.warn("Spring Boot 使用profile为:{}" , profile);
  }
}

参考:

配置管理平台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

分布式跟踪工具Pinpoint技术入门

本文初衷

因为工作需要,这周研究了一下APM(Application Performance Management)相关技术,看了些许资料,对比了各种技术的特点,最终选择Pinpoint作为性能监控工具,本文的主要目的是记录本人部署Pinpoint的过程。

Pinpoint是什么

简单的说,Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统分布式跟踪系统。我们知道,前端向后台发起一个查询请求,后台服务可能要调用多个服务,每个服务可能又会调用其它服务,最终将结果返回,汇总到页面上。如果某个环节发生异常,工程师很难准确定位这个问题到底是由哪个服务调用造成的,Pinpoint等相关工具的作用就是追踪每个请求的完整调用链路,收集调用链路上每个服务的性能数据,方便工程师能够快速定位问题。

同类工具

为什么要用Pinpoint

最重要的原因,对代码的零侵入,运用JavaAgent字节码增强技术,只需要加启动参数即可。

Pinpoint架构图

pinpoint-architecture

(图片出处:官网)架构说明:

  • Pinpoint-Collector:收集各种性能数据
  • Pinpoint-Agent:和自己运行的应用关联起来的探针
  • Pinpoint-Web:将收集到的数据显示成WEB网页形式
  • HBase Storage:收集到的数据存到HBase中

开始部署

前提条件

  • maven 3.2.x+
  • git
  • java 6+

0. 开始

1. 部署Hbase

Pinpoint以Hbase作为数据的存储。

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
  • 编辑hbase-site.xml:
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>file:///Users/acheron/Tmp/hbase</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/Users/acheron/Tmp/zookeeper</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2182</value>
  </property>
</configuration>

这样配置是本地单实例模式启动,上面配置分别表示:数据存放地点、zookeeper数据存放地点、zookeeper端口号(默认2181)。当然这个文件可以不配置,那么会采取默认值

启动hbase的时候,hbase用得是自带的zk,在hbase的配置里可见 export HBASE_MANAGES_ZK=true;

  • 进入hbase/bin目录启动hbase:./start-hbase.sh
  • jps命令查看Hbase是否启动成功,如果启动成功的会看到”HMaster”的进程
  • 初始化pinpoint需要的表:./hbase shell hbase-create.hbase (这里的hbase-create.hbase在源码pinpoint/hbase/scripts/hbase-create.hbase)
  • 访问页面测试是否成功:http://localhost:16010/master-status ,如果成功在页面的tables标签下能看到导入的表。
  • 也可以用命令来查看是否导入表成功,进入hbase,输入”status ‘detailed'”可以查看初始化的表
./hbase shell
status 'detailed'

2. 部署Pinpoint-collector

  • 将pinpoint-collector-1.6.0-SNAPSHOT.war放到tomcat-collector-8086/webapps/下,并重命名为ROOT.war
  • 启动tomcat,配置ROOT/WEB-INF/classes/hbase.properties:
hbase.client.host=localhost
hbase.client.port=2181

指向zookeeper的地址和端口,如果是本机,端口默认,则这里不需更改。

  • 配置上面后,重启tomcat(端口8086

3. 部署Pinpoint-web

Pinpoint-web的配置和Pinpoint-collector相似:

  • 将pinpoint-web-1.6.0-SNAPSHOT.war放到tomcat-web-8085/webapps/下,并重命名为ROOT.war
  • 启动tomcat,配置ROOT/WEB-INF/classes/hbase.properties:
hbase.client.host=localhost
hbase.client.port=2181

指向zookeeper的地址和端口,如果是本机,端口默认,则这里不需更改。

  • 配置上面后,重启tomcat(端口8085

4. 部署Pinpoint-agent

  • 新建目录:mkdir pp-agent
  • 将pinpoint-agent-1.6.0-SNAPSHOT.tar.gz 拷贝到pp-agent目录并解压
  • 配置pinpoint.config:profiler.collector.ip=127.0.0.1这是指pinpoint-collector的地址,如果是同一服务器,则不用修改。其它默认。
  • 安装pinpoint-collector启动后,自动就开启了9994,9995,9996的端口了,这里默认即可。如果有端口需求,要去pinpoint-collector的配置文件(“pinpoint-collector/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties”)中,修改这些端口。

5. 部署TestApp

  • 官方提供了一个测试用的应用,pinpoint-quickstart-testapp-null.war,将其重命名为ROOT.war,部署到tomcat-testapp-8084
  • 修改此tomat的/bin/catalina.sh,在106行左右加入启动参数:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/Users/acheron/pinpoint/pp-agent/pinpoint-bootstrap-1.6.0.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=myapp"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=MyTestPP"

第一行:pinpoint-bootstrap-1.6.0.jar的位置

第二行:这里的agentId必须唯一,标志一个jvm。

第三行:applicationName表示同一种应用:同一个应用的不同实例应该使用不同的agentId,相同的applicationName。

6. springboot包部署

如果是jar包部署,直接在启动命令加启动参数:

nohup java -javaagent:/Users/acheron/pinpoint/pp-agent/pinpoint-bootstrap-1.6.0.jar -Dpinpoint.agentId=acheron-consumer -Dpinpoint.applicationName=acheron-consumer -jar myapp.jar &

7.效果演示

hbase和各应用都启动成功之后,访问Pinpoint-web,效果:

pinpoint-page

结束语

各大APM工具,几乎都是根据google这篇经典的Dapper论文而来,一定要读一读。这里是它的源文地址:https://research.google.com/pubs/pub36356.html,感谢这位同学的翻译:http://bigbully.github.io/Dapper-translation/

参考文章