這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰html
現現在的項目開發基本都是微服務方式,致使一個系統中會有不少的服務,每一個模塊都對應着不一樣的端口,爲了方便訪問,一般會讓某個服務綁定一個域名,好比商品服務:product.xxx.com;訂單服務:order.xxx.com,此時能夠使用Nginx來搭建一個域名訪問環境,基於先後端分離開發的項目常常會遇到跨域問題,使用Nginx也能輕鬆解決。nginx
首先拉取nginx的鏡像:web
docker pull nginx:1.10
複製代碼
而後隨意地啓動一個nginx實例:spring
docker run -p 80:80 --name nginx -d nginx:1.10
複製代碼
啓動該nginx實例的目的是將nginx中的配置文件複製出來:docker
docker container cp nginx:/etc/nginx .
複製代碼
這樣當前目錄下就會產生一個nginx文件夾,將其先重命名爲conf,而後再建立一個nginx文件夾,並將conf文件夾移動進去:後端
mv nginx conf
mkdir nginx
mv conf/ nginx/
複製代碼
而後正式啓動一個新的nginx實例:跨域
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
複製代碼
將剛纔準備好的nginx文件夾與nginx容器內的文件夾做一個一一映射。springboot
建立一個SpringBoot應用,並引入依賴:markdown
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
複製代碼
將其註冊到Nacos中:app
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.66.10:8848
application:
name: SpringBootDemo
複製代碼
啓動項目,訪問 http://localhost:8080/ : 如今的需求是經過訪問域名 myspringboot.com
也可以訪問到該頁面,因此來修改Windows中的hosts文件:
192.168.66.10 myspringboot.com
複製代碼
這段內容的做用是當訪問 myspringboot.com
時,實際訪問的是192.168.66.10,即咱們的Linux系統。
此時來到Linux,配置一下Nginx,在conf.d目錄下建立的配置文件都會被Nginx自動掃描到:
cd /mydata/nginx/conf/conf.d
touch mysb.conf
複製代碼
添加配置:
server {
listen 80;
server_name myspringboot.com;
location / {
proxy_pass http://192.168.0.105:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
複製代碼
這段配置表示監聽myspringboot.com:80而來的請求,如果訪問 /
則會被其中的location /處理,將該請求轉發至http://192.168.0.105:8080/:
通常狀況下,Nginx都會配合網關一塊兒使用,這是由於微服務通常會作集羣部署,此時請求就沒法準確地決定具體該轉向哪一個服務,而是應該由其自動負載到每一個服務上,因此,應該加入網關來實現這一功能。
建立一個SpringBoot應用,並引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
複製代碼
一樣須要將網關注冊到Nacos中:
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.66.10:8848
application:
name: MyGateway
server:
port: 9000
複製代碼
此時修改Nginx的配置,首先在http塊添加對網關的配置:
upstream my_gateway{
server 192.168.0.105:9000 # 配置網關的地址
}
複製代碼
而後修改server塊:
server {
listen 80;
server_name myspringboot.com;
location / {
proxy_pass http://my_gateway; # 轉發至網關
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
複製代碼
如今訪問 myspringboot.com/ ,請求會被交給Nginx,Nginx又會將其交給網關處理,咱們再來配置一下網關,使其將請求轉發給指定的服務處理:
spring:
cloud:
gateway:
routes:
- id: springbootdemo_route
uri: lb://SpringBootDemo
predicates:
- Path=/**
複製代碼
這段配置會監聽全部的請求,由於Path的值爲 /**
,當請求來到網關時,直接將其轉交給MySpringBoot服務, lb://
表示負載均衡,效果以下: 如今的請求就是通過Nginx再通過網關最後到達的具體服務。