标签: microservices

使用消息传递的微服务和SOA

我一直非常有兴趣尝试将微服务/ SOA作为一种架构,并且很难概念化服务之间的集成是如何实现的.

我喜欢使用消息传递将客户端与服务分离的想法,但不了解系统如何专门使用它.典型的异步操作和发布/订阅内容显然是有意义的 - 例如创建新订单,广播报告数据等.我不明白的是人们是否通常尝试将消息传递用于常见的请求/回复场景 - 例如,用户点击他们的"个人资料"页面,并且需要在页面上呈现的部分数据来自用户服务.

我知道常见的消息传递实现提供类似REST的回复/请求功能,但是它通常用于简单的数据请求吗?微服务似乎更有可能暴露REST端点并向消息代理注册它将参与的不同类型的通信,但我所看到的SOA和微服务架构的所有这些演示似乎都暗示它们只使用其中一种. .

感谢您的任何精心设计/经验!

architecture messaging soa microservices

21
推荐指数
1
解决办法
5242
查看次数

如何使用Jenkins部署SpringBoot Maven应用程序?

我有一个Spring Boot应用程序,它运行在嵌入式Tomcat servlet容器上mvn spring-boot:run.而且我不想将项目作为单独的战争部署到独立的Tomcat.

每当我将代码推送到BitBucket/Github时,钩子就会运行并触发Jenkins作业(在Amazon EC2上运行)来部署应用程序.

Jenkins作业有一个后期构建操作:mvn spring-boot:run问题是当构建操作完成后作业挂起.

应该有另一种方法来做到这一点.任何帮助,将不胜感激.

tomcat maven jenkins spring-boot microservices

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

产品版本微服务

我进入基于docker的微服务架构,我有3个微服务,它们共同创建了一个产品,例如"CRM系统".

现在我希望我的客户能够随时升级他的产品.我有3个不同版本的微服务,客户应该看到哪一个?我想产品版本应该独立于微服务,因为复制一个微服务版本会让我比没有版本更麻烦.

那么有什么模式,想法来处理这种情况吗?

我唯一想到的是拥有另一个存储库,只要其中一个微服务生成生产就绪包,就会对其进行版本控制.但是,我现在有一个版本,我的产品所有者(PO)都不知道.

architecture soa domain-driven-design docker microservices

21
推荐指数
2
解决办法
8262
查看次数

微服务:什么是智能终端和哑管?

我看过一篇文章" 微服务 "由Martin Fowler,并发现它很难理解智能端点 S和哑管道.请解释这些条款,欢迎提供实例.

architecture messaging soa distributed microservices

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

微服务:每个实例或每个微服务的数据源?

构建微服务架构我遇到了同一微服务实例之间数据共享的问题.

我有微服务,大量使用它的数据源 - 每个服务请求导致数据库请求(通常是插入).这项服务将被大量使用,我计划在Load Balancer后面隐藏多个实例.这里提出一个问题:这些实例应该使用一个数据库(数据库会成为瓶颈吗?)还是MULTIPLE(每个实例的数据源)?

database architecture microservices

20
推荐指数
2
解决办法
4329
查看次数

Netflix Feign - 通过微服务传播状态和异常

我正在使用Netflix Feign将微服务A的一个操作调用到微服务B的其他操作,该操作使用Spring Boot验证代码.

如果验证不好,微服务B的操作会抛出异常.然后我在微服务中处理并返回下一个HttpStatus.UNPROCESSABLE_ENTITY(422):

@ExceptionHandler({
       ValidateException.class
    })
    @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
    @ResponseBody
    public Object validationException(final HttpServletRequest request, final validateException exception) {
        log.error(exception.getMessage(), exception);
        error.setErrorMessage(exception.getMessage());
        error.setErrorCode(exception.getCode().toString());
        return error;
    }
Run Code Online (Sandbox Code Playgroud)

因此,当微服务A在接口中调用B作为下一个:

@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /other")
void otherOperation(@Param("other")  String other );

@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /code/validate")
Boolean validate(@Param("prefix") String prefix);

static PromotionClient connect() {

    return Feign.builder()
        .encoder(new GsonEncoder())
        .decoder(new GsonDecoder())
        .target(PromotionClient.class, Urls.SERVICE_URL.toString());
}
Run Code Online (Sandbox Code Playgroud)

并且验证失败它返回内部错误500并显示下一条消息:

{
  "timestamp": "2016-08-05T09:17:49.939+0000",
  "status": 500,
  "error": "Internal Server Error",
  "exception": "feign.FeignException",
  "message": "status 422 reading …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot microservices netflix-feign

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

如何使用Spring Cloud和Netflix OSS在微服务之间进行路由

在我们使用Spring Cloud开发微服务的过程中,我们开始使用Zuul作为从外部到微服务的任何连接的代理,以及任何需要联系其他微服务的微服务.

一段时间后,我们得出结论,Zuul被设计为边缘服务(仅从外部到微服务的代理流量),不应该用于跨微服务通信.特别是Spring Cloud建议使用eureka与另一个服务建立直接(可能是负载平衡)连接的方式使我们反对在所有事件之间使用Zuul.

当然,一切都按预期工作得很好(就像Spring云一样),但我们对如何使用此设置执行某个用例毫无头绪.

在部署新版本的微服务时,我们希望对旧版本和新版本进行蓝/绿部署.但是,在微服务之间没有Zuul,两个单独服务之间的通信将继续使用旧版本,直到从eureka中删除.

我们正在考虑如何实现这一目标.在下面的图片中,我画了我认为可能是一个选项.

在图片的第一部分,Zuul打电话给eureka来获取注册表来创建路线.服务1还调用eureka以使注册表路由到服务2.由于服务2在eureka注册表中,因此路由成功完成.

在图的第二部分中,部署了服务2(服务2.1)的更新.它也注册了eureka,这使得服务1现在可以路由到服务2和服务2.1.蓝/绿部署不需要这样做.

在第三部分中,展示了针对此问题的另一个eureka实例的潜在解决方案.此实例不支持对等,不会与第一个eureka实例同步.与第一个实例相反,这个唯一的目的是促进蓝色/绿色部署.服务2.1向第二个eureka实例注册,服务1将其配置更改为从第一个尤其是第二个eureka实例获取其注册表.

在此输入图像描述

我们面临的主要问题是这是否是一个可行的解决方案.具有Zuul路由的灵活性是我们在这种情况下没有的一大优点.我们应该回过头来通过Zuul路由每个服务到服务的呼叫,还是有另一个解决方案(可能是某种类型的功能区配置)更合适?或者第二个eureka实例是此类部署的最佳解决方案?

任何反馈将不胜感激.

亲切的问候,安德烈亚斯

blue-green-deployment microservices spring-cloud netflix-eureka netflix-zuul

19
推荐指数
1
解决办法
3215
查看次数

如何将API网关与微服务和JWT结合使用?

下午你们都

只是想找人来仔细检查我的工作.以下是保护微服务的有效方法吗?

前提

将我们的单片应用程序和单一的Partner API分解为面向特定业务功能的微服务.它们很可能是在docker容器中运行的小型expressjs应用程序,在弹性beanstalk上,谁知道.他们会住在某个地方:)

我正在研究将Kong作为我的API网关或使用AWS API Gateway来封装我的微服务的细节.而且,它感觉很好.

Kong 的JWT插件将验证JWT的签名,然后将customer_id标题中的一行传递给微服务.我还要提一下,我们的第三方开发人员也将参与集成乐趣.这是我看到的事情的基本草图:

履行

  1. 为我们拥有的每个平台和第三方开发人员生成"消费者".(网络应用,移动应用,我们有目前的集成合作伙伴注:我不希望为登录的每个用户创建消费者虽然肯定更安全,这增加了大量的工作同样,如果你弄清楚.如何从我的API网关中获取秘密我明显有其他问题)
  2. 让孔验证对我的要求.有点像门口的保镖,没有授权,只是认证.
  3. 我并不需要知道令牌是有效的,一旦它到达微服务,我可以使用一些中间件将其解码并使用自定义逻辑来决定是否该用户真正应该做的是什么,他们正在试图做的.

额外的东西

  • Kong有一个很好的访问控制插件.我们的应用程序和移动应用程序将以"上帝"权限运行,但我绝对可以将开发人员锁定到特定的路由和方法.

  • 撤销第三方访问将很容易,撤销最终用户访问将不会那么简单,除非我愿意通过生成新秘密立即使所有JWT无效.也许我可以限制令牌时间为10分钟左右,使我们的应用程序会检查他们是否过期,得到一个新的令牌,然后与原始请求得到.这样我就可以在数据库或其他东西中"标记"它们,而不是让JWT生成.

  • 在任何地方都使用SSL,JWT存储在Web浏览器中仅限SSL的cookie中,并且在任何声明中都没有存储敏感信息.

多谢你们.

security api jwt microservices kong

19
推荐指数
1
解决办法
3454
查看次数

自定义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万
查看次数