如何通过zuul代理从一个微服务访问另一个微服务

Posted

技术标签:

【中文标题】如何通过zuul代理从一个微服务访问另一个微服务【英文标题】:How to access from one micro service to another via zuul proxy 【发布时间】:2018-03-23 05:19:38 【问题描述】:

我正在使用 Spring Boot 开发微服务项目。这里,UI 页面在单独的微服务中,zuul 代理在单独的微服务中。我想通过 zuul 微服务访问 UI 页面。我在下面添加了我的项目结构。

UiService Application.properties:

server.port=8090
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
spring.application.name=ui
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.instance.preferIpAddress=true
eureka.instance.leaseRenewalIntervalInSeconds=5

zuulService application.yml:

server:
port: 8080
eureka:
 instance:
  leaseRenewalIntervalInSeconds: 10
  statusPageUrlPath: /info
  healthCheckUrlPath: /health    

logging:
 level:
  ROOT: INFO
  org.springframework.web: DEBUG
zuul:
  routes:
    ui: 
      url: http://localhost:8090
ribbon:
  eager-load:
    enabled: false

我的 docker 撰写文件:

version: '3'
services:
  eureka:
    build: eurekaService
    ports:
      - "8761:8761"
  zuul:
    build: zuulService
    links:
     - eureka
    ports:
      - "8080:8080"
  turbine:
     build: turbineService
    links:
     - eureka
    ports:
     - "8989:8989"
  ui: 
   build: uiService
   links:
     - eureka
    ports:
     - "8090:8090"

uiService结构:

我的尤里卡服务页面:

在 docker(docker-compose up -d) 中运行此项目后,当我尝试访问登录屏幕(在 uiService 中可用)时出现以下异常。如何解决?

UIService 主方法:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class UIApplication 

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

uiService pom.xml:

 <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.scm</groupId>
            <artifactId>demo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <artifactId>uiService</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>

           <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
           </dependency>

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-rest</artifactId>
           </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

             <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
             </dependency>
             <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>

            </dependencies>
        </project>

【问题讨论】:

【参考方案1】:

localhost:8090/login 是对 UI 应用的直接请求,不涉及 Zuul。

如果它没有加载/显示页面,则可能是启动应用程序时出错或/login不存在。

您介意分享日志吗?

【讨论】:

一旦我在显示登录页面时涉及 Zuul 代理,我得到了与结果相同的页面(已附加 SS)。 url : localhost:8080/ui/login .....我在将图像部署到 docker (docker-compose up -d) 时没有收到任何错误。 您介意分享一下:pom.xml,您使用的是哪个 Spring Boot 版本以及映射到 GET /login 的 UIController? 我用的是1.5.2版本,getmapping在uiController@RequestMapping(value = "/login", method = RequestMethod.GET) public String getLogin() return "login"; 上面,我已经添加了我的uiService pom.xml

以上是关于如何通过zuul代理从一个微服务访问另一个微服务的主要内容,如果未能解决你的问题,请参考以下文章

如何通过zuul或任何api网关调用安全的微服务端点

SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)

SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)

微服务通过Zuul消耗Kafka事件

SpringCloud - Zuul路由网关

Spring Boot 微服务 com.netflix.zuul.exception.ZuulException:转发错误