微服务和网关的关系

在使用微服务架构开发中,我们通常会引入zuul网关管理用户请求(转发调用微服务,阻断不合理请求),所以微服务和网关的关系是网关调用微服务。调用过程中404是很头痛的一种错误,各种调试都找不到问题,此处我将详细记录一个处理zuul网关调用微服务404错误的解决流程。

解决思路

1. 检查Eureka注册中心是否都已经注册了网关和我们需要的微服务

如图:

我打开注册中心,需要的网关和微服务已经在注册中心了,如果有,咋们就可以进入第二步了

gateway 被微服务调用 微服务调用失败_spring

如果网关和微服务的任何一个没有在注册中心,我们的请求肯定是不能到达的。所以,网关和微服务都还没有被注册到注册中心,我们要做的就是配置配置文件,重启注册中心,网关,微服务。

  • 网关的配置文件
server:
  port: 10010 #网关的端口号
spring:
  application:
    name: salesys-gateway #网关在注册中心的唯一名称
eureka:
  client:
    registry-fetch-interval-seconds: 5
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #注册中心的地址
zuul:
  prefix: /api #微服务的前缀
  routes: #需要调用的微服务的名称以及路径信息
    item-service: /item/**
    search-service: /search/**
    user-service: /user/**
    auth-service: /auth/**
    ignored-services:
      - upload-service
  • 微服务的配置文件
server:
  port: 8083 # 微服务端口
spring:
  application:
    name: search-service #微服务的名称(名称很重要,网关是通关微服务的名称进行请求的,此处的名称必须和网关中配置的微服务名称一致,否则无法请求)
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.137.101:9300 # 这里我的elasticsearch配置,不用就直接删除
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka #注册中心的地址,将微服务发布到注册中心
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10

当我们的注册中心可以看到我们的微服务和网关时,进行第二步。

2. 微服务本地测试,是否畅通

直接在本地通过端口调用微服务,查看微服务是否正常,如我的微服务的请求路径应该是:127.0.0.1:8083/search/page?key=***

通过postman的返回信息我们可以看到,我们的微服务是可以直接被请求的,状态码并不是404,另外控制台也打印了相关的日志信息,很ok,这个错误我们一会儿再解决,至少微服务是没有问题的,可以被请求的,接下来我们进入第三步(注意,如果本地测试微服务的连接都报404,说明写的微服务是由问题的,或者请求路径有问题,请求路径是:localhost+微服务端口+映射的方法名路径)。

gateway 被微服务调用 微服务调用失败_微服务_02


gateway 被微服务调用 微服务调用失败_java_03


3. 通过zuul网关发送测试请求

要通过zuul网关调用微服务,我们就一定要把路径搞明白,到底是怎么调用的(我就是路径没有搞明白才一直报404),在没有代理的前提下 请求的路径是这样的:

服务器地址(本地的话就是localhost或者127.0.0.1)+ zuul网关的端口号 + 前缀 + 路径 + 微服务控制器中映射的方法名

如我的:

127.0.0.1:10010/api/search/search/page?key=***

注意:这个路径不能多也不能少,要一一对应,

gateway 被微服务调用 微服务调用失败_微服务_04


gateway 被微服务调用 微服务调用失败_java-ee_05


gateway 被微服务调用 微服务调用失败_java_06


通过zuul网关调用微服务不再是404了,我们的404BUG基本解决了,下一步就是nginx代理请求和发布

gateway 被微服务调用 微服务调用失败_java-ee_07

4. 前端经过zuul网关异步请求数据

<script type="text/javascript">
    var vm = new Vue({
        el: "#searchApp",
        data: {
            search:{
                key: ""
            },
            goodsList: []
        },
        created () {
            if (!location.search){
                return;
            }
            this.search.key = location.search.substring(1);
            console.log(this.search);
        },
        mounted () {
            axios
                .post('http://api.salesys.com/api/search/search/page',this.search)
                .then(response => (console.log(response)))
                .catch(function (error) { // 请求失败处理
                    console.log(error);
                });
        },

        components:{
            lyTop: () => import("./js/pages/top.js")
        }
    });
</script>

成功通过zuul网关请求到数据

gateway 被微服务调用 微服务调用失败_java-ee_08