1. 程式人生 > 程式設計 >spring boot配置多個請求服務代理的完整步驟

spring boot配置多個請求服務代理的完整步驟

springboot 配置服務代理

有時候,我們可能有下邊這樣的需求:

即,針對於分散式服務,我們會有多種業務介面服務,但是伺服器上可能只要求開放一個服務的埠,比如上圖的restA專案埠是對外開放的,但是restB專案埠並未對外開放,這樣帶來的問題就是,使用者無法直接請求restB專案。

那就想到了可以通過訪問restA,請求路徑符合一定規範的時候,比如http://ip:port/test,當請求中以rest 開頭時,可以再轉發請求到restB 專案中即可。

當然代理轉發 ,有很多的解決辦法,nginx 、zuul 等都可以實現,但是nginx 雖然簡單,但是總要多裝一個服務;zuul 配置較為麻煩。

經過百度後,發現了一個特別簡單的配置,即這裡要說的東西,ServletRegistrationBean的注入,相當於是引入servlet ,沒有具體看過 。

下面寫一下配置步驟:

1、專案結構及介紹

下面是我的專案結構,以下選中藍色的專案為我們要配置的專案,其他的專案先忽略,是我們基於dubbo 和zookeeper 配置的時候用的。

專案已放到GitHub 上,下載專案GitHub地址


關於這個專案的介紹是下邊這樣的,再配張圖來介紹下:


上圖中關於suiteoneservice 、suitetwoservice、masterservice 專案是我們的服務介面釋出方專案。在這裡我只是畫出來,跟我們要配置的內容是無關的。

suiteone 、suitetwo 專案埠沒有外放,使用者不能直接訪問,而master專案是可以直接訪問的,所以使用者是通過訪問master 專案,再由master 專案對請求代理轉發到這兩個專案中。

2、具體配置步驟

主要的配置很少,都在master 專案中。

(1)引入依賴:

 <!--ProxyFilter的引入依賴-->
 <dependency>
  <groupId>org.mitre.dsmiley.httpproxy</groupId>
  <artifactId>smiley-http-proxy-servlet</artifactId>
  <version>1.7</version>
 </dependency>

(2)、配置一個配置類:

該類可以參照下載下來的,master 專案中的配置。

package microservice.sc.config;

import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
/**
 * Created by lsf on 2018/7/31.
 */
@Configuration
public class ProxyServletConfiguration implements EnvironmentAware {
 @Bean
 public ServletRegistrationBean servletRegistrationBean(){
 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(),propertyResolver.getProperty("servlet_url_one"));
 //這個setName必須要設定,並且多個的時候,名字需要不一樣
 servletRegistrationBean.setName("suitone");
 servletRegistrationBean.addInitParameter("targetUri",propertyResolver.getProperty("target_url_one"));
 servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG,propertyResolver.getProperty("logging_enabled","false"));
 return servletRegistrationBean;
 }

 @Bean
 public ServletRegistrationBean servletRegistrationBean2(){
 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(),propertyResolver.getProperty("servlet_url_two"));
 //這個setName必須要設定,並且多個的時候,名字需要不一樣
 servletRegistrationBean.setName("suittwo");
 servletRegistrationBean.addInitParameter("targetUri",propertyResolver.getProperty("target_url_two"));
 servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG,"false"));
 return servletRegistrationBean;
 }

 private RelaxedPropertyResolver propertyResolver;

 @Override
 public void setEnvironment(Environment environment) {
 this.propertyResolver = new RelaxedPropertyResolver(environment,"proxy.test.");
 }
}

(3)、配置代理地址:

到master 專案的主配置檔案,即application.properties 檔案中,加入以下內容:

#請求testone時代理轉發到30001專案中
proxy.test.servlet_url_one=/testone/*
proxy.test.target_url_one=http://localhost:30001

#請求testtwo時代理轉發到30002專案中
proxy.test.servlet_url_two=/testtwo/*
proxy.test.target_url_two=http://localhost:30002

上邊的配置簡單介紹一下,對於testone/* 這樣的寫法,意思就是當你的請求路徑以testone 開頭,比如http://localhost:30000/testone/test/get1 這樣的路徑,它請求的真實路徑是http://localhost:30001/test/get1 。主要就是將testone 替換成對應的被代理路徑而已,* 的意思就是實際請求專案中介面的路徑!!!

30001 埠即suiteone專案,30002 埠即suitetwo 專案,下載專案之後,分別啟動master 、suiteone 、suitetwo 專案的啟動類,啟動完成後,訪問http://localhost:30000/testone/test/get1 ,即會返回suiteone 專案test/get1 介面的內容。

這種配置對get 、post 請求都有效。

以上即是完整的配置內容。

如果有不懂的,可以下載下來專案看一下。GitHub地址

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。