当前位置: 首页 > 知识库问答 >
问题:

如何设置Spring Cloud Gateway应用程序,使其能够使用Spring Cloud Kubernetes的服务发现?

袁翰池
2023-03-14

我创建了两个Spring Boot应用程序,它们都将部署在Kubernetes集群中。其中一个应用程序将充当网关,因此使用Spring Cloud gateway作为依赖项。另外,我希望将服务发现与Spring Cloud Kubernetes集成,并且网关使用服务发现自动生成相应的路由。但是,当我公开运行在本地Minikube集群中的网关应用程序并调用第二个应用程序/服务时,我会得到一个503错误,其中包含以下消息:无法找到...-service的实例

目前我已经安装了以下内容:

  • 迷你库贝
  • VirtualBox
  • Docker工具箱

我创建了一个带有两个子项目(网关和另一个服务)的Gradle项目。所有项目都将在本地构建/部署。默认服务帐户具有读取Kubernetes API的权限。在部署这些服务之后,我向外部公开网关服务。在网关服务中,我实现了一些endpoint,这些endpoint

  1. 提供集群中与DiscoveryClient相比的所有服务的列表。
  2. 在应用程序层根据DiscoveryClient提供的URI调用其他服务。

一切似乎都工作了,但是当我用URI/serviceID调用另一个服务时,我得到了503错误...

使用了以下Spring Cloud版本:spring-cloud-starter-kubernetes 1.0.1。release spring-cloud-starter-gateway 2.1.1

我的演示应用程序可以在https://github.com/nmaoez/spring-cloud-gateway-kubernetes获得,readme.md提供了在本地Minikube集群中部署这两个服务的步骤。此外,还显示了所有可用的endpoint。但交互部分是application.yaml和网关的应用程序类。

application.yaml:

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
management:
  endpoints:
    web:
      exposure:
        include: '*'
java prettyprint-override">@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class GatewayApplication {

  @Autowired
  RestTemplate restTemplate;

  @Autowired
  private DiscoveryClient discoveryClient;

  @GetMapping("/")
  @ResponseBody
  public String hello() {
    return "GatewayApplication says hello!";
  }

  @GetMapping("/test")
  @ResponseBody
  public String invokeTestService() {
    List<ServiceInstance> testServiceInstances = this.discoveryClient.getInstances("test-service");
    return restTemplate.getForObject(testServiceInstances.get(0).getUri(), String.class);
  }

  @GetMapping("/services")
  public List<String> services() {
    return this.discoveryClient.getServices();
  }

  @GetMapping("/services/{serviceId}")
  public List<ServiceInstance> servicesById(@PathVariable("serviceId") String serviceId) {
    return this.discoveryClient.getInstances(serviceId);
  }

  @Bean
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }

  public static void main(String[] args) {
    SpringApplication.run(GatewayApplication.class, args);
  }
}

在将gateway-service/application.yaml中的url-expression字段覆盖到

url-expression: "uri+'/'"

之后,在调用gateway-uri/另一个-service/后得到了正确的响应。但我希望不要显式替换lb://serviceid的默认值。我怎么能那么做?

我希望,如果我通过网关调用集群中的另一个服务,我会在应用程序的rest控制器中得到一个200响应和正确的答案。

共有1个答案

陶高峻
2023-03-14

您还必须将依赖项添加到spring-cloud-starter-kubernetes-ribbon

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
            <version>1.0.1.RELEASE</version>
        </dependency>

然后它将不需要任何重写就可以工作,只需要spring.cloud.gateway.discovery.locator.enabled:true

 类似资料:
  • 我有ApacheTomcatWeb服务器,在这里我运行3-4JavaSpring和hibernate应用程序。但问题是,当有太多请求进入服务器时,服务器会给出内存不足错误或堆大小错误,最后由于服务器没有响应而导致站点关闭。有时还会出现连接错误或套接字错误。我希望我的服务器至少能处理2000个请求。 到现在为止,我用了很多方法来处理这个问题。 通过更改setenv中的大小来增加服务器的堆大小。sh文

  • 我写了一个CLLocationManager ios应用程序。但是,我无法看到我的应用程序出现在位置服务中的设置在我的iPhone上。我需要在Xcode中的ios项目中设置plist中的特定值吗?提前感谢!

  • 问题内容: 我有自己的域名,使用Go编写了Web服务。我正在使用内置的Go Web服务器,前面没有Nginx或Apache。 我想开始通过HTTPS服务,我意识到让我们加密即将成为实现此目的的途径。 任何人都可以共享配置在Linux服务器上运行的Go应用程序的整个设置过程吗? 问题答案: 这是使用我发现的Go and Let’s Encrypt证书对HTTPS服务器进行的最小自动设置: 有关aut

  • 我对将CPU密集型web应用部署到Azure应用程序服务实例很感兴趣。我找不到有关Azure应用程序服务的CPU使用率和/或限制的任何详细信息。我担心的是,如果不了解我的应用程序的CPU规格/限制,我就无法规划如何准确规划基于云的物理基础设施(使用Azure应用程序服务)。 我的应用程序将使用OpenCV计算机视觉库对数百/数千张高质量图像进行重图像处理、人脸检测和人脸识别。这自然是一个CPU密集

  • 我有一个部署在Azure应用服务上的NodeJS应用程序。用38 MB的文件做一个帖子,我得到一个404错误,但是在引擎盖下有一个IIS问题 要设置“maxAllowedContentLength”,我必须编辑“web”。配置文件。 这是不好的,因为如果我在Azure Portal应用程序设置上做一些更改,那么我的本地版本的web应用程序将无法运行。“配置”与自动生成的文件冲突。 是否可以以其他方

  • 我有一个在Oracle Weblogic Server 11g上运行的Web应用程序。它使用应用服务器中定义的数据源连接到Oracle数据库(也是11g),其类为 神谕jdbc。xa。客户OracleXADataSource > 如果由于某种原因,数据库不存在,然后返回,则应用程序运行正常(在尝试访问数据库时出现异常,但这很好,然后可以在数据库返回时再次获得一些新连接) 但是,如果数据库在webl