Spring cloud 微服务体系结构中的超媒体响应

Spring cloud 微服务体系结构中的超媒体响应,spring-cloud,spring-data-rest,microservices,spring-cloud-netflix,Spring Cloud,Spring Data Rest,Microservices,Spring Cloud Netflix,我已经开始使用SpringCloud和Netflix的项目学习更多关于这种架构的知识 从总体上看,我确实理解架构,但现在我实际上正在编写一个应用程序,人们对一些可能对架构的大方法产生重大影响的最小内容产生了怀疑 首先,我的应用程序基于本教程,我认为它是有效的,因为它来自Spring本身: 现在,问题是:所有这些都使用了EUREKA,比如说,我有一个微服务帐户,它只包含用于持久性/HATEOAS的Spring数据REST,最重要的是,我有一个客户端服务,它使用RestTemplate使用这些端点,

我已经开始使用SpringCloud和Netflix的项目学习更多关于这种架构的知识

从总体上看,我确实理解架构,但现在我实际上正在编写一个应用程序,人们对一些可能对架构的大方法产生重大影响的最小内容产生了怀疑

首先,我的应用程序基于本教程,我认为它是有效的,因为它来自Spring本身:

现在,问题是:所有这些都使用了EUREKA,比如说,我有一个微服务帐户,它只包含用于持久性/HATEOAS的Spring数据REST,最重要的是,我有一个客户端服务,它使用RestTemplate使用这些端点,因为我使用的是Ribbon的负载平衡器。在我看来,这就是它的工作原理:用户->前端->客户端服务->SpringDataRESTEndpoints微服务->数据库

这很好,但当我从RestTemplate获得端点响应时,它包含直接连接到微服务的超媒体,就其本身而言,您现在可以在忽略负载平衡器的情况下通过微服务,这对我来说,扼杀了它的用途。如果我喜欢5个微服务相互扩展,这意味着用户现在只关注5个微服务中的一个,而这些微服务被认为是由负载平衡器管理的

问题1: 对于一个用户来说,拥有API的知识,然后有点扼杀结构的一部分是可以的吗

即使我向Eureka检测到的服务添加链接并删除该微服务的当前端点,这些链接也不会起作用,这意味着我正在切断超媒体链接

问题2: 还有其他方法吗?通过某种代理、外部负载均衡器、dns或类似的东西

我不知道我是否说得够清楚。如果有雾,请告诉我

p.D.2:总结问题:如何处理这些媒体链接?让他们成为或使用其他东西请告诉我,让他们真正正确

编辑:根据以下建议,我添加了Zuul,这似乎是我问题的解决方案。现在,关于Zuul,我应该在哪里使用过滤器

我的应用程序现在是这样的:account microservice Spring Data REST和带有RestTemplate负载平衡器的account web服务客户端。这些是尤里卡注册的名字

@EnabledZuulProxy必须去哪里?在微服务内部还是在客户端内部

我当前的配置是此配置当前,@EnabledZuulProxy位于客户端:

我的微服务:

@SpringBootApplication
@EnableEurekaClient
public class AccountServer {

    public static void main(String[] args) {
        System.setProperty("spring.config.name", "AccountServerClient");
        SpringApplication.run(AccountServer.class, args);
    }
 }

 //Config:
 spring.application.name=account-microservice
 spring.application.freemarker.enabled=false
 eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
 eureka.client.instance.leaseRenewalIntervalInSeconds=5
我的客户:

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableCircuitBreaker
public class AccountMicroService {

    public static void main(String[] args) {
        // Tell server to look for registration.properties or registration.yml
        System.setProperty("spring.config.name", "AccountMicroServiceClient");
        SpringApplication.run(AccountMicroService.class, args);
    }
 }

 //Config
 # Spring properties
 spring.application.name=account-web-service
 spring.freemarker.enabled=false
 eureka.instance.leaseRenewalIntervalInSeconds: 5
 eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
 zuul.routes.account-web-service.path=/accounts/**
 zuul.routes.account-web-service.serviceId=account-web-service
 zuul.routes.account-web-service.stripPrefix=false
使用SDR的客户端代码:

//@HystrixCommand(fallbackMethod="test")
public ResponseEntity<PagedResources<AccountResource>> findAll(Pageable pageable) throws RestClientException, URISyntaxException {

    return restTemplate.exchange(serviceUrl + "/accounts" + "?page={page}&size={size}&sort={sort}", HttpMethod.GET,
            null, new ParameterizedTypeReference<PagedResources<AccountResource>>() {
            }, pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort());
}
像这样,它根本不起作用。也没有过滤。如果我改变它并在微服务中使用它,那么它会不断地将指向微服务的所有内容发送到客户端,甚至是来自客户端的请求,最终导致循环,然后出现错误超时、负载均衡器已满、电路断开。。。通常是这样的:com.netflix.zuul.exception.zuuleexception:转发错误

编辑2:我终于让Zuul开始工作,并了解它的功能。现在,当我访问我的新网关应用程序时,它将请求转发到我的微服务,生成的超媒体现在指向我想要的网关

这个问题最初是架构性的,后来变成了编码问题,但现在我想我对这项技术已经很清楚了


这杯茶是在了解Zuul做什么,什么时候做,如何做@Ryan Baxter指南和这两篇文章:以及完成这项工作的基础。我将用我所做的和我所理解的来编辑一个答案。

如果您使用Spring Cloud Netflix的Zuul作为负载平衡器,它将自动添加Spring HATEOAS将尊重的X-Forwarded-Host头。当该标头存在时,HATEOAS将使用标头中的主机值生成链接。如果您不使用Zuul,则必须配置负载平衡器以添加该标头。

好的,我所做的只是按照@Ryan的建议使用Zuul。问题是,一开始,我没有找到解决这个问题的方法。这是一个很小的架构问题,在用我在问题底部添加的两篇文章对@Ryan的建议进行内部化之后,最终使它们都正确无误

第一:现在我的项目正在使用Zuul,按照我建议的两个链接创建网关应用程序,并且在其类路径中同时包含Hybrix和Ribbon,Zuul必须将它们连接在一起,变成一个具有断路器和负载平衡特性的多功能代理网关

第二:我摆脱了rest模板负载平衡器,因为:a因为我没有发送端口转发头,这几乎使Zuul的代理功能失效,所以我没有发送获取microservice超媒体的响应;b因为Zuul作为网关代理负载平衡器,我认为这是一个样板,可以再次使用ribbon和res t模板


现在,我的应用程序是这样的:用户->{[Zuul的网关->Zuul转发的Spring数据REST微服务]实际上,我开始使用Zuul,但它似乎没有起到任何作用,超媒体与往常一样,工作起来就像Zuul没有任何额外的路由一样。介意给我一点指导吗?如果你使用RestTemplate打电话,你必须添加正确的标题,以便其他服务理解。介意告诉我怎么做吗?只是添加标题X-Forwarded Host:serviceName到每个RestTemplate?好的,我有点想让Zuul工作,但现在它完全被阻止了。无法直接访问微服务继续循环到客户端服务,然后说负载平衡器已满,当通过客户端服务访问时,以Hybrix运行时异常结束:超时和回退我不确定你所说的Zuul是什么意思被屏蔽了。除非你提供更多细节,否则我们真的帮不了你。重现问题的样本总是有用的。