你们中有些人可能知道,在过去的一年中,我从事一个名为JVM Bloggers的宠物项目,目标是在波兰Java开发人员社区中普及博客和知识共享。 我们每周发送摘要,其中包含最近7天内发布的新博客文章和新视频。
在过去的几周中,该项目进行了两项重大更改:
- 部署使用Docker Compose完成
- 所有点击都通过了应用程序,因此我们可以收集一些统计信息
Docker撰写
以前,应用程序是使用两个单独的Docker部署的,这是使事情顺利进行的更简单方法,但是随着我们转向微服务架构,我知道Docker Compose将是一个不错的选择,使我们能够轻松地向系统中添加越来越多的元素。
首先,需要使用两个服务创建docker-compose.yml :jvm_bloggers_db和jvm-bloggers-core:
version: '2'
services:
jvm_bloggers_db:
image: sameersbn/postgresql:9.4-22
environment:
DB_USER: $JVM_BLOGGERS_DB_USER
DB_PASS: $JVM_BLOGGERS_DB_PASSWORD
DB_NAME: $JVM_BLOGGERS_DB_NAME
ports:
- "$JVM_BLOGGERS_DB_PUBLISHED_PORT:5432"
volumes:
- "$JVM_BLOGGERS_DB_PATH:/var/lib/postgresql"
jvm-bloggers-core:
image: tdziurko/jvm-bloggers:$JVM_BLOGGERS_CORE_IMAGE_VERSION
environment:
spring.profiles.active: $JVM_BLOGGERS_CORE_SPRING_PROFILES
jasypt.encryptor.password: $JVM_BLOGGERS_CORE_ENCRYPTOR_PASSWORD
ports:
- "$JVM_BLOGGERS_CORE_PORT:8080"
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/share/zoneinfo/Europe/Warsaw:/etc/timezone:ro
- /tmp
links:
- jvm_bloggers_db
depends_on:
- jvm_bloggers_db
在jvm_bloggers_db中,我们有一些参数可以自定义PostgreSQL映像,除了最明显的参数(如数据库名称,用户名和密码)外,还有:
- $ JVM_BLOGGERS_DB_PUBLISHED_PORT-可以从外部(例如开发人员的机器)在其上使用我们的数据库的端口
- $ JVM_BLOGGERS_DB_PATH –数据库文件在我们服务器上的目录路径
jvm-bloggers-core更为复杂:
- 环境变量指定用于加密属性(例如API密钥,管理面板的密码等)的Spring配置文件和主密码。
- $ JVM_BLOGGERS_CORE_PORT –可用应用程序所在的端口,在生产中显然是80,但在本地可以不同
- 链接jvm_bloggers_db允许我们将其用作spring.datasource.url中数据库的URL,其值为jdbc:postgresql:// jvm_bloggers_db:5432 / jvm_bloggers_prod,而无需担心数据库容器在内部网络中的确切位置运行。
在docker-compose文件旁边,我们需要一个bash脚本来启动/停止我们的系统:
#!/bin/sh
setupProperties() {
# Database settings
export JVM_BLOGGERS_DB_USER=jvm_bloggers
export JVM_BLOGGERS_DB_PASSWORD=jvm_bloggers
export JVM_BLOGGERS_DB_NAME=jvm_bloggers
export JVM_BLOGGERS_DB_PATH="~/postgresql-data/"
export JVM_BLOGGERS_DB_PUBLISHED_PORT=5432
# Core Application settings:
export JVM_BLOGGERS_CORE_IMAGE_VERSION=0.9.0-20160724-165001-19f0d70
export JVM_BLOGGERS_CORE_SPRING_PROFILES=dev
export JVM_BLOGGERS_CORE_ENCRYPTOR_PASSWORD=secret
export JVM_BLOGGERS_CORE_PORT=9000
}
start() {
docker-compose up -d
echo "Started JVM Bloggers"
}
stop() {
docker-compose down
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
该文件的主要部分由多个导出组成,这些导出允许自定义docker-compose,因此可以在本地使用或在生产环境中使用而无需更改。 然后,我们有简单的命令来启动,关闭和检查正在运行的服务的状态。 就是这样,现在我们可以使用以下命令启动所有服务:
./jvm-bloggers.sh start
意见计数器
0.10.0版本发布的下一个功能是视图计数器。 我想了解多少人使用JVM Blogger,最重要的是,什么是最受欢迎的条目。 在接下来的几周中,我们计划添加上个月最受欢迎的帖子,以使最有价值的内容的作者获得更多的认可。
要添加此功能,需要执行以下操作:
- 重定向控制器
- 从作为唯一博客文章标识符的UUID迁移到更短的内容
- 将点击存储在数据库中的逻辑
重定向控制器的工作非常简单–从url参数(例如http://jvm-bloggers.com/r/wx1LivZ )获取UID并将用户重定向到适当的博客文章。 但在0.10.0之前,UID已满
_UUID.randomUUID().toString()_
因此,我们没有像http://jvm-bloggers.com/r/b877a837-4f5b-4a0b-90b2-981c83c1366e这样的短链接,它不是非常友好和简洁。 必须进行简单的数据迁移,并且在新方法中,UID是紧凑的7个字符长的String:
RandomStringUtils.randomAlphanumeric(7);
我们需要做的最后一件事是保存点击的逻辑。 我不想仅仅因为我们要在数据库中存储内容而使重定向变慢,所以我决定使用Akka在单独的线程中处理这项工作。
在RedirectController中,我们发布SingleClick事件:
actorRef.tell(new SingleClick(blogPost.get()), noSender());
参与者只需保留Click实体即可处理此事件:
@Slf4j
public class ClicksStoringActor extends AbstractActor {
public ClicksStoringActor(ClickRepository clickRepository, NowProvider nowProvider) {
log.debug("Creating " + ClicksStoringActor.class.getSimpleName());
receive(ReceiveBuilder.match(SingleClick.class,
clickEvent -> {
log.debug("Storing click for " + clickEvent.getBlogPost().getUrl());
clickRepository.save(new Click(clickEvent.getBlogPost(), nowProvider.now()));
}).build()
);
}
public static Props props(ClickRepository clickRepository, NowProvider nowProvider) {
return Props.create(ClicksStoringActor.class, () -> {
return new ClicksStoringActor(clickRepository, nowProvider);
}
);
}
}
学分
没有贡献者(尤其是MateuszUrbański和MarcinKłopotek)就不可能实现这些新功能。
摘要
JVM Bloggers仍在不断发展,既有小的更改又有主要的新功能,因此,如果您想提供帮助,请与我联系或加入我们的垃圾邮件频道。 我们拥有Java8,Spring Boot,Docker,Akka和许多实现的想法(甚至使用不同的语言)。
有关更多详细信息,请访问我们的GitHub存储库 。
翻译自: https://www.javacodegeeks.com/2016/08/whats-new-jvm-bloggers-docker-compose-views-counter.html