月度归档: 2016 年 1 月

  • Spring Cloud Task

    Spring Cloud Task是Spring Cloud下的一个新项目,1.0.0.M1版不久前才发布。

    Spring Cloud项目簇是针对云平台的,然而对于大部分云平台,任何运行于之上的应用都是长实效的,如果退出,那么平台会自动重启它们已达到“恢复“的目的。

    但是有些需求并不是这样的,可能存在一个生命周期极短的应用,它是定时执行的,当结束之后我并希望平台自动重启它,可能的话也希望能够获得应用运行的细节,比如起始时间,退出值等等。这就是Spring Cloud Task希望解决的问题。

    目前该项目只有一个注解@EnableTask,支持主流数据库,能够获得应用(或者任务)的相关信息,也提供了生命周期的管理和对应的代码执行切面方便自定义。

    附上简单的示例代码一份

    @SpringBootApplication
    @EnableTask
    @EnableConfigurationProperties({ TimestampTaskProperties.class })
    public class TaskApplication {
    
    	@Bean
    	public TimestampTask timeStampTask() {
    		return new TimestampTask();
    	}
    
    	public static void main(String[] args) {
    		SpringApplication.run(TaskApplication.class, args);
    	}
    
    	/**
    	 * 
    …
  • 手绘

    最近换了一只新的笔,感应充电的,价格极低,不得不感慨一下技术进步


    …

  • Spring Security的response header

    Spring Security会默认配置若干个相关的HeaderWriter,比如HstsHeaderWriter、XXssProtectionHeaderWriter等。

    默认情况下响应的头部类似这样

    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: 0
    X-Content-Type-Options: nosniff
    Strict-Transport-Security: max-age=31536000 ; includeSubDomains
    X-Frame-Options: DENY
    X-XSS-Protection: 1; mode=block

    这其中有五个HeaderWrite,撇开第一个Cache Control不谈,因为主要是涉及旧版本迁移,剩下了四个。

    Content Type Options

    这个选项是由于浏览器对于资源会去“猜”。如果返回的资源没有指明类型,那么浏览器就会自己去判断。自动去判断内容是危险,可以构造出XSS攻击。

    X-Content-Type-Options: nosniff

    当然开启这一特性那么就必须在返回的资源中指明类型,不然会出现无法正确解析的情况。

    HTTP Strict Transport Security

    一些网站自身就可以同时通过http和https访问,而有些只允许https访问,设置对应的头

    Strict-Transport-Security: max-age=31536000 ; 
    …
  • Spring boot中使用WebJars

    一个Java Web项目或多或少需要是一些javascript或者css依赖,比较容易想到的办法就是用前端构建工具管理依赖,然后直接拷贝到Webapp目录,当然spring boot对于静态资源还支持一下几个位置:

    "classpath:/META-INF/resources/"
    "classpath:/resources/"
    "classpath:/static/"
    "classpath:/public/"

    我对于前端管理工具并不喜欢,也不想安装诸如node等相关环境,这个时候就可以试用WebJars了。

    WebJars

    WebJars将前端资源打包到jar中,这样开发人员就可以简单的管理依赖,并且可以使用已有的JVM base构建工具和生态链,同时对于RequireJS也有一些自动化支持。

    在Spring Boot中使用WebJars是非常简单的,简单的引入依赖就可以,所有资源都暴露在 /webjars/** 下,只要你知道版本号和文件名,就可以直接在前端页面中引用相关资源。

    Spring Boot的支持

    在Spring Boot中使用WebJars如此简单,主要是因为Spring Boot有一个默认的支持,是否启动对应配置的条件在OnEnabledResourceChainCondition类

    class OnEnabledResourceChainCondition extends SpringBootCondition {
    
    	public static final String WEBJAR_ASSERT_LOCATOR = "org.webjars.WebJarAssetLocator";
    
    	@Override
    	public ConditionOutcome getMatchOutcome(ConditionContext context,
    			AnnotatedTypeMetadata metadata) {
    		
    …
  • Docker container的监控

    迁移到Docker以后遇到的一个问题就是监控上的,比如当前资源消耗如何等等。

    之前的监控是用的OneAPM,但是都是应用级别的,需要不同的应用安装不同的探针。

    虽然也有很多可以监控Docker容器的,但是要在服务器安装服务我确实又不太想,找了一下发现OneAPM支持Docker化安装探针。

    对应镜像的构建脚本可以看这里,官方的老是启动不起来,我就自己构建了一个。

    在DaoCloud直接部署

    agent

    然后就直接去OneAPM控制台看结果了

    docker-info

    可以很容易看到每个container的内容消耗,也可以自己定义仪表盘。…

  • 迁移遗留项目到Docker

    结合DaoCloud体验了几天Docker,感觉非常的不错,所以也准备把已有的一个项目也迁移到Docker上。

    遗留项目

    这个项目是一个Java的Web项目,需要Java8环境,使用了Spring Boot,自带了运行容器,可以直接 java -jar 启动。项目使用了MySql数据库,没有用什么专有特性。数据库中数据也不多,可以mysqldump来迁移。

    迁移数据库

    先从数据库开始吧,原有数据库监听于3306端口,和应用一个主机。第一步打算就是先docker化数据库,但是仍然绑定端口在3306上,这样可以在只迁移数据库的情况下依然保证整个应用可用。

    先去Daocloud的应用编排里面创建一个新的应用

    db:
      image: mariadb
      restart: always
      ports:
      - 3306:3306
      volumes:
      - /alidata/data/acgmo-data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=你的密码

    然后直接连接到这个数据库

    mysql -u root -p 数据库名 < bak.sql

    完成后直接重启java web应用,看看应用是不是一切正常。

    迁移Java Web项目

    这个就稍微复杂一些了,因为mysql啥的中央库都有,不需要自己构建。但是这个就必须自己构建了。

    DaoCloud提供了代码构建功能,也支持bitbucket的私有库,唯一需要做的就是添加一个Dockerfile来构建,当然如果不想添加到代码库中也可以使用云Dockerfile功能。

    比如这个项目的Dockerfile如下

    FROM 
    …
  • DaoCloud基于Docker快速搭建wordpress

    DaoCloud基于Docker快速搭建wordpress

    一直使用Java生态圈,自己的机器,服务器上都是java环境,也没有用过太多php的东西。

    想迁移博客到wordpress上觉得网上教程那么多,总有办法的,结果一下子就折腾了很多天。

    服务器原来是有nginx和mysql的,但是都不是用apt-get安装的,是阿里云镜像市场找的,所以启动目录,配置位置都不一下。本来想试试nginx+php的,但是网上教程很多,操作每一步也是一样的,但是就是没有效果,连个php helloworld都没有。再 尝试了apache+php,很顺利,因为都是可以apt-get安装的,但是装好了wordpress提示没有mysql的支持。本来简简单单一个

    apt-get install php5-mysql

    就可以搞定,但是它依赖了mysql-common,这样原来的mysql就坏掉了。还好有阿里云快照,尝试手动安装,但是很不顺利,索性准备用docker。

    Docker之前用过,但是主要是有很多免费的docker container,基本是为了当临时免费主机使用。要我完全用Docker搭建wordpress还是有困难的,命令行也不顺,操作和日志都是问题。

    DaoCloud之前用过免费加速,这次就装上了集群管理,安装步骤很简单

    docker-machine

    安装好以后直接用应用编排功能

    wordpress:
      image: wordpress
      restart: always
      links:
      - db:mysql
      ports:
      - 127.0.0.1:8020:80
      volumes:
      - /alidata/data/blog-www:/var/www/html
    db:
      image: mariadb
      restart: always
      volumes:
      - /alidata/data/blog-data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=密码随意

    创建以后自动启动…

  • 迁移博客到wordpress

    之前一直使用的hexo,静态博客生成系统,对于服务器要求低,用markdown书写。

    但随着自己使用阿里云服务器开始,hexo的优势就越发削弱。服务器可以自己控制,环境自然不是问题,反过来客户端的种种环境需要限制了书写的便利性。

    前思后想,还是将博客迁到wordpress上,万幸的是hexo的文章地址和wordpress基本一样,也就省去了很多流量损失。加上wordpress的搜索引擎友好性不错,有ping功能和搜索引擎的各种插件,基本不太担心这块。

    谈到迁移,hexo是可以导出rss的,但是这个是atom那种,wordpress导入识别不了,找了一个atom专用的导入插件,但是导入的格式太诡异,特别是代码那块问题太多,索性干脆自己抓取原博客,通过rest api导入。

    wordpress需要安装两个插件wp rest api和json basic auth。后者可以直接用用户名密码认证,我直接在本地搭建一个wordpress先迁移好,再导出wordpress格式导入线上环境,确认无误之后再修改nginx反向代理的指向。之前用hexo是静态托管,现在改成反向代理。

    wordpress有很多周边生态,比如我现在使用的手机客户端,随时都能码字。…