内网穿透与反向代理,浅谈前后台分离

栏目: Java · 发布时间: 6年前

内容简介:自去年毕业来到杭州,想想也该有大半年了,本身是软件工程的科班出身,在校时理论掌握的还可以,但应用到实践当中时,有些还是不大理解,于是,不停地向带我的人请教,毕竟,三人行,必有我师焉。经过一段时间理论加实践,多少也掌握了其中的门路。在从业的过程中,也和其他程序员交流过,他们很多人都没有前后端(服务器和客户端)分离,而是前后端一起做掉。如果前后端不分离,此时的服务器端主要是指java代码,客户端主要是指jsp,通过spring MVC 将数据封装到ResponseBody中,再返回给jSP。JSP拿到数据,渲染

自去年毕业来到杭州,想想也该有大半年了,本身是软件工程的科班出身,在校时理论掌握的还可以,但应用到实践当中时,有些还是不大理解,于是,不停地向带我的人请教,毕竟,三人行,必有我师焉。经过一段时间理论加实践,多少也掌握了其中的门路。

前端和后端(服务器端、客户端)分离

  • 前后端不分离

在从业的过程中,也和其他 程序员 交流过,他们很多人都没有前后端(服务器和客户端)分离,而是前后端一起做掉。如果前后端不分离,此时的服务器端主要是指 java 代码,客户端主要是指jsp,通过spring MVC 将数据封装到ResponseBody中,再返回给jSP。JSP拿到数据,渲染页面。这里 不需要考虑端口号的问题。比如:

/**
     * Created By zby on 16:03 2019/3/5
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public Result fun() {

        return null;
    }
  • 前后端分离

当然,前后端分离时,后端还是以java代码为主,前端就变化多端了。

. 后端

java通过springMVC的Rest模式的 Controller层,接收前端页面传来的接口和参数,经过一系列的入参校验,调用事务层(也就是 service层)这里主要是hibernate(mybatis)的事务层,实现数据库的事务操作。再调用*dao(data Access object)层实现事务的原子性操作,即将顺时态的java对象转化为持久状态的数据库对象。层层深入,层层返回,将通过Result回传给前端。

. 前端

前端主要用h5进行页面布局,CSS3实现页面的美化。JavaScript配合jQuery调用后端的接口,传递参数和获取后端回传的数据。通过vue.js实现回传的数据的双向绑定。还可能涉及到其他框架,比如页面布局的bootstrap,数据table方式展示的jqgrid等等。

前后端分离,如何实现数据交互

我们将写好的java代码部署在服务器上,比如Tomcat、Jboss主流服务器。这里以Tomcat来讲解,我们将项目部署在Tomcat的上,具体如何部署Tomcat,可以参考这篇教程, Tomcat8权威指南 。我们现在一般在maven中以插件的方式配置Tomcat,便于本地测试,路径为根路径,如以下代码:

<build>
        <defaultGoal>install</defaultGoal>
        //maven生成的war生成的名字
        <finalName>cloudCodeSaleManager</finalName> 

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>58081</port>
                    <path>/</path>
                    <uriEncoding>UTF-8</uriEncoding>
                    <finalName>zfounder-custmom-member-portal</finalName>
                    <server>tomcat7</server>
                </configuration>
            </plugin>
        </plugins>
    </build>

在真实的项目中,一般会有测试服和正式服,测试服我们用户的测试数据库和测试服务器,正式服我们用到的是正式数据库和正式服务器,有人说,这样输简直是废话。但是,我们测试数据库和正式数据库是不一样的,因而,如果都写在同一个配置文件中,修改势必麻烦。因而,我们可以在打包时,会有测试包和正式包,这里就涉及到maven的profile的配置文件(是在pom中配置):

<profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>../../platform-dev.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>prd</id>
            <build>
                <filters>
                    <filter>../../platform-prd.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

我们Tomcat启动后,访问后端接口(url)的格式如下:

scheme://host.domain:port/path/filename

scheme - 定义因特网服务的类型。最常见的类型是 http

host - 定义域主机(http 的默认主机是 www)

domain - 定义因特网域名,比如 runoob.com

:port - 定义主机上的端口号(http 的默认端口号是 80)

path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。

filename - 定义文档/资源的名称

当然,如果没有域名的话,我们想要访问本地,也可以是这样的:

http://ip :port/path/filename

这里的ip涉及到内网和本机地址。

内网也就是局域网,一般以192.168. . 打头。本机地址是:127.0.0.1。

它们两个有什么区别呢?

假设访问我的server_path如下所示

constant = {
    dev: {
        **server_path: "http://127.0.0.1:58081/",**
        imgPre: "http://web.cs.wentonghuishou.com/",
        commonParams: {}
    },
}
_env = "dev";
window.constant = constant[_env];

我做后端Java的,开启了Tomcat。我的同事是做前端的,他用上面的server_path访问我,也就是说,想通过我本机ip请求我的接口,是没办法访问我后端的接口。因为他,这是我本机的ip,只有我个人才能访问。相反,我自己是可以访问的。如图所示:

内网穿透与反向代理,浅谈前后台分离

如果他把server_path改成了 server_path: "http://192.168.40.177:58081/", ,那么,他想通过局域网访问我的接口,这是可以访问我的。因为,我们同处在这个局域网下的。如图所示:

内网穿透与反向代理,浅谈前后台分离

外网如何访问,也就是,内网穿透

假如,我和我的同事,不在同一局域网,但他,想访问我后端的接口,这时该怎么办?应该是需要摆脱网域限制,能够访问我的内网,也就是访问的本机。这时,就出现了,内网穿透的软件,比如ngrok,小米求等。

小米球可以实现内网穿透,他是怎么实现内网穿透,主要是通过域名的反向代理,这也就是所谓的反向代理。其实,反向代理没那么高大上,不要被它吓到了。当然,这里需要输入端口号,这里前端的hbuilder的端口号,也就是8020端口号。为什么需要端口号,端口号能够确定本机唯一的进程。比如 mysql 的3306端口号,Tomcat的80端口号等。为什么是前端的端口号,因为我们首先访问的是页面,页面通过server_path来访问后端接口,这里我们不需要考虑这方面的。

小米求的配置如下,这里是免费版的:

内网穿透与反向代理,浅谈前后台分离

内网穿透与反向代理,浅谈前后台分离

当我们,在浏览器的地址栏输入 http://zby.ngrok.xiaomiqiu.cn... ,你会发现,它能访问到我的前端页面,并调用了我后端的接口,这就实现了ip的反向代理。域名解析也是同样的道理,利用了ip的反向代理。如图所示:

内网穿透与反向代理,浅谈前后台分离


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Parsing Techniques

Parsing Techniques

Dick Grune、Ceriel J.H. Jacobs / Springer / 2010-2-12 / USD 109.00

This second edition of Grune and Jacobs' brilliant work presents new developments and discoveries that have been made in the field. Parsing, also referred to as syntax analysis, has been and continues......一起来看看 《Parsing Techniques》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具