Glang+Vue实现RESTful API+前后端分离,Nginx反向代理解决跨域问题(一)
概念引入
前后端分离架构如下图,后端只负责动态提供数据,而前端存放静态文件,使得后端服务器不必每次都返回一整个HTML页面,节省了时间开销和资源开销,提高了整个网站系统的性能。
RESTful架构,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
REST(Representational State Transfer)翻译为"表现层状态转化",所谓表现层,正如下图中的前端静态文件服务器,在此前端服务器上部署nginx服务,搭建起一个网站前端,使得用户可以通过访问前端服务器网址来浏览前端页面。
而所谓状态转化,即当用户访问一个网站时,意味着客户端和服务器有一个互动过程。在这个过程中,势必涉及到数据和状态的变化。在前后端分离架构中,前端只提供静态页面,而数据则由后端提供,使得前端呈现出来的数据得以动态变化。
实验准备
实验名称:基于Golang+Vue+Nginx搭建图书管理系统
实验环境:两台Centos7虚拟机
1、后端:node1,ip:192.168.141.53
2、前端:node2,ip:192.168.141.69
实验步骤
1、node1安装go,配置好环境变量。
[root@node1 ~]# wget https://dl.google.com/go/go1.14.linux-amd64.tar.gz
[root@node1 ~]# tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz
[root@node1 ~]# rm -f go1.14.linux-amd64.tar.gz
[root@node1 ~]# mkdir -p /home/gopath
[root@node1 ~]# vim /etc/profile
#文档末尾追加下列四行
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/home/gopath
[root@node1 ~]# source /etc/profile
[root@node1 ~]# go version
go version go1.14 linux/amd64
[root@node1 ~]#
2、准备工作
1)node2安装nginx,放行80端口,关闭selinux,重启nginx服务。
[root@node2 ~]# yum install epel-release -y
[root@node2 ~]# yum install nginx -y
[root@node2 ~]# firewall-cmd --add-port=80/tcp --permanent
success
[root@node2 ~]# firewall-cmd --reload
[root@node2 ~]# vim /etc/selinux/config
[root@node2 ~]# cat /etc/selinux/config | grep SELINUX
SELINUX=disabled
[root@node2 ~]# setenforce 0
success
[root@node2 ~]# systemctl restart nginx
[root@node2 ~]# nginx -s reload
[root@node2 ~]#
现在打开浏览器输入node2的ip即可浏览到nginx的默认index页面。
2)node1放行9090端口,关闭selinux。
[root@node1 ~]# firewall-cmd --add-port=9090/tcp --permanent
success
[root@node1 ~]# firewall-cmd --reload
[root@node1 ~]# vim /etc/selinux/config
[root@node1 ~]# cat /etc/selinux/config | grep SELINUX
SELINUX=disabled
[root@node1 ~]# setenforce 0
success
[root@node1 ~]#
3、node1运行后端go文件
[root@node1 ~]# cd /home/gopath/
[root@node1 gopath]# go get github.com/gorilla/mux
[root@node1 gopath]# vim rest.go
[root@node1 gopath]# cat rest.go
package main
import (
"encoding/json"
"github.com/gorilla/mux"
"log"
"math/rand"
"net/http"
"strconv"
)
//Book Struct
type Book struct{
ID string `json:"id"`
Isbn string `json:"isbn"`
Title string `json:"title"`
Author *Author `json:"author"`
}
//Author Struct
type Author struct {
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
}
//Init books var as a slice(切片) Book struct
var books []Book
//Get all Books
func getBooks(w http.ResponseWriter,r *http.Request){
w.Header().Set("Content-Type","application/json")
json.NewEncoder(w).Encode(books)
}
//Get single Books
func getBook(w http.ResponseWriter,r *http.Request){
w.Header().Set("Content-Type","application/json")
params:=mux.Vars(r) //参数
for _,item:=range books{
if item.ID==params["id"]{
json.NewEncoder(w).Encode(item)
return