小编sfu*_*ger的帖子

如何使用docker在微服务架构中发送日志?

Heroku将其Twelve-Factor App清单中的日志描述为简单的事件流:

日志是从所有正在运行的进程和支持服务的输出流收集的聚合的,按时间排序的事件流.原始格式的日志通常是文本格式,每行一个事件(尽管异常的回溯可能跨越多行).日志没有固定的开始或结束,但只要应用程序正在运行,就会持续流动.

此外,应用程序应该只写日志stdout,将任务留给"环境".

十二因素应用程序从不关心其输出流的路由或存储.它不应该尝试写入或管理日志文件.相反,每个正在运行的进程将其未缓冲的事件流写入stdout.在本地开发期间,开发人员将在其终端的前台查看此流以观察应用程序的行为.

在暂存或生产部署中,每个流程的流将由执行环境捕获,与来自应用程序的所有其他流进行整理,并路由到一个或多个最终目的地以供查看和长期归档.这些归档目标对应用程序不可见或可由应用程序配置,而是由执行环境完全管理.开源日志路由器(例如Logplex和Fluent)可用于此目的.

那么在可靠性,效率和易用性方面,在docker环境中实现这一目标的最佳方法是什么?我想以下问题浮现在脑海中:

  • 依靠Docker自己的日志工具(docker logs)是否安全?
  • 运行未分离的docker并将其输出视为日志记录流是否安全?
  • 可以stdout直接重定向到文件(磁盘空间)吗?
  • 如果使用文件,它应该在docker镜像内还是绑定卷(docker run --volume=[])?
  • 需要logrotation吗?
  • 将stdout直接重定向到logshipper(以及哪个logshipper)是否安全?
  • 命名管道(也称为FIFO)是一种选择吗?
  • (更多问题?)

soa logging docker

29
推荐指数
1
解决办法
9467
查看次数

正则表达式的替代(流畅?)接口的设计

我刚刚看到Java的一个巨大的正则表达式让我想到了一般的正则表达式的可维护性.我相信大多数人 - 除了一些坏蛋perl贩子 - 会同意正则表达式难以维持.

我在考虑如何解决这种情况.到目前为止,我最有希望的想法是使用流畅的界面.举个例子,而不是:

Pattern pattern = Pattern.compile("a*|b{2,5}");
Run Code Online (Sandbox Code Playgroud)

一个人可以写这样的东西

import static util.PatternBuilder.*

Pattern pattern = string("a").anyTimes().or().string("b").times(2,5).compile();

Pattern alternative = 
  or(
    string("a").anyTimes(),
    string("b").times(2,5)
  )
  .compile();
Run Code Online (Sandbox Code Playgroud)

在这个非常简短的例子中,创建正则表达式的常用方法对于任何平庸的有才华的开发人员来说仍然是可读的.但是,请考虑那些填充两行或更多行的怪异表达式,每行包含80个字符.当然,(冗长)流畅的界面需要几行而不是只有两行,但我相信它会更具可读性(因此可维护).

现在我的问题:

  1. 你知道正则表达式的任何类似方法吗?

  2. 你是否同意这种方法比使用简单的字符串更好?

  3. 你会如何设计API?

  4. 你会在你的项目中使用这样一个整洁的实用程序吗?

  5. 你认为这会很有趣吗?;)

编辑: 想象一下,可能存在比简单构造更高级别的方法,我们都没有来自正则表达式,例如

// matches aaaab@example.com - think of it as reusable expressions
Pattern p = string{"a").anyTimes().string("b@").domain().compile();
Run Code Online (Sandbox Code Playgroud)

编辑 - 评论的简短摘要:

有趣的是,大多数人都认为正则表达式仍然存在 - 虽然它需要工具来阅读它们,聪明的家伙想办法让它们可维护.虽然我不确定流畅的界面是最好的方法,但我确信有些聪明的工程师 - 我们呢?;) - 应该花一些时间让正则表达式成为过去 - 这已经足够让他们和我们在一起已有50年了,你不觉得吗?

开放的BOUNTY

对于正则表达式的新方法,赏金将被授予最佳想法(无需代码).

编辑 - 一个很好的例子:

这是我正在谈论的那种模式 - 对能够翻译它的第一个人的额外荣誉 …

java regex maintainability fluent-interface readability

27
推荐指数
6
解决办法
3070
查看次数

如何使用Maven的Central Repository部署我的开源项目?

有什么办法可以将我自己的开源资料放到Maven的Central资源库中吗?

我多次想知道如何让我自己的项目进入Maven的Central存储库.我自己也在问这个问题,特别是当我看到一些众所周知的项目托管他们自己的存储库时,要求用户添加依赖项存储库.与此同时,其他项目难以依赖这些项目.因为我既不希望别人添加额外的存储库也不想自己主持,我正在寻找其他方法.

为什么有些项目没有使用该选项部署到Maven Central以支持他们的自托管存储库?有什么好的理由不明显吗?

java deployment open-source maven-2

25
推荐指数
2
解决办法
6751
查看次数

众包通用Java系统属性和已知值的完整列表

我受到另一个问题的启发:使用Java系统属性的最佳实践

我目前正在寻找Java系统属性和可能值的完整列表.我正在研究一个简单的类来简化它们的使用(如果你有兴趣,请获取源背景信息(我的博客)).在这个课程中,我尝试提供以下内容:

  • 对Java系统属性的简单一致访问(无String常量)
  • 完整的可用属性文档及其可能的值 - 在我的IDE中(即自动完成,内联Javadoc)
  • 修复返回值和/或命名的不一致性
  • 确保java.io.tmpdir存在 - 实际上这是我做这一切的主要原因:)

要获得完整的文档和可用属性的完整列表(即使可用性严重依赖于JVM的那些),我希望您下载源代码,运行它并发布结果.我会相应地更新课程,并在指定地点保持可用.希望它会让你们中的一些人放松一下:)

编辑:

我不是在寻找System.getProperties()所描述的标准属性,也不是我系统上可用的所有属性.我正在尝试创建一个完整的系统属性列表 - 甚至是那些与供应商,jvm或版本相关的属性 - 那些不保证存在且文档稀疏或难以找到的属性.属性如

  • sun.desktop(仅限Linux,例如"gnome"),
  • awt.toolkit(仅限Mac,例如apple.awt.CToolkit)
  • sun.cpu.endian(仅限Sun JVM)
  • ...

我希望让其他人运行我的代码并发布他们的结果,以便以易于使用的Java枚举的形式编译一个全面的列表(包含属性及其可能值的大量文档),例如:

String file = SystemProperty.JAVA_IO_TMPDIR + "file.txt";
Run Code Online (Sandbox Code Playgroud)

代替

String tmp = System.getProperty("java.io.tmpdir");
if (!tmp.endsWith(File.separator)
    tmp += File.separator;
new File(tmp).mkdirs(); // make sure tmp exists
String file = tmp + "file.txt";
Run Code Online (Sandbox Code Playgroud)

所以请运行该代码并发布您的发现.这是一个简单的脚本,可以帮助您入门:

#!/bin/bash
# download and run
# you should really look at the code first, as you can't …
Run Code Online (Sandbox Code Playgroud)

java properties crowdsourcing system-properties

23
推荐指数
2
解决办法
8887
查看次数

JAXB:如何避免xmlns:xsi的重复命名空间定义

我有一个JAXB设置,我使用@XmlJavaTypeAdapter将类型Person的对象替换为PersonRef仅包含该人的UUID 的类型的对象.这完全没问题.但是,生成的XML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"每次使用时都会重新声明相同的名称空间().虽然这通常没问题,但感觉不对.

如何配置JAXB以在文档的最开头声明xmlns:xsi?我可以手动将名称空间声明添加到根元素吗?

这是我想要实现的一个例子:

当前:

<person uuid="6ec0cf24-e880-431b-ada0-a5835e2a565a">
    <relation type="CHILD"> 
        <to xsi:type="personRef" uuid="56a930c0-5499-467f-8263-c2a9f9ecc5a0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
    </relation> 
    <relation type="CHILD"> 
        <to xsi:type="personRef" uuid="6ec0cf24-e880-431b-ada0-a5835e2a565a" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
    </relation>
    <!-- SNIP: some more relations -->
</person>
Run Code Online (Sandbox Code Playgroud)

通缉:

<person uuid="6ec0cf24-e880-431b-ada0-a5835e2a565a" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <relation type="CHILD"> 
        <to xsi:type="personRef" uuid="56a930c0-5499-467f-8263-c2a9f9ecc5a0"/> 
    </relation> 
    <relation type="CHILD"> 
        <to xsi:type="personRef" uuid="6ec0cf24-e880-431b-ada0-a5835e2a565a"/> 
    </relation>
    <!-- SNIP: some more relations -->
</person>
Run Code Online (Sandbox Code Playgroud)

java xml jaxb

20
推荐指数
3
解决办法
4万
查看次数

如何使用CXF,JAX-RS和HTTP缓存

CXF文档中提到的缓存为高级HTTP:

CXF JAXRS通过处理If-Match,If-Modified-Since和ETags标头提供对许多高级HTTP功能的支持.JAXRS请求上下文对象可用于检查前提条件.还支持Vary,CacheControl,Cookies和Set-Cookies.

我真的很想使用(或至少探索)这些功能.然而,虽然"提供支持"的声音非常有趣,但它在实现这些功能方面并不是特别有用.有关如何使用If-Modified-Since,CacheControl或ETags的任何帮助或指示?

java rest cxf jax-rs http-caching

17
推荐指数
2
解决办法
1万
查看次数

Groovy:动态字符串中的可变替换

我目前在groovy中面临变量替换相关的问题.虽然这非常简单:

Map map = [s1:"Hello", s2:"World"]
println "${map.s1} ${map.s2}!" // "Hello World!"
Run Code Online (Sandbox Code Playgroud)

由于这有效,我很确定这样的东西应该也能正常工作:

Map map = [s1:"Hello", s2:"World"]
def dynamic = loadStringFromFile();

println "${dynamic} ${dynamic.class}" // "${s1} ${s2}! (java.lang.String)"

// now the voodoo part
println applyVoodoo(dynamic, map) // "Hello World!"
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做这个吗?

干杯

groovy templates

15
推荐指数
2
解决办法
3万
查看次数

Eclipse Helios忽略了断点

Eclipse现在让我疯了.这可能是微不足道的,但我只是不明白.每当我想添加断点时,常规图标都会在编辑器和断点视图中划掉.这是一个截图:

断点http://j.mp/aLcYFJ

正如您可能已经猜到的,这不是严格意义上的图形问题;)在调试时会忽略断点.断点的属性也没有帮助.

任何提示都非常感谢!

编辑:

  • 我测试了不同的JDK但没有成功.
  • 我已成功调试另一个工作区中的项目

好的,所以它不是关于JDK或已安装的插件.似乎与工作区相关.我能尝试什么吗?

java eclipse debugging eclipse-jdt helios

14
推荐指数
1
解决办法
2857
查看次数

REST:我应该重定向到实体的版本URL吗?

我目前正在开发REST服务.该服务具有不同版本的实体,类似于维基百科文章.

现在我想知道如果为了我应该返回什么

GET /article/4711
Run Code Online (Sandbox Code Playgroud)

我应该使用(临时)重定向到当前版本,例如

GET /article/4711/version/7
Run Code Online (Sandbox Code Playgroud)

或者我应该直接返回当前版本?使用重定向将大大简化HTTP缓存(使用Last-Modified),但具有重定向的缺点(额外请求,'更难'实现).因此,我不确定这是否是一种好的做法.

分享的任何建议,建议或经验?

(顺便说一下:曾经尝试过搜索"REST版本"?你得到的一切都是关于API的版本而不是实体.所以如果这是重复的话,请耐心等待.)

rest http-caching

13
推荐指数
1
解决办法
777
查看次数

如何或何时关注重定向的OpenID?

我目前正在为网站实施OpenID身份验证.在测试过程中,我注意到Google接受了不同版本的Google个人资料ID,例如:

有趣的是,验证的ID也不同(对于上面的样本,相同的顺序):

当然,这使得查找关联的用户帐户非常困难,更不用说不可能了.有趣的是,所有上述ID都适用于Stackoverflow.所以我认为在我的实现中我必须要有一些规范化步骤 - 或者做一些专门的伏都教来完成事情.

看看OpenID身份验证规范的7.2 Normatlization我发现了这个:

URL标识符必须在检索其内容时通过以下重定向进一步标准化,并最终将[RFC3986]的第6节中的规则应用于最终目标URL.该最终URL必须由依赖方记录为声明的标识符,并在请求认证时使用.

以下重定向声明的ID并没有多大帮助,因为我还有两个不同的ID:

查看已验证ID的重定向更有帮助,因为我总是最终得到这个:

好的,看起来我应该遵循经过验证的ID的重定向,而不是声明的ID.

现在的问题是:遵循声明/验证ID的重定向是否安全,例如在搜索DB之前如此:

do {
  user = lookup(verifiedId)
  if (user is null)
    response = fetchUrl(verifiedId)
    if (response.location is null) {
      break # no redirect, jump out of loop, unknown user
    } else {
      verifiedId = response.location # use redirect location
    }
} while (user is null)

return user;
Run Code Online (Sandbox Code Playgroud)

如果是的话,我怀疑这不仅应该在查找用户时进行,还应该在存储新ID时进行,对吧?

(如果我真的应该重定向,我还有另外一个关于潜在恶意重定向的问题,但是我必须等到我得到这个问题的答案.无论如何都可能过时了)

openid spring-security google-openid openid4java

11
推荐指数
1
解决办法
389
查看次数