标签: microservices

尤里卡和Kubernetes

我正在整理一个概念证明,以帮助使用Spring Boot/Netflix OSS和Kubernetes一起识别陷阱.这也是为了证明Prometheus和Graphana等相关技术.

我有一个Eureka服务设置,在我的Kubernetes clouster中没有任何问题.这被命名为discovery,并在使用K8添加到K8时被命名为"discovery-1551420162-iyz2c"

kubectl run discovery --image=xyz/discovery-microservice --replicas=1 --port=8761

对于我的配置服务器,我正在尝试使用基于逻辑URL的Eureka,所以在我的bootstrap.yml中

server:
  port: 8889

eureka:
  instance:
    hostname: configserver
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xyz/microservice-config
Run Code Online (Sandbox Code Playgroud)

我正在开始使用它

kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889
Run Code Online (Sandbox Code Playgroud)

该服务最终运行命名为configserver-3481062421-tmv4d.然后我在配置服务器日志中看到异常,因为它试图找到eureka实例而不能.

我有相同的设置使用docker-compose本地链接,它启动各种容器没有任何问题.

discovery:
  image: xyz/discovery-microservice
  ports:
   - "8761:8761"
configserver:
  image: xyz/config-microservice
  ports:
   - "8888:8888"
  links:
   - discovery
Run Code Online (Sandbox Code Playgroud)

我怎么能设置像eureka.client.serviceUri这样的东西,这样我的微服务可以在不知道K8集群内的固定IP地址的情况下定位他们的同行?

spring-boot kubernetes microservices netflix-eureka spring-cloud-netflix

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

微服务和.NET

如何在.NET世界中构建面向微服务的应用程序?是否有任何平台可以在.NET世界中编写面向微服务的应用程序?如何设想包含微服务,事件存储和一些NoSQL数据库的架构?谢谢.

.net microservices

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

基于微服务的web应用程序的体系结构

我对网络应用程序分散到微服务这一点感到困惑 - 它是在url级别还是在模型级别?举个例子,假设我有一个3页的单片应用程序.假设每个页面都有一个单独的用例,我想用他们自己的微服务来支持它们.现在,哪些是实现基于微服务的架构的正确方法:

  • 我创建了三个不同的应用程序(微服务),每个应用程序包含其中一个页面的(路径,控制器,模型,模板).然后根据请求的页面,我将请求路由到该特定应用程序.这意味着从数据库到HTML的整个页面由一个单独的应用程序提供.基本上,同一网站中的不同页面完全由后端的不同应用程序提供服务.
  • 3个微服务不处理UI内容,只处理其用例(模型,控制器,无模板)的数据,并通过REST API进行公开.我有一个面向公众的应用程序.此应用程序仅查询三个不同的应用程序(微服务),然后构建要返回给浏览器的html页面.在这种情况下,Web应用程序中的所有页面都由一个应用程序提供,该应用程序在内部使用三种不同的微服务.

在此输入图像描述

soa web-applications microservices

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

如何在微服务/事件驱动架构中处理HTTP请求?

背景:

我正在构建一个应用程序,所提出的架构是微服务架构上的事件/消息驱动.

做事的单一方式是我有一个User/HTTP request和那个动作一些直接的命令synchronous response.因此,响应相同的用户/ HTTP请求是"无忧无虑".

在此输入图像描述

问题:

用户发送HTTP requestUI服务(有多个UI服务),该触发某些事件到队列(卡夫卡/ RabbitMQ的/有).N个服务选择事件/消息在此过程中做了一些魔术,然后在某些时候,相同的UI服务应该选择响应并将其返回给发起HTTP请求的用户.请求处理ASYNC,但User/HTTP REQUEST->RESPONSESYNC按照典型的HTTP交互.

问题: 如何在此不可知/事件驱动的世界中向发起操作的同一UI服务(通过HTTP与用户交互的服务)发送响应?

到目前为止,我的研究 一直在环顾四周,似乎有些人正在使用WebSockets解决这个问题.

但是复杂性层需要有一些映射表,(RequestId->Websocket(Client-Server))用于"发现"网关中的哪个节点具有用于某些特定响应的websocket连接.但即使我理解了问题和复杂性,我也陷入困境,我找不到任何可以提供有关如何在实现层解决此问题的信息的文章.这还不是因为第三方集成如预期支付服务提供商(WorldPay的)的一个可行的选择REQUEST->RESPONSE-特别是关于3DS验证.

所以我不知道如何认为WebSockets是一个选项.但即使WebSockets适用于Webfacing应用程序,连接到外部系统的API也不是一个很好的架构.

******更新:******

即使长轮询是带有202 Accepteda Location header和a 的WebService API的可能解决方案,retry-after header它也不具备高并发性和高性能网站的性能.想象一下,有很多人试图在他们提出的每个请求上更新事务状态,你必须使CDN缓存无效(现在去玩这个问题!哈).

但最重要且与我的情况相关的是我的第三方API,例如支付系统,其中3DS系统具有由支付提供商系统处理的自动重定向,并且他们期望是典型的REQUEST/RESPONSE flow,因此这种模型对我和套接字都不起作用模型会起作用.

由于这个用例,HTTP REQUEST/RESPONSE应该以典型的方式处理,我有一个愚蠢的客户端,期望在后端处理进动的复杂性.

所以我正在寻找一个解决方案,在外部我有一个典型的Request->Response(SYNC)和状态的复杂性(系统的ASYNCrony)在内部处理

长轮询的一个示例,但此模型不适用于第三方API,例如支付提供商,3DS Redirects这不在我的控制之内.

 POST /user
    Payload {userdata}
    RETURNs: 
        HTTP/1.1 202 Accepted
        Content-Type: application/json; charset=utf-8 …
Run Code Online (Sandbox Code Playgroud)

rest websocket node.js apache-kafka microservices

27
推荐指数
2
解决办法
2761
查看次数

微服务架构:跨服务数据共享

考虑以下针对在线商店项目的微服务:
用户服务保存有关商店用户的帐户数据(包括名字,姓氏,电子邮件地址等)

采购服务会跟踪用户购买的详细信息.

每项服务都提供用于查看和管理其相关实体的UI.购买服务索引页面列出了购买.每个购买项目应包含以下字段:
id,购买用户的全名,购买的商品标题和价格.
此外,作为索引页面的一部分,我想有一个搜索框让商店经理通过购买用户名来搜索购买.

我不清楚如何获取采购服务不具备的数据 - 例如:用户的全名.当尝试通过购买用户名来执行更复杂的搜索购买时,问题会变得更糟.

我想通过在用户创建时广播某种事件(并且只保存购买服务端的相关用户属性),我可以通过在两个服务之间同步用户来解决这个问题.从我的角度来看,这远非理想.当你有数百万用户时,你如何处理这个问题?你会在每个消费用户数据的服务中创建数百万条记录吗?

另一个明显的选择是在用户服务端公开API,它根据给定的ID返回用户详细信息.这意味着购买服务中的每个页面加载,我都必须调用用户服务才能获得正确的用户名.不理想,但我可以忍受它.

如何根据用户名实施购买搜索?我总是可以在Users Service端公开另一个API端点,它接收查询项,在Users Service中对用户名执行文本搜索,然后返回符合条件的所有用户详细信息.在采购服务中,将相关的ID映射回正确的名称并在页面中显示它们.这种方法也不理想.

我错过了什么吗?有没有其他方法来实现上述?也许我面临这个问题的事实是一种代码味道?我很乐意听到其他解决方案.

architecture web-services microservices

26
推荐指数
2
解决办法
8282
查看次数

将Amazon SQS与多个消费者一起使用

我有一个基于服务的应用程序,它使用具有多个队列和多个消费者的Amazon SQS.我这样做是为了实现基于事件的体系结构并解耦所有服务,其中不同的服务对其他系统的状态变化做出反应.例如:

  • 注册服务:
    • 当新用户注册时,发出事件'registration-new'.
  • 用户服务:
    • 在用户更新时发出事件'用户更新'.
  • 搜索服务:
    • 从队列'registration-new'读取并在搜索中索引用户.
    • 从队列"用户更新"中读取并在搜索中更新用户.
  • 指标服务:
    • 从"registration-new"队列中读取并发送到Mixpanel.
    • 从队列'用户更新'中读取并发送到Mixpanel.

我有很多问题:

  • 进行轮询时,可以多次接收消息.我可以设计很多系统是幂等的,但是对于某些服务(例如度量服务)来说要困难得多.
  • 需要在SQS中从队列中手动删除消息.我曾想过实现一个"消息处理服务",它在所有服务都收到消息时处理消息的删除(每个服务在处理消息后都会发出'消息确认'事件).

我想我的问题是:我应该使用哪些模式来确保我可以在SQS中为单个队列拥有多个使用者,同时确保消息也可以被可靠地传递和删除.谢谢您的帮助.

event-based-programming amazon-sqs amazon-web-services microservices

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

跨微服务的数据一致性

虽然每个微服务通常都有自己的数据 - 但某些实体需要在多个服务之间保持一致.

对于高度分布式环境(如微服务架构)中的此类数据一致性要求,设计有哪些选择?当然,我不想要共享数据库体系结构,其中单个数据库管理所有服务的状态.这违反了孤立和无共享的原则.

我明白,微服务可以在创建,更新或删除实体时发布事件.对此事件感兴趣的所有其他微服务可以相应地更新其各自数据库中的链接实体.

这是可行的,但它会导致整个服务中的许多仔细和协调的编程工作.

Akka或任何其他框架可以解决这个用例吗?怎么样?

编辑1:
为清楚起见,添加下图.
基本上,我试图理解,如果今天有可用的框架可以解决这个数据一致性问题.

对于队列,我可以使用任何AMQP软件,如RabbitMQ或Qpid等.对于数据一致性框架,我不确定目前Akka或任何其他软件是否可以提供帮助.或者这种情况是如此罕见,以及这种反模式,不需要任何框架?
在此输入图像描述

design-patterns data-consistency akka microservices

26
推荐指数
3
解决办法
8108
查看次数

2PC vs Sagas(分布式交易)

我正在开发我对分布式系统的洞察力,以及如何在这些系统中保持数据一致性,其中业务事务涵盖多个服务,有限的上下文和网络边界.

以下是我知道用于实现分布式事务的两种方法:

  • 两阶段提交(2PC)
  • 传奇

2PC是应用程序通过平台的支持透明地利用全局ACID事务的协议.作为平台的嵌入,据我所知,它对业务逻辑和应用程序代码是透明的.

另一方面,Sagas是一系列本地事务,其中每个本地事务变异并持久化实体以及指示全局事务的阶段并提交更改的一些标志.换句话说,事务的状态是域模型的一部分.回滚是进行一系列"倒置"交易的问题.在两种情况下,服务发出的事件都会触发这些本地事务.

现在,何时以及为什么人们会使用传真而不是2PC,反之亦然?两者的用例和优点/缺点是什么?特别是,传奇的脆弱让我感到紧张,因为倒置的分布式交易也可能失败.

cloud transactions distributed-computing saga microservices

26
推荐指数
3
解决办法
3601
查看次数

哪个选项更适合微服务?GRPC 或消息代理(例如 RabbitMQ)

我想开发一个微服务结构的项目。我必须使用 php/laravel 和 nodejs/nestjs 我的微服务之间的最佳连接方法是什么。我读到了 RabbitMQ 和 NATS 消息传递以及 GRPC 哪个选项更适合微服务?为什么?提前致谢

rabbitmq messagebroker microservices grpc nats.io

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

使用Zuul作为身份验证网关

背景

我想实现本文中介绍的设计.

它可以通过下图总结: 安全架构

  1. 客户端首先使用IDP进行身份验证(OpenID Connect/OAuth2)
  2. IDP返回访问令牌(不带用户信息的不透明令牌)
  3. 客户端通过API网关进行调用,使用Authorization标头中的访问令牌
  4. API网关使用访问令牌向IDP发出请求
  5. IDP验证访问令牌是否有效并以JSON格式返回用户信息
  6. API网关将用户信息存储在JWT中,并使用私钥对其进行签名.然后将JWT传递给下游服务,该服务使用公钥验证JWT
  7. 如果服务必须调用另一个服务来完成请求,它将通过JWT,该JWT用作请求的身份验证和授权

到目前为止我有什么

我完成了大部分工作:

  • Spring云作为全球框架
  • Spring启动以启动个人服务
  • Netflix Zuul作为API网关

我还编写了一个Zuul PRE过滤器,用于检查访问令牌,联系IDP并创建JWT.然后将JWT添加到转发到下游服务的请求的标头中.

问题

现在我的问题非常具体针对Zuul及其过滤器.如果由于任何原因在API网关中验证失败,我怎样才能停止路由并直接用401响应而不继续过滤链并转发呼叫?

如果验证失败,过滤器将不会将JWT添加到标头,401将来自下游服务.我希望我的网关可以阻止这种不必要的通话.

我试着看看我怎么com.netflix.zuul.context.RequestContext用来做这个,但文档很差,我找不到办法.

gateway spring-boot microservices spring-cloud netflix-zuul

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