0%

2018年9月,七牛云回收了所有测试域名,这直接导致各种博客系统的所有图片资源全部失效,包括了我自己的solo博客,这个项目记录了这个问题的解决办法

案例代码:github/hand-solo-pic-url

解决步骤

  • 登录七牛云后台,配置自己的域名

    • 详细步骤:七牛云后台 -> 域名管理 -> 添加域名 -> 添加自己的域名记录(比如我的 oss.liumapp.com)

    • 注意事项:七牛云会要求您的域名必须完成备案,否则无法添加,并且添加成功后,七牛云会提供一串CNAME地址,您需要把这串CNAME地址跟自己的域名解析起来。

  • 在七牛云后台配置对象存储

    • 详细步骤:七牛云后台 -> 对象存储 -> 选择自己的存储空间 -> 内容管理 -> 设置外链默认域名为刚刚配置成功的域名(oss.liumapp.com)

    • 注意事项:添加域名后,需要等待七牛云的审核,审核通过后才可以进行这一步的操作,操作完成后,可以在内容管理列表中,直接选择一张图片来看看外链地址:(一般长这样:http://oss.liumapp.com/004a8d56bba1416a8e004447a65bcf08.jpg)

  • 接下来修改solo数据库,把所有博文的图片资源地址中的测试域名,替换为自己刚刚设置好的域名(oss.liumapp.com)即可

    • 替换sql:

      SET SQL_SAFE_UPDATES = 0;
       UPDATE b3_solo_article SET articleContent = REPLACE( articleContent,'http://你之前七牛测试域名地址','http://oss.liumapp.com') ;

      我之前的七牛测试域名是:http://om40sen9v.bkt.clouddn.com,那么sql就是:

      UPDATE b3_solo_article SET articleContent = REPLACE( articleContent,'http://om40sen9v.bkt.clouddn.com','http://oss.liumapp.com') ;

      在sql命令行或者相关工具中对文章表(大D在新版本的solo中似乎改动了数据表,所以您在操作之前,请确认一遍表名与字段名是否匹配)进行修改。

      各位看官读到这里,基本上就解决了自己博客图片资源路径失效的问题,但是我这里还想做一些特殊操作,接下来记录的内容,介绍了如何将七牛云的图片资源转移到GitHub上(换句话说,就是利用GitHub作为自己站点的OSS存储服务,我之所以想要这么折腾一番,是希望在后续将博客的前后端进行分离实现,前端整体部署到GitHub,后端则利用自己的ECS资源仅仅提供API服务)。            
  • 使用GitHub存储所有博客图片:

    • 首先可以使用官方推荐的python脚本(script/download-process.py)将七牛云oss.liumapp.com空间上的所有资源下载下来

    • 对python不熟悉的同学,手撸Java代码,再通过七牛云的api也是可以达到批量下载的目的(src/main/test/…/APITest.java)

      • APITest.java的getItemList方法为获取你七牛云空间的所有文件信息

      • APITest.java的downloadAllFile方法为下载你七牛云空间的所有文件

      • 注意事项:在运行之前,你需要首先配置src/main/java/…/resources/application.yml文件,填写自己的七牛云appkey以及secretKey等信息

      • 另外在下载过程中,要考虑目录层级、目录权限的事情(案例代码里面已经全部解决这些问题了,如果看官自己写的话请留意一下)

        附上一张下载完成后的截图

        1.png

    • 完成所有图片的下载后拷贝上传GitHub…再同样的方法修改图片url即可,记得再最后面引用图片的时候带上 ?raw=true 参数

阅读全文 »

给定一串url,如何用最高效的方式下载到本地,这篇博文记录了Java IO与NIO两种实现方式,并对实现原理进行了一定梳理。

案例代码:github/qtools/UrlDownloadTool.java

1.1 使用JavaIO

就下载文件而言,一般最常使用的就是Java IO。直接用URL类就可以跟网络资源建立连接再下载,并通过openStream()方法来获得一个输入流。

1
BufferedInputStream in = new BufferedInputStream(new URL(FILE_URL).openStream());

上面的代码,我用到了BufferedInputStream,通过缓存的形式来提升性能:

每一次用read()方法读取一个字节时,都会调用一次底层文件系统,所以每当JVM调用read()的时候,程序执行上下文都会从用户模式切换到内核模式,执行结束后再切换回来。

从性能角度来看,这种上下文切换的成本是高昂的:比如我们在读取一个字节数很高的文件时,大量的上下文切换将会很影响程序性能。

所以这里我们最好使用BufferedInputStream来规避这种情况(具体原理请见下文)

而要把读取到的URL文件字节写入到本地文件,一般直接用FileOutputSream类的write()方法就可以了:

阅读全文 »

Java中生产者与消费者问题的演变

原文链接:https://dzone.com/articles/the-evolution-of-producer-consumer-problem-in-java

作者:Ioan Tinca

译者:liumapp

想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题。

生产者消费者问题是一个典型的多进程同步问题。

对于大多数人来说,这个问题可能是我们在学校,执行第一次并行算法所遇到的第一个同步问题。

虽然它很简单,但一直是并行计算中的最大挑战 - 多个进程共享一个资源。

问题陈述

生产者和消费者两个程序,共享一个大小有限的公共缓冲区。

阅读全文 »

译:在Docker中运行Spring Boot的高级功能测试

原文链接:https://dzone.com/articles/advanced-functional-testing-in-spring-boot-by-usin

作者:Taras Danylchuk

译者:liumapp

想要学习更多有关Spring Boot项目的功能测试吗?阅读这篇博客可以让您掌握如何利用Docker容器进行测试。

概览

本文重点介绍如何使用Spring Boot进行功能测试的一些最佳实践。我们将演示如何在不设置模拟环境的情况下将服务作为黑盒测试的高级方法。

本文是我之前这篇文章 Native Integration Testing in Spring Boot 的后续。

因此我将参考上一篇文章来介绍这两种测试方法的区别。

我建议你在阅读这篇文章之前先了解上一篇文章。

阅读全文 »

在Spring Boot 1.x系列下,大部分情况我们都是使用Jedis来与Redis建立连接,但如果切换到Spring Boot 2.x系列呢?

在SpringBoot 2.x系列我们要使用Redis,按照官方的说明,直接引入依赖:

org.springframework.boot spring-boot-starter-data-redis

即可使用,但是用习惯Jedis的同学可能会碰到以下异常:

Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.JedisPoolConfig

因为Spring Boot 2.x系列默认使用的Redis连接为Lettuce,而非Jedis

所以比较习惯使用Jedis的小伙伴们,请一定记得排除Lettuce依赖,并额外引入Jedis依赖

org.springframework.boot spring-boot-starter-data-redis io.lettuce lettuce-core redis.clients jedis
阅读全文 »

Spring Boot Admin 2.x是一个用于监测管理微服务应用的程序,通过Eureka注册中心发现服务,然后获取服务的运行状态、日志信息、并提供一套UI界面供系统运维人员检查,同时结合Spring Security进行登录权限认证

首先上完整的Github项目代码: liumapp/spring-boot-admin-in-docker

然后是完整的Wiki文档:使用文档

所需依赖

  • spring boot 2.0.2

  • spring cloud Finchley.RELEASE

  • codecentric的spring-boot-admin 2.0.2

  • docker及docker-compose

  • maven

快速启动

更新admin-server和admin-client的application.yml配置文件

1
2
3
spring:
profiles:
active: docker

使用以下命令安装docker镜像

1
./build-image.sh
阅读全文 »

Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢?

解决办法其实还是用mysqldump命令,但是我们需要进入docker的mysql容器内去执行它,并且通过配置volumes让导出的数据文件可以拷贝到宿主机的磁盘上

所以操作步骤就可以分为:

  • 配置docker的volumes

  • 进入docker的mysql容器,导出数据文件

至于数据导入,太过简单,就不说了

配置volumes

首先我是利用docker-compose进行docker容器的编排,完整的配置代码请看这个项目: liumapp/rabbitmq-mysql-redis-in-docker

请注意这个项目的docker-compose.yml配置文件中,有以下几行:

mysql:
   container_name: mysql
   image: mysql:5.5.60
   restart: always
   volumes:
     - ./mysql/data:/var/lib/mysql
     - ./mysql/conf/mysqld.conf:/etc/mysql/mysql.conf.d/mysqld.cnf

我对mysql容器配置的volumes,是把项目的mysql/data目录和docker容器内的/var/lib/mysql建立映射关系

阅读全文 »

出于某种原因,原先在GitHub上设定的ssh key无法使用了,因此每一次在我本地提交代码都需要输入username&password,神一般的烦,恰巧又忘记之前是怎么设置的….索性写篇博文记录一下…

其实总共的操作只需要两步,换成人话来说,就是我们自己整一个证明我自己的凭证,然后复制一份给GitHub,告诉它,下次我提交代码给你看这个凭证,你看了后就以我的名义记录这次提交,不要再问账号密码这些鬼东西了…

接下来用实战来介绍

在本地创建登录凭证

这里假设您使用的操作系统为Mac OS(如果看官还在使用Windows的话,请弃坑吧)

打开terminal,执行下述命令

ssh-keygen -t rsa -b 4096 -C "liumapp.com@gmail.com"

此处邮箱地址请填写您的GitHub邮箱地址

接下来一切按照默认值敲回车即可,但是在设置口令的时候,还请留意一下,请千万不要设置口令(不然每次提交都要输入凭证口令,想想都烦)

接下来创建好的ssk key默认会存放在

阅读全文 »

Java8对JavaDoc的语法检查非常严格,我在进行Maven编译发布项目到Maven Center的过程中,经常产生因为JavaDoc编译失败造成发布失败,但是很多情况下,都是一两个@param参数没有写全,@return没有写之类的问题,为此,我觉得非常有必要忽略这些异常。

问题描述

各位应该都知道发布一个Maven项目到Maven的中央仓库是必须要有JavaDoc,而我们在使用Maven JavaDoc plugin的过程中,一旦出现某些类似于此的问题:

Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.7:jar (attach-javadocs) on project [projectname]: MavenReportException: Error while creating archive:
Exit code: 1 - [path-to-file]:[linenumber]: warning: no description for @param

都会造成整个发布过程失败,解决办法一般是一个一个的把这些@param加上去,一两个还好,如果您的项目有成千上万个呢?

解决办法

直接修改Maven JavaDoc plugin的配置,忽略这些错误:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.10.3</version>
  <executions>
    <execution>
      <id>attach-javadocs</id>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration> 
        <additionalparam>-Xdoclint:none</additionalparam>
      </configuration>
    </execution>
  </executions>
</plugin>

经过测试,忽略后项目可以正常发布,不会有什么影响。

阅读全文 »

在阿里云服务器CentOS7上部署一个典型的SpringBoot + Maven + Docker项目,一路下来的坑还真不少。

问题概览

从初始化服务器磁盘开始,到安装maven + jdk8 + docker + docker-compose等相关环境,再到项目部署,总是会遇到各种地址无法访问

举几个例子:

  • Maven默认使用的中央仓库地址在阿里云服务器(华北地区)上无法访问,导致依赖无法正常加载;

  • docker-composer的安装一般是从GitHub上拉release下来:”https://github.com/docker/compose/releases/tag/1.16.1" ,可是阿里云服务器(华北地区)依然无法访问这个地址,导致docker-composer安装失败

  • docker在进行镜像部署的时候,有时候需要从dockerhub上下载依赖镜像(很多时候是需要的),可是阿里云服务器(华北地区)仍然无法访问dockerhub,导致容器镜像安装失败

请注意,这里加了一个华北地区,因为经过测试,我发现香港地区的阿里云服务器是不存在上述这些问题的

解决办法

首先是环境安装的问题,我是利用自己的脚本: Github: liumapp/install-docker-compose 来完成docker + docker-composer + jdk8 + maven环境的安装,安装过程中就会出现服务器无法访问docker-composer在GitHub上的release,从而导致docker-composer二进制文件的下载失败

我这里用的解决办法比较简单,切换到香港的阿里云ECS,再去拉docker-composer的release,完了再用ftp放到华北地区的ECS上…

第二个问题是Maven的依赖问题,这个问题之前我总结过 Maven依赖下载失败的原因及解决方案 ,改用阿里的Maven镜像仓库地址即可,具体配置文件位于/opt/maven/conf/settings.xml(如果您也使用我的脚本进行安装的话)

阅读全文 »