我在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?
根据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
在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 EE应用程序?人们有什么最佳实践建议?
通过应用程序配置,我的意思是设置连接设置到其他盒子上的服务,包括外部服务(例如Twitter和我们的内部Cassandra服务器......用于诸如主机名,凭证,重试尝试之类的东西)以及与业务逻辑相关的东西(事物)一个人可能会被诱惑作为常量存储在类中,例如某些东西过期等等.
假设:
配置是属于EAR的内部还是外部?
如果在 EAR 之外,哪里以及如何最好地可靠地访问它们?
如果在 EAR 内部,我们可以将它存储在类路径中的任何位置,以便在执行期间轻松访问.但是我们必须在每次配置更改时重新组装(并且可能重新构建).由于我们将拥有多个环境,因此我们需要一种方法来区分EAR中的文件.我在这里看到两个选项:
cassandra.properties),然后构建多个环境特定的EAR(例如appxyz-PROD.ear).appxyz.ear)并将所有各种环境配置文件放入其中,将环境变量附加到每个配置文件名(例如cassandra-PROD.properties).当然还要添加一个环境变量(对于vm或其他),以便代码知道要拾取哪个文件.人们可以推荐哪些最佳实践来解决这一共同挑战?
谢谢.
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上运行,因为它在这些截然不同的上下文中使用:
Schedulers.boundedElastic()调度程序上运行的 API 响应。尝试
我们已经尝试定义一个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
我正在构建一个调用另一个微服务的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) 我们将多个打包为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) 根据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) 根据最新版本的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的配置来进行配置?
有没有办法使用默认的 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 堆栈是否有等效或类似的方法?
我们正在使用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 ×9
spring ×6
spring-boot ×4
java-ee ×2
spring-cloud ×2
spring-mvc ×2
wildfly-8 ×2
apache-kafka ×1
cassandra ×1
datastax ×1
hystrix ×1
jackson ×1
jax-rs ×1
jboss ×1
kops ×1
kubectl ×1
kubernetes ×1
resteasy ×1
rfc6902 ×1
spring-rest ×1