标签: microservices

如何处理微服务架构中的共享状态?

在我们公司,我们正在从庞大的单片应用程序转变为微服务架构.这个决定的主要技术驱动因素是需要能够独立扩展服务和开发的可扩展性 - 我们有十个Scrum团队在不同的项目(或"微服务")工作.

过渡进程顺利,我们已经开始受益于这种新技术和组织结构的优势.另一方面,现在我们正在努力解决一个主要问题:如何管理这些微服务之间依赖关系的"状态".

让我们举一个例子:其中一个微服务处理用户和注册.这项服务(我们称之为X)负责维护身份信息,因此是用户'ID'的主要提供者.其余的微服务都非常依赖于这一点.例如,有一些服务负责依赖于这些用户ID的用户配置文件信息(A),用户权限(B),用户组(C)等,因此需要在这些服务之间维护一些数据同步(即服务A不应该具有未在服务X中注册的userId的信息).我们目前通过使用RabbitMQ通知状态更改(例如,新注册)来维持此同步.

可以想象,有许多 X:许多"主要"服务以及它们之间更复杂的依赖关系.

管理不同的开发/测试环境时出现了主要问题.每个团队(以及每个服务)都需要经历多个环境才能实现一些代码:持续集成,团队集成,验收测试和实时环境.

显然,我们需要在所有这些环境中工作的所有服务来检查系统是否整体运行.现在,这意味着为了测试依赖服务(A,B,C,...),我们不仅要依赖服务X,还要依赖服务状态.因此,我们需要以某种方式维护系统完整性并存储全局和连贯状态.

我们当前的方法是从实时环境获取所有数据库的快照,进行一些转换以缩小和保护数据隐私,并在特定环境中进行测试之前将其传播到所有环境.在组织和计算资源方面,这显然是一个巨大的开销:我们有十个持续集成环境,十个集成环境和一个验收测试环境,所有这些都需要使用来自实时和最新版本代码的共享数据进行"刷新"经常.

我们正在努力寻找一种更好的方法来缓解这种痛苦.目前我们正在评估两个选项:

  1. 使用类似docker的容器来处理所有这些服务
  2. 每个服务有两个版本(一个用于开发该服务,另一个用作沙箱,供其他团队在开发和集成测试中使用)

这些解决方案都没有减轻服务之间共享数据的痛苦.我们想知道其他一些公司/开发人员如何解决这个问题,因为我们认为这在微服务架构中必然是常见的.

你们是怎么做到的?你也有这个问题吗?有什么建议?

很抱歉很长的解释,非常感谢!

architecture deployment integration-testing test-environments microservices

19
推荐指数
2
解决办法
5239
查看次数

自定义Zuul异常

我在Zuul有一个场景,URL路由的服务也可能已关闭.因此,响应主体在JSON主体响应中被抛出500 HTTP Status和ZuulException.

{
  "timestamp": 1459973637928,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.netflix.zuul.exception.ZuulException",
  "message": "Forwarding error"
}
Run Code Online (Sandbox Code Playgroud)

我想要做的就是自定义或删除JSON响应,并可能更改HTTP状态代码.

我试图用@ControllerAdvice创建一个异常处理程序,但处理程序没有抓住异常.

更新:

所以我扩展了Zuul过滤器,我可以看到它在执行错误后进入run方法,然后如何更改响应.以下是我到目前为止所得到的.我在某处读到了有关SendErrorFilter的内容,但我如何实现它以及它做了什么?

public class CustomFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "post";
    }

    @Override
    public int filterOrder() {

        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        final RequestContext ctx = RequestContext.getCurrentContext();
        final HttpServletResponse response = ctx.getResponse();
        if (HttpStatus.INTERNAL_SERVER_ERROR.value() == ctx.getResponse().getStatus()) {
            try {
                response.sendError(404, "Error Error"); //trying to change …
Run Code Online (Sandbox Code Playgroud)

java spring-boot microservices spring-cloud netflix-zuul

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

com.netflix.discovery.shared.transport.TransportException:无法在任何已知服务器上执行请求

我是微服务的新手,并试图从链接运行代码:https://dzone.com/articles/advanced-microservices-security-with-spring-and-oa.当我只是运行代码时,我看到出现以下错误.

有什么问题?

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:111) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1030) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:944) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1468) [eureka-client-1.4.12.jar:1.4.12]
    at com.netflix.discovery.DiscoveryClient$CacheRefreshThread.run(DiscoveryClient.java:1435) [eureka-client-1.4.12.jar:1.4.12]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_144]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_144]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_144]

2017-09-09 18:53:11.909 ERROR 16268 --- [tbeatExecutor-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error
Run Code Online (Sandbox Code Playgroud)

我没有在系统上安装任何特殊功能.请告诉我我需要安装什么?

在此输入图像描述

java spring-boot microservices

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

微服务认证

上下文

我有多种服务,如:

  • 用户(LDAP或活动目录等...)
  • 开票
  • 规划
  • 等等...
  • 认证

我需要连接我的微服务使用OAuth2.0,开始使用标准登录/密码(我使用自己的数据,而不是gettint第三个腿服务器)

问题

根据这些图片:

步骤1

在此输入图像描述

第2步

在此输入图像描述

如何在authmicroservice之外的其他服务中处理access_token控制或授权控制?

rest microservices

18
推荐指数
2
解决办法
6297
查看次数

AWS Load Balancer 502

我在EC2实例上运行微服务(使用不同的编程语言).在生产时,当这些服务尝试相互交互时,我会注意到一些502 Bad Gateway Errors.此外,在所请求的服务的日志中,它没有显示任何api呼叫被击中

示例服务A调用服务B,但在服务B日志中没有任何内容表明来自服务A的呼叫.

可以是AWS负载均衡器问题吗?任何帮助,将不胜感激.提前致谢.

尝试解决方案:我们尝试在每个服务中创建http/https连接代理,但我们仍然遇到此问题.

更新:在lb日志中,会记录api,但目标响应代码显示" - ",而lb响应代码显示502或504.这是否意味着lb无法处理流量或我的应用程序?

还有什么可能的解决方案?

amazon-ec2 amazon-web-services microservices internal-load-balancer elastic-load-balancer

18
推荐指数
1
解决办法
4970
查看次数

每个Docker镜像都应该包含JDK吗?

所以,我对Docker很新.让我解释一下这个问题的背景.

  1. 我有10到20个Spring Boot微服务应用程序,每个应用程序都运行在我本地计算机上的不同端口上.

  2. 但是根据我的学习,为了迁移到Docker,每个服务必须位于不同的Docker容器中,以便快速部署或复制.

  3. 对于每个Docker容器,我们需要创建一个新的Docker镜像.

  4. 每个Docker镜像必须包含一个JRE,以便Spring Boot应用程序运行.最大约200 MB.这意味着每个泊坞窗图像最多为350 MB.另一方面,在我的本地PC上,我只有一个200 MB的JRE,每个应用程序只占用几MB空间.

  5. 基于此,我需要在本地系统上使用600 MB,但所有Docker镜像需要7 GB.

这种方法是否正确?应该将DockerHub中的"OpenJDK"添加到每个图像中吗?

即使目标PC可能已经拥有JDK,为什么图像的大小也很大?

java docker spring-boot microservices

18
推荐指数
2
解决办法
2400
查看次数

如何在服务实例上管理/平衡半持久作业

我看到了我们尝试开发的服务的常见模式,我想知道是否有工具/库可以帮助到这里.虽然微服务文献中讨论的默认作业来自REQUEST - > RESPONSE属性,但我们的工作或多或少是半永久性任务的分配.

此类任务的示例

  • 在消息队列中侦听来自源X和Y的数据,关联进来的数据并将其存储在Z中.
  • 保留一个内存缓冲区,每次有新数据输入时,它会计算过去15分钟数据的运行平均值.

目前我们的服务是用PHP编写的.由于PHP进程的感知开销和与消息队列的连接,我们希望单个服务进程能够同时处理多个这些作业.

一张图表,希望能够说明我们头脑中的设置: services_setup

  • Service Workers目前是deamonized PHP脚本
  • 对于Service Registry,我们正在关注Zookeeper

当Zookeeper(和Curator)进行负载均衡时,我没有找到任何可以分发永久作业的东西(可以更新,可移动,并且必须在工作者死亡时重新分配)

职位经理的职责

  • 知道工作
  • 了解可以完成这些工作的服务
  • 可以将作业分配给服务
  • 可以向服务发送作业更新
  • 如果工人死亡,可以重新分配工作

是否有任何库/工具可以解决这些问题,因此可以作为作业管理器使用?或者这是一个很大的反模式,我们应该采取其他方式吗?

php load-balancing microservices apache-zookeeper

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

如何在故障情形下基于事件的消息驱动的微服务架构中恢复状态

在微服务架构的背景下,消息驱动,异步,基于事件的设计似乎越来越受欢迎(参见此处此处的一些示例,以及Reactive Manifesto - 消息驱动特性)而不是同步(可能是REST)基于)机制.

考虑上下文并想象一个过度简化的订购系统,如下所示:

订购系统

和以下消息流程:

  • 订单来自某些来源(网络/移动等)
  • 订单服务接受订单并发布 CreateOrderEvent
  • InventoryService会对其做出反应CreateOrderEvent,做一些库存InventoryUpdatedEvent事务并在完成时发布
  • 然后,Invoice服务对其作出反应InventoryUpdatedEvent,发送发票并发布EmailInvoiceEvent

所有服务都很好,我们很乐意处理订单......每个人都很高兴.然后,库存服务由于某种原因而下降

假设事件总线上的事件流向"非阻塞"庄园.即消息被发布到一个中心主题,并且如果没有服务正在从中读取消息,则不会堆积在队列中(我想要传达的是事件总线,如果事件在总线上发布,它将会流"直通"而不排队 - 忽略此时使用的消息平台/技术).这意味着如果库存服务停机5分钟,那么CreateOrderEvent在此期间通过事件总线的现在已经"消失"或者没有被库存服务看到,因为在我们过度简化的系统中,没有其他系统感兴趣那些事件.

我的问题是:库存服务(以及整个系统)如何以不丢失/未处理订单的方式恢复状态?

messaging event-based-programming reactive-programming microservices

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

使用微服务架构时如何保持DB同步?

我即将了解微服务架构的工作原理.到目前为止,我理解每个微服务都需要自己的数据库,这是有道理的.

因此,假设我们有一个客户微服务,负责创建客户并返回客户列表.该服务将拥有自己的客户数据库.

可以说我们对这个服务有很高的负担,所以我们选择扩展20倍.

我们有20个微服务,每个都有自己的数据库,所有服务都在负载均衡器后面.

现在客户想要创建客户,负载均衡器将客户端请求发送到服务9/20,并创建客户.

在下一个请求中,同一客户端希望确保创建客户并希望查看客户列表,请求LB将其发送给服务11/20.

现在,我如何确保服务9/20将新创建的客户同步到服务11/20的数据库?

在MSSQL中,有一些功能可以在进行初始提交之前保持数据库同步,以便首先将数据保存在所有其他数据库中,但是这种方法从长远来看会产生问题,因为有更多的服务需要更长的时间.承诺提交?

architecture microservices

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

NodeJS中的微服务架构

我正在进行一个侧面项目,并且我将我的Skelton项目重新设计为微服务,到目前为止我没有找到任何遵循这种模式的开源项目.经过大量的阅读和搜索,我总结了这个设计,但我仍然有一些问题和想法.

在此输入图像描述

以下是我的问题和想法:

  • 如果我有来自同一微服务的2个节点,如何使API网关足够智能加载请求加载?
  • 如果其中一个微服务失效,发现应该知道什么?
  • 有没有类似的实施?我的设计是对的吗?
  • 我应该使用尤里卡或类似的东西吗?

node.js microservices

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