• 微服务API通过ip可访问,域名不可访问问题分析


    摘要

    经常会有同学遇到api通过ip可以访问,但是通过域名却不可以访问。本篇文章总结了造成这种情况可能的原因。
    因为与具体技术的选型、规则配置有关,所以没有深入讨论,只是列出可能性,仅供参考。

    分析

    问题

    通过域名访问不到的请求表现的现象有

    1. 接口返回404
    2. 一个错误页面
    3. 提示method type不支持
    4. 提示接口缺乏必要的参数

    这些都是接口访问不到,2是配置了错误页面;3,4则发出的POST/PUT 请求,但是请求了GET方法

    概览

    通过域名访问,在整个后端的访问路径如下图,大致分四个部分,浏览器、负载均衡层、网关层、服务层。
    域名解析这里忽略不讨论了。

    出现ip可以访问,但是域名不可访问,4层都有可能导致这个问题。

    微服务层

    1. 配置了接口访问权限

    在微服务口中,单独限制了这个接口的访问权限,导致该接口没有注册到注册中心,这个可以通过查看代码,或者查看注册中心注册列表找出问题。

    1. 该接口的api prefix不符合该服务的规则

    网关在根据api uri路由到某个具体服务时,为了提高检索效率,有些定义了路由规则,不同服务以不同的prefix来区分。这样服务里面的某个api prefix不符合该服务定义的前缀规则,则匹配不上
    (当然一般的网关路由会做降级,前缀不符,就降级为遍历)

    这个可以通过访问网关的ip/uri来找出问题。

    网关层

    1. 路由算法有问题
    2. 没有订阅微服务
      不是所有的微服务都需要对外暴露,对于中台类/或者其他一些内部服务是不对外暴露的。这些api是不可以直接通过域名访问的。

    这些都可以通过访问网关的依赖,或者网关ip/uri来找出问题。

    Nginx

    Nginx里可以配置各种redirect规则,过滤规则。当通过网关ip可以访问api时,那多半是nginx的问题。可以检查nginx的配置问题,来定位问题。

    浏览器重定向,将POST/PUT请求改写成了GET请求

    比如网站从http升级到https,某个uri redirect了。当我们在浏览器中键入以www为开头的网址时,网页并不会自动跳转为HTTPS网站,因为浏览器默认打开HTTP网站,基于此,我们就需要对HTTP的访问在服务器端做301、302或307重定向,使之跳转到HTTPS网站。当使用了301,302后,浏览器会使用GET方式访问在Location中规定的URI,而无视原先请求的方法。

    关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路
    在这里插入图片描述

    参考

    https://zhuanlan.zhihu.com/p/27480845

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    https://segmentfault.com/a/1190000016828036

  • 相关阅读:
    设计模式学习--------8.抽象工厂模式学习
    设计模式学习--------7.工厂方法模式学习
    算法学习---对象类型的数组二分查找实现
    算法学习---基本数据类型的数组二分查找实现
    设计模式学习--------6.单例模式学习
    设计模式学习--------5.适配器模式学习
    tomcat 部署指南
    《Tomcat权威指南》读书笔记
    字典排序
    zabbix agentd错误日志解决办法
  • 原文地址:https://www.cnblogs.com/stoneFang/p/11414800.html
Copyright © 2020-2023  润新知