我试图了解GraphQL最适合在微服务架构中使用的位置.
关于只有1个GraphQL架构作为API网关代理对目标微服务的请求并强制其响应存在争议.微服务仍然会使用REST/Thrift协议进行通信思考.
另一种方法是每个微服务一个多个GraphQL模式.拥有一个较小的API网关服务器,使用请求的所有信息+ GraphQL查询将请求路由到目标微服务.
第一种方法
将1个GraphQL架构作为API网关将有一个缺点,每次更改微服务合同输入/输出时,我们必须在API网关侧相应地更改GraphQL架构.
第二种方法
如果每个微服务使用多个GraphQL模式,那么在某种程度上是有意义的,因为GraphQL强制执行模式定义,并且消费者需要尊重微服务给出的输入/输出.
问题
在哪里可以找到适合设计微服务架构的GraphQL?
您将如何使用可能的GraphQL实现设计API网关?
问题是关于JAXB Map编组 - 有很多关于如何将Map转换为如下结构的示例:
<map>
<entry>
<key> KEY </key>
<value> VALUE </value>
</entry>
<entry>
<key> KEY2 </key>
<value> VALUE2 </value>
</entry>
<entry>
...
</map>
Run Code Online (Sandbox Code Playgroud)
实际上,这是JAXB原生支持的.但是,我需要的是XML,其中key是元素名称,value是其内容:
<map>
<key> VALUE </key>
<key2> VALUE2 </key2>
...
</map>
Run Code Online (Sandbox Code Playgroud)
我没有按照JAXB开发人员推荐的方式(https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html)成功实现我的Map适配器,因为我需要,他 - 动态属性名称:)
那有什么解决方案吗?
PS目前我必须为每个我想要编组的典型键值对创建一个专用的容器类 - 它可以工作,但是我必须创建太多这些辅助容器.
有许多在线资源提供JavaScript API来访问他们的服务.为了更清楚,我将基于MapBox的示例提出问题,但这适用于各种域中的许多其他服务.
当有人想在Web应用程序中使用此类服务时(例如来自MapBox的地图图像),他们通常需要注册/注册并获取访问令牌才能访问该服务.
现在,如果我将从服务器端使用API - 没有问题:我知道我的令牌安全地存储在服务器上的某个地方,并且仅在我的服务器和服务提供商之间的通信时"暴露".但是,在JavaScript API的情况下(例如,如果我使用Leaflet从MapBox渲染地图),我应该在JavaScript中将访问令牌暴露给用户的Web浏览器 - 因此它非常容易找到某人的访问令牌.在我的例子中,只需使用Leaflet访问任何网站并在Firefox中打开"开发工具",就可以在一分钟细致地阅读他们的JavaScript代码时显示他们使用的令牌.
然而,对于我来说,这个令牌应被视为非常安全的数据 - 基于此令牌提供的身份验证来跟踪服务使用情况.如果您根据其使用情况支付服务费用就变得非常关键,但即使您没有(例如,如果您使用免费/入门/非付费计划) - 服务使用有限,我想确定只有我使用它.
显然,有一些策略,例如服务提供商的IP /域过滤,但似乎并非所有服务提供商都支持这种策略 - 例如,MapBox似乎没有(或者我没有找到它).或者,最终,我可以通过我的网络服务器代理服务,但这非常重.
考虑到所有这些 - 有没有办法保护JavaScript API使用的访问令牌访问外部服务,前提是JavaScript是在用户的浏览器中执行的?
亲爱的每个人,
首先,我要感谢在这个页面回答问题的人们,感谢你们在这里所做的出色工作.我在编程方面不是很有经验,这个页面对我来说是一个巨大的帮助.
现在来谈谈我在MySQL中完全外部加入的具体问题.我有两个(或更多表):
table1 table2 id value id value2 1 a 1 b 2 c 3 d 3 e 4 f
我使用此查询来获取我的联接:
SELECT *
FROM table1
LEFT OUTER JOIN table2
ON table1.`id`=table2.`id`
UNION
SELECT *
FROM table1
RIGHT OUTER JOIN table2
ON table1.`id`=table2.`id`
Run Code Online (Sandbox Code Playgroud)
要得到:
id value1 id value2 1 a 1 b 2 c NULL NULL 3 e 3 d NULL NULL 4 f
我的问题是我没有设法同时将两个id列折叠成一列来得到这个:
id value1 value2 1 a b 2 c NULL 3 e d 4 NULL f …
Amazon Elastic Container Repositories(ECR)具有非常人性化的URI,例如99999999999.dkr.ecr.eu-west-1.amazonaws.com.是否可以为ECR配置自定义域名?
简单的解决方案是创建一个指向ECR URI的CNAME记录,但这确实不起作用(SSL证书与域名不匹配,生成的密码aws ecr get-login不通过,无法推送标记有自定义域名的图像...).
还有其他选择吗?
我正在为SaltStack编写一些etcd模块并遇到这个奇怪的问题,它以某种方式阻止我捕获异常,我对它是如何做到这一点感兴趣.它似乎特别以urllib3为中心.
一个小脚本(不是盐):
import etcd
c = etcd.Client('127.0.0.1', 4001)
print c.read('/test1', wait=True, timeout=2)
Run Code Online (Sandbox Code Playgroud)
当我们运行它时:
[root@alpha utils]# /tmp/etcd_watch.py
Traceback (most recent call last):
File "/tmp/etcd_watch.py", line 5, in <module>
print c.read('/test1', wait=True, timeout=2)
File "/usr/lib/python2.6/site-packages/etcd/client.py", line 481, in read
timeout=timeout)
File "/usr/lib/python2.6/site-packages/etcd/client.py", line 788, in api_execute
cause=e
etcd.EtcdConnectionFailed: Connection to etcd failed due to ReadTimeoutError("HTTPConnectionPool(host='127.0.0.1', port=4001): Read timed out.",)
Run Code Online (Sandbox Code Playgroud)
好的,让我们抓住那个bugger:
#!/usr/bin/python
import etcd
c = etcd.Client('127.0.0.1', 4001)
try:
print c.read('/test1', wait=True, timeout=2)
except etcd.EtcdConnectionFailed:
print 'connect failed'
Run Code Online (Sandbox Code Playgroud)
运行:
[root@alpha _modules]# /tmp/etcd_watch.py
connect …Run Code Online (Sandbox Code Playgroud) 我在分布式模式下使用Kafka Connect。我现在多次观察到的一个奇怪行为是,经过一段时间(可能是几个小时,可能是几天),似乎出现了平衡错误:将相同的任务分配给多个工作人员。结果,它们并发运行,并且取决于连接器的性质,它们会失败或产生“不可预测的”输出。
我能够用来重现此行为的最简单的配置是:两个Kafka Connect工作程序,两个连接器,每个连接器仅执行一项任务。Kafka Connect已部署到Kubernetes中。Kafka本身位于Confluent Cloud中。Kafka Connect和Kafka的版本相同(5.3.1)。
日志中的相关消息:
工人A:
[2019-10-30 12:44:23,925] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Successfully joined group with generation 488 (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:469)
[2019-10-30 12:44:23,926] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Joined group at generation 488 and got assignment: Assignment{error=0, leader='connect-1-d5c19893-b33c-4f07-85fb-db9736795759', leaderUrl='http://10.16.0.15:8083/', offset=250, connectorIds=[some-hdfs-sink, some-mqtt-source], taskIds=[some-hdfs-sink-0, some-mqtt-source-0], revokedConnectorIds=[], revokedTaskIds=[], delay=0} (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1397)
Run Code Online (Sandbox Code Playgroud)
工人B:
[2019-10-30 12:44:23,930] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Successfully joined group with generation 488 (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:469)
[2019-10-30 12:44:23,936] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Joined group at generation 488 and got assignment: Assignment{error=0, leader='connect-1-d5c19893-b33c-4f07-85fb-db9736795759', leaderUrl='http://10.16.0.15:8083/', offset=250, …Run Code Online (Sandbox Code Playgroud) 是否有人知道如何区分Pylint报告中的新错误(在最近的Pylint执行期间发现的错误)和旧错误(在先前执行期间找到的那些错误)?
我在我的一个项目中使用Pylint,项目非常大.Pylint报告了很多错误(即使我在rcfile中禁用了很多错误).虽然我随着时间的推移修复了这些错误,但是不引入新错误也很重要.但是Pylint HTML和"可解析"报告并没有将新错误与之前发现的错误区分开来,即使我使用persistent=yes选项运行Pylint也是如此.
至于现在 - 我手动比较旧报告和新报告.但是,如果Pylint能够以某种方式突出显示在最近一次运行中找到但在之前的运行中找不到的错误消息,那将会是非常好的.是否可以使用Pylint或现有工具或其他东西?如果不是 - 似乎我最终会编写自己的比较和报告生成.
我正在努力理解创建一个"Lieningen"时的行为uberjar.以下是重现行为的最小示例:
(ns my-stuff.core
(:gen-class))
(def some-var (throw (Exception. "boom!")))
(defn -main [& args]
(println some-var))
Run Code Online (Sandbox Code Playgroud)
执行此操作时lein run,显然会因异常而失败.但是,我不明白为什么执行lein uberjar也因变量定义的异常而失败?为什么要执行lein uberjar尝试来评估变量值?这是特定的uberjar任务还是我错过了关于Clojure或Leiningen更重要的内容?
我试图弄清楚GCP上是否有一项服务允许使用来自Pub/Sub的流并将累积数据转储/批量到云存储中的文件(例如每X分钟)。我知道这可以通过数据流来实现,但正在寻找更多“开箱即用”的解决方案(如果存在)。
举个例子,这是人们可以使用 AWS Kinesis Firehose 完成的事情 -纯粹在配置级别- 人们可以告诉 AWS 定期或当累积的数据达到一定大小时将流中累积的任何内容转储到 S3 上的文件中。
这样做的原因是 - 当不需要流处理,而只需要积累数据时 - 我想最大限度地减少以下额外成本:
为了避免混淆 - 我不是在寻找免费的解决方案,而是寻找最佳的解决方案。
google-cloud-storage google-cloud-platform amazon-kinesis google-cloud-pubsub amazon-kinesis-firehose