我一直非常有兴趣尝试将微服务/ SOA作为一种架构,并且很难概念化服务之间的集成是如何实现的.
我喜欢使用消息传递将客户端与服务分离的想法,但不了解系统如何专门使用它.典型的异步操作和发布/订阅内容显然是有意义的 - 例如创建新订单,广播报告数据等.我不明白的是人们是否通常尝试将消息传递用于常见的请求/回复场景 - 例如,用户点击他们的"个人资料"页面,并且需要在页面上呈现的部分数据来自用户服务.
我知道常见的消息传递实现提供类似REST的回复/请求功能,但是它通常用于简单的数据请求吗?微服务似乎更有可能暴露REST端点并向消息代理注册它将参与的不同类型的通信,但我所看到的SOA和微服务架构的所有这些演示似乎都暗示它们只使用其中一种. .
感谢您的任何精心设计/经验!
我有一个Spring Boot应用程序,它运行在嵌入式Tomcat servlet容器上mvn spring-boot:run.而且我不想将项目作为单独的战争部署到独立的Tomcat.
每当我将代码推送到BitBucket/Github时,钩子就会运行并触发Jenkins作业(在Amazon EC2上运行)来部署应用程序.
Jenkins作业有一个后期构建操作:mvn spring-boot:run问题是当构建操作完成后作业挂起.
应该有另一种方法来做到这一点.任何帮助,将不胜感激.
我进入基于docker的微服务架构,我有3个微服务,它们共同创建了一个产品,例如"CRM系统".
现在我希望我的客户能够随时升级他的产品.我有3个不同版本的微服务,客户应该看到哪一个?我想产品版本应该独立于微服务,因为复制一个微服务版本会让我比没有版本更麻烦.
那么有什么模式,想法来处理这种情况吗?
我唯一想到的是拥有另一个存储库,只要其中一个微服务生成生产就绪包,就会对其进行版本控制.但是,我现在有一个版本,我的产品所有者(PO)都不知道.
我看过一篇文章" 微服务 "由Martin Fowler,并发现它很难理解智能端点 S和哑管道.请解释这些条款,欢迎提供实例.
构建微服务架构我遇到了同一微服务实例之间数据共享的问题.
我有微服务,大量使用它的数据源 - 每个服务请求导致数据库请求(通常是插入).这项服务将被大量使用,我计划在Load Balancer后面隐藏多个实例.这里提出一个问题:这些实例应该使用一个数据库(数据库会成为瓶颈吗?)还是MULTIPLE(每个实例的数据源)?
我正在使用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) 在我们使用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
下午你们都
只是想找人来仔细检查我的工作.以下是保护微服务的有效方法吗?
将我们的单片应用程序和单一的Partner API分解为面向特定业务功能的微服务.它们很可能是在docker容器中运行的小型expressjs应用程序,在弹性beanstalk上,谁知道.他们会住在某个地方:)
我正在研究将Kong作为我的API网关或使用AWS API Gateway来封装我的微服务的细节.而且,它感觉很好.
Kong 的JWT插件将验证JWT的签名,然后将customer_id标题中的一行传递给微服务.我还要提一下,我们的第三方开发人员也将参与集成乐趣.这是我看到的事情的基本草图:
Kong有一个很好的访问控制插件.我们的应用程序和移动应用程序将以"上帝"权限运行,但我绝对可以将开发人员锁定到特定的路由和方法.
撤销第三方访问将很容易,撤销最终用户访问将不会那么简单,除非我愿意通过生成新秘密立即使所有JWT无效.也许我可以限制令牌时间为10分钟左右,使我们的应用程序会检查他们是否过期,得到一个新的令牌,然后与原始请求得到.这样我就可以在数据库或其他东西中"标记"它们,而不是让JWT生成.
在任何地方都使用SSL,JWT存储在Web浏览器中仅限SSL的cookie中,并且在任何声明中都没有存储敏感信息.
多谢你们.
我在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) 我是微服务的新手,并试图从链接运行代码: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)
我没有在系统上安装任何特殊功能.请告诉我我需要安装什么?
microservices ×10
architecture ×4
spring-boot ×4
java ×3
soa ×3
messaging ×2
netflix-zuul ×2
spring-cloud ×2
api ×1
database ×1
distributed ×1
docker ×1
jenkins ×1
jwt ×1
kong ×1
maven ×1
security ×1
spring ×1
tomcat ×1