小编pet*_*erl的帖子

如何将用户添加到Kubernetes(kubectl)?

我在AWS上使用kops创建了一个Kubernetes集群,并且可以通过kubectl本地计算机成功管理它.

我可以查看当前配置kubectl config view以及直接访问存储状态~/.kube/config,例如:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://api.{CLUSTER_NAME}
  name: {CLUSTER_NAME}
contexts:
- context:
    cluster: {CLUSTER_NAME}
    user: {CLUSTER_NAME}
  name: {CLUSTER_NAME}
current-context: {CLUSTER_NAME}
kind: Config
preferences: {}
users:
- name: {CLUSTER_NAME}
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    password: REDACTED
    username: admin
- name: {CLUSTER_NAME}-basic-auth
  user:
    password: REDACTED
    username: admin
Run Code Online (Sandbox Code Playgroud)

我需要让其他用户也能管理.本用户指南介绍了如何在其他用户计算机上定义这些用户指南,但未描述如何在群集本身内实际创建用户凭据.你怎么做到这一点?

另外,分享是否安全cluster.certificate-authority-data?

kubernetes kubectl kops

62
推荐指数
1
解决办法
5万
查看次数

如何使用Spring Boot的'spring.jackson.date-format'属性?

根据Current SpringBoot参考指南,如果我设置spring.jackson.date-format属性,它将:Date format string or a fully-qualified date format class name. For instance 'yyyy-MM-dd HH:mm:ss'.

但是,Spring Boot 1.5.3无法以这种方式工作.

为了演示,从这个类开始:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Instant;

@SpringBootApplication
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

@RestController
class NowController{

  @GetMapping("/now")
  Instant getNow(){
    return Instant.now();
  }

}
Run Code Online (Sandbox Code Playgroud)

还有这个 src/main/resources/application.properties

spring.jackson.date-format=dd.MM.yyyy
Run Code Online (Sandbox Code Playgroud)

这个build.gradle:

buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies { …
Run Code Online (Sandbox Code Playgroud)

spring jackson spring-boot spring-restcontroller spring-rest

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

如何使用@ControllerAdvise(和@RestControllerAdvise)类保留Spring的内置REST响应JSON主体?

在Spring 4.x中,如果使用扩展的@RestControllerAdvise(或@ControllerAdvice),ResponseEntityExceptionHandler默认情况下,对于标记为的参数,不再返回具有良好且信息丰富的JSON响应主体的默认异常处理@Valid.

如何在使用ResponseEntityExceptionHandler基础时返回默认的JSON实体@RestControllerAdvice?

以下是描述此问题的简单但完整的示例.使用这些类:

@RestController
class CarsController {

  @PostMapping("/cars")
  public void createCar(@RequestBody @Valid Car car) {
    System.out.println("Creating " + car);
    throw new WhateverException();
  }

  @ExceptionHandler(WhateverException.class)
  @ResponseStatus(HttpStatus.EXPECTATION_FAILED)
  public void handleWhateverException(){
    System.out.println("Handling a WhateverException.");
  }

}

class Car {

  @NotNull
  private String make;

  @NotNull
  private String model;

  ...getter/setters omitted for brevity...
}

class WhateverException extends RuntimeException {}
Run Code Online (Sandbox Code Playgroud)

如果提交POST到/cars与

{
    "make": "BMW"
}
Run Code Online (Sandbox Code Playgroud)

它响应a 400和以下身体:

{ …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-boot

12
推荐指数
2
解决办法
1792
查看次数

什么是Java EE 7属性文件配置的最佳实践建议?

应用程序配置在哪里属于现代Java EE应用程序?人们有什么最佳实践建议?

通过应用程序配置,我的意思是设置连接设置到其他盒子上的服务,包括外部服务(例如Twitter和我们的内部Cassandra服务器......用于诸如主机名,凭证,重试尝试之类的东西)以及与业务逻辑相关的东西(事物)一个人可能会被诱惑作为常量存储在类中,例如某些东西过期等等.

假设:

  1. 我们使用单个EAR文件部署到Java EE 7服务器(Wildfly 8.1),该文件包含多个战争和一个ejb-jar.
  2. 我们将部署到各种环境:单元测试,本地开发安装,基于云的UAT基础架构,压力测试和生产环境.我们的许多房产会因这些环境而异.
  3. 如果这是人们推荐的最佳实践,我们不反对将属性配置耦合到DI框架.
  4. 所有这些都是为了新的开发,所以我们不必遵守传统的要求或限制.我们非常关注当前的现代最佳实践.

配置是属于EAR的内部还是外部?

如果在 EAR 之外,哪里以及如何最好地可靠地访问它们?

如果在 EAR 内部,我们可以将它存储在类路径中的任何位置,以便在执行期间轻松访问.但是我们必须在每次配置更改时重新组装(并且可能重新构建).由于我们将拥有多个环境,因此我们需要一种方法来区分EAR中的文件.我在这里看到两个选项:

  1. 利用预期的文件名(例如cassandra.properties),然后构建多个环境特定的EAR(例如appxyz-PROD.ear).
  2. 构建一个EAR(例如appxyz.ear)并将所有各种环境配置文件放入其中,将环境变量附加到每个配置文件名(例如cassandra-PROD.properties).当然还要添加一个环境变量(对于vm或其他),以便代码知道要拾取哪个文件.

人们可以推荐哪些最佳实践来解决这一共同挑战?

谢谢.

java jboss dependency-injection java-ee wildfly-8

7
推荐指数
2
解决办法
4411
查看次数

如何将 Project Reactor 的调度程序与基于 Executor 的库一起使用?

Project Reactor 通过定义一个Scheduler. 它还为使用CompletableFuture's 的库提供了一个桥梁Mono.fromFuture(..)。

AWS 的DyanmoDB 异步客户端执行CompletableFuture它从 API 调用返回的java.util.concurrent.Executor. 默认情况下,它创建一个Executor由它也创建的线程池支持。其结果是,即使是定义数据流Scheduler就像Mono.fromFuture(..).subscribeOn(Schedulers.boundedElastic())从库中创建,而不是一个从池中一个线程中执行Schedulers.boundedElastic()。所以我们看到线程名称像sdk-async-response-0-2,而不是像boundedElastic-1.

幸运的是,该库允许我们提供我们自己的Executor,如下所示,所以我的问题是:

您如何构建一个在运行时使用流的那部分上定义Executor的线程的线程?Scheduler

用例

我们有一个存储库类,它有一个findById方法,我们需要调用者能够控制在哪个Scheduler上运行,因为它在这些截然不同的上下文中使用:

  1. 在Schedulers.boundedElastic()调度程序上运行的 API 响应。
  2. 处理按顺序执行的 Kafka 消息,在每个分区的线程上,来自定义的调度程序,如Reactor Kafka docs 所示。

尝试

我们已经尝试定义一个ExecutorusingSchedulers.immediate()和Runnable::run,如下所示,但两者都导致在 Netty 事件循环线程(示例名称:)上执行aws-java-sdk-NettyEventLoop-0-2,而不是来自定义的Scheduler.

DynamoDbAsyncClient.builder()
    .asyncConfiguration(builder …
Run Code Online (Sandbox Code Playgroud)

java amazon-dynamodb apache-kafka project-reactor aws-sdk-java-2.0

7
推荐指数
1
解决办法
2416
查看次数

在使用Feys with Hystrix时,如何允许400个错误传播?

我正在构建一个调用另一个微服务的SpringBoot微服务,并且自然希望使用Hystrix和Feign客户端,它们都包含在Spring Cloud中.我正在使用版本Camden.SR5.

对于Feign的任何超时,连接失败和50x响应代码,我希望Hystrix能够正常启动并正常工作:绊倒断路器并调用回退(如果已配置)等.默认情况下这样做,所以我很好.

但对于40x响应代码,包括无效输入,错误的字段格式等,我希望Hystrix将这些异常传播给调用者,所以我也可以按照我的选择来处理它们.这不是我观察到的默认值.如何配置Hystrix/Feign在Spring Cloud中执行此操作?

使用以下代码开箱即用:

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.hateoas.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "dog-service", url = "http://...")
public interface DogsFeignClient {
  @RequestMapping(method = RequestMethod.POST, path = "/dogs")
  Resource<Dog> createDog(Dog dog);
}
Run Code Online (Sandbox Code Playgroud)

生成此异常,这不适合将40x响应很好地传递给调用者:

com.netflix.hystrix.exception.HystrixRuntimeException: DogsFeignClient#createDog(Dog) failed and no fallback available.
    at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:805) ~[hystrix-core-1.5.6.jar:1.5.6]
    ....lines ommited for brevity....
Caused by: feign.FeignException: status 400 reading DogsFeignClient#createDog(Dog); content:
{
  "errors" : [ {
    "entity" : "Dog",
    "property" : "numberOfLegs",
    "invalidValue" : "3",
    "message" : "All dogs must have 4 legs" …
Run Code Online (Sandbox Code Playgroud)

java spring hystrix spring-cloud spring-cloud-feign

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

在相同的根上下文中托管静态内容和JAX-RS服务

我们将多个打包为WAR的Java Web应用程序打包在EAR中.我们的RESTful服务是使用JAX-RS和特定于版本的WAR构建的.

我们想为每个特定于版本的WAR添加静态内容,但是对于静态内容和RESTful服务API调用都使用(根据WAR的)根上下文,这样所有以下URL都可以工作:

{hostname}/v1/swagger.yaml  <-- Static Content describing the v1 API
{hostname}/v1/orders/{uid}  <-- JAX-RS RESTful API (v1)

{hostname}/v2/swagger.yaml  <-- Static Content describing the v2 API
{hostname}/v2/orders/{uid}  <-- JAX-RS RESTful API (v2)
Run Code Online (Sandbox Code Playgroud)

以下部署结构是我们目前拥有的,适用于JAX-RS服务,但不适用于静态内容.换句话说,这些URL有效:

{hostname}/v1/orders/{uid}  <-- JAX-RS RESTful API (v1)
{hostname}/v2/orders/{uid}  <-- JAX-RS RESTful API (v2)
Run Code Online (Sandbox Code Playgroud)

但问题是这些URL无法访问:

{hostname}/v1/swagger.yaml  <-- Static Content describing the v1 API
{hostname}/v2/swagger.yaml  <-- Static Content describing the v2 API
Run Code Online (Sandbox Code Playgroud)

问题:我们如何让这些静态URL工作?

这是爆炸的EAR:

example.ear

    META-INF
        application.xml

    v1.war
        swagger.yaml
        WEB-INF
            web.xml
            classes
                ApplicationV1.class
                OrdersResourceV1.class

    v2.war
        swagger.yaml
        WEB-INF
            web.xml
            classes
                ApplicationV2.class
                OrdersResourceV2.class …
Run Code Online (Sandbox Code Playgroud)

java jax-rs java-ee resteasy wildfly-8

5
推荐指数
0
解决办法
3080
查看次数

如何将 JSON Patch 与 Spring Data REST 结合使用?

根据Sprind Data Rest Docs,它支持媒体类型application/patch+json。也许这个假设是错误的,但我认为这意味着 Spring Data Rest 支持JSON Patch (RFC 6902)。你如何让它发挥作用?

这是我尝试过的:

将这些依赖项添加到我的build.gradle:

compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.data:spring-data-keyvalue')
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.annotation.Id;
import org.springframework.data.map.repository.config.EnableMapRepositories;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.UUID;

@SpringBootApplication
@EnableMapRepositories
public class SpringDataRest1Application {
  public static void main(String[] args) {
    SpringApplication.run(SpringDataRest1Application.class, args);
  }
}

@RepositoryRestResource
interface UserRepository extends CrudRepository<User, UUID> {

  @RestResource(path = "by-name")
  List<User> findByName(@Param("name") String …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-data-rest rfc6902

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

&lt;aws-messaging:annotation-driven-queue-listener /&gt;的基于Java的配置版本是什么?

根据最新版本的Spring Cloud AWS文档(http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html),第5.2.3节指出,您需要QueueMessageHandler使用以下配置在传统的Spring XML配置中:

<aws-messaging:annotation-driven-queue-listener />
Run Code Online (Sandbox Code Playgroud)

您如何使用更现代的基于Java的配置来进行配置?

java spring spring-boot spring-cloud spring-cloud-aws

5
推荐指数
1
解决办法
457
查看次数

如何在 Spring WebFlux @ExceptionHandler 中访问 RequestBody?

有没有办法使用默认的 Reactor NettyRequestBody在@ExceptionHandler使用 Spring WebFlux的方法中访问(最好以它的映射形式)?

考虑以下示例:

@RestController
class TestRestController {

  @PostMapping("/test")
  Mono<TestBody> testPost(@RequestBody TestBody testBody) {
    return Mono.error(new NullPointerException());
  }

  @ExceptionHandler(NullPointerException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  Mono<Void> handleNullPointerException(ServerWebExchange serverWebExchange) {
    return Mono.empty();
  }

}
Run Code Online (Sandbox Code Playgroud)

在运行时,可以将某些类型的其他实例注入到@ExceptionHandler的方法签名中,如上面带有ServerWebExchange. 但是文档明确指出它不支持请求正文参数(请参阅本节中的注释)。

使用 Servlet 堆栈,您可以RequestContext按此处所示注入。WebFlux 堆栈是否有等效或类似的方法?

java spring spring-boot spring-webflux

5
推荐指数
1
解决办法
701
查看次数

Cassandra:使用DataStax Java驱动程序选择一系列TimeUUID

我们正在使用Cassandra解决的用例是:我们需要检索在过去90天内在特定时间范围内更新的实体UUID列表.想象一下,我们正在构建一个文档跟踪系统,因此我们的相关实体是一个Document,其关键是UUID.

我们在此用例中需要支持的查询是:查找StartDateTime和EndDateTime之间已更改的所有Document UUID.

问题1:支持此查询的最佳Cassandra表设计是什么?

我认为答案如下:

CREATE TABLE document_change_events (
    event_uuid TIMEUUID,
    document_uuid uuid,
    PRIMARY KEY ((event_uuid), document_uuid)
) WITH default_time_to_live='7776000';
Run Code Online (Sandbox Code Playgroud)

鉴于我们不能对分区键进行范围查询,我们需要使用该token()方法.因此,查询将是:

SELECT document_uuid 
 WHERE token(event_uuid) > token(minTimeuuid(?)) 
   AND token(event_uuid) < token(maxTimeuuid(?))
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT document_uuid 
 WHERE token(event_uuid) > token(minTimeuuid('2015-05-10 00:00+0000')) 
   AND token(event_uuid) < token(maxTimeuuid('2015-05-20 00:00+0000'))
Run Code Online (Sandbox Code Playgroud)

问题2:我似乎无法使用DataStax的驱动程序获得以下Java代码,以确保可靠性返回正确的结果.

如果我运行以下代码10次,暂停30秒,我将在此表中有10行:

private void addEvent() {

    String cql = "INSERT INTO document_change_events (event_uuid, document_uuid) VALUES(?,?)";

    PreparedStatement preparedStatement = cassandraSession.prepare(cql);
    BoundStatement boundStatement = new BoundStatement(preparedStatement);
    boundStatement.setConsistencyLevel(ConsistencyLevel.ANY);

    boundStatement.setUUID("event_uuid", UUIDs.timeBased());
    boundStatement.setUUID("document_uuid", UUIDs.random());

    cassandraSession.execute(boundStatement);

}
Run Code Online (Sandbox Code Playgroud)

结果如下:

cqlsh:> …
Run Code Online (Sandbox Code Playgroud)

java cassandra datastax-java-driver datastax

4
推荐指数
1
解决办法
2026
查看次数