spring boot配置多個(gè)請(qǐng)求服務(wù)代理的完整步驟
springboot 配置服務(wù)代理
有時(shí)候,我們可能有下邊這樣的需求:

即,針對(duì)于分布式服務(wù),我們會(huì)有多種業(yè)務(wù)接口服務(wù),但是服務(wù)器上可能只要求開(kāi)放一個(gè)服務(wù)的端口,比如上圖的restA項(xiàng)目端口是對(duì)外開(kāi)放的,但是restB項(xiàng)目端口并未對(duì)外開(kāi)放,這樣帶來(lái)的問(wèn)題就是,用戶無(wú)法直接請(qǐng)求restB項(xiàng)目。
那就想到了可以通過(guò)訪問(wèn)restA ,請(qǐng)求路徑符合一定規(guī)范的時(shí)候,比如http://ip:port/test ,當(dāng)請(qǐng)求中以rest 開(kāi)頭時(shí),可以再轉(zhuǎn)發(fā)請(qǐng)求到restB 項(xiàng)目中即可。
當(dāng)然代理轉(zhuǎn)發(fā) ,有很多的解決辦法,nginx 、zuul 等都可以實(shí)現(xiàn),但是nginx 雖然簡(jiǎn)單,但是總要多裝一個(gè)服務(wù);zuul 配置較為麻煩。
經(jīng)過(guò)百度后,發(fā)現(xiàn)了一個(gè)特別簡(jiǎn)單的配置,即這里要說(shuō)的東西,ServletRegistrationBean的注入,相當(dāng)于是引入servlet ,沒(méi)有具體看過(guò) 。
下面寫一下配置步驟:
1、項(xiàng)目結(jié)構(gòu)及介紹
下面是我的項(xiàng)目結(jié)構(gòu),以下選中藍(lán)色的項(xiàng)目為我們要配置的項(xiàng)目,其他的項(xiàng)目先忽略,是我們基于dubbo 和zookeeper 配置的時(shí)候用的。
項(xiàng)目已放到GitHub 上,下載項(xiàng)目GitHub地址
關(guān)于這個(gè)項(xiàng)目的介紹是下邊這樣的,再配張圖來(lái)介紹下:

上圖中關(guān)于suiteoneservice 、suitetwoservice、masterservice 項(xiàng)目是我們的服務(wù)接口發(fā)布方項(xiàng)目。在這里我只是畫(huà)出來(lái),跟我們要配置的內(nèi)容是無(wú)關(guān)的。
suiteone 、suitetwo 項(xiàng)目端口沒(méi)有外放,用戶不能直接訪問(wèn),而master項(xiàng)目是可以直接訪問(wèn)的,所以用戶是通過(guò)訪問(wèn)master 項(xiàng)目,再由master 項(xiàng)目對(duì)請(qǐng)求代理轉(zhuǎn)發(fā)到這兩個(gè)項(xiàng)目中。
2、具體配置步驟
主要的配置很少,都在master 項(xiàng)目中。
(1)引入依賴:
<!--ProxyFilter的引入依賴--> <dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.7</version> </dependency>
(2)、配置一個(gè)配置類:
該類可以參照下載下來(lái)的,master 項(xiàng)目中的配置。
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"));
//這個(gè)setName必須要設(shè)置,并且多個(gè)的時(shí)候,名字需要不一樣
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"));
//這個(gè)setName必須要設(shè)置,并且多個(gè)的時(shí)候,名字需要不一樣
servletRegistrationBean.setName("suittwo");
servletRegistrationBean.addInitParameter("targetUri", propertyResolver.getProperty("target_url_two"));
servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, propertyResolver.getProperty("logging_enabled", "false"));
return servletRegistrationBean;
}
private RelaxedPropertyResolver propertyResolver;
@Override
public void setEnvironment(Environment environment) {
this.propertyResolver = new RelaxedPropertyResolver(environment, "proxy.test.");
}
}
(3)、配置代理地址:
到master 項(xiàng)目的主配置文件,即application.properties 文件中,加入以下內(nèi)容:
#請(qǐng)求testone時(shí)代理轉(zhuǎn)發(fā)到30001項(xiàng)目中 proxy.test.servlet_url_one=/testone/* proxy.test.target_url_one=http://localhost:30001 #請(qǐng)求testtwo時(shí)代理轉(zhuǎn)發(fā)到30002項(xiàng)目中 proxy.test.servlet_url_two=/testtwo/* proxy.test.target_url_two=http://localhost:30002
上邊的配置簡(jiǎn)單介紹一下,對(duì)于testone/* 這樣的寫法,意思就是當(dāng)你的請(qǐng)求路徑以testone 開(kāi)頭,比如http://localhost:30000/testone/test/get1 這樣的路徑,它請(qǐng)求的真實(shí)路徑是http://localhost:30001/test/get1 。主要就是將testone 替換成對(duì)應(yīng)的被代理路徑而已,* 的意思就是實(shí)際請(qǐng)求項(xiàng)目中接口的路徑?。?!
30001 端口即suiteone項(xiàng)目,30002 端口即suitetwo 項(xiàng)目,下載項(xiàng)目之后,分別啟動(dòng)master 、suiteone 、suitetwo 項(xiàng)目的啟動(dòng)類,啟動(dòng)完成后,訪問(wèn)http://localhost:30000/testone/test/get1 ,即會(huì)返回suiteone 項(xiàng)目test/get1 接口的內(nèi)容。
這種配置對(duì)get 、post 請(qǐng)求都有效。
以上即是完整的配置內(nèi)容。
如果有不懂的,可以下載下來(lái)項(xiàng)目看一下。GitHub地址
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- 創(chuàng)建動(dòng)態(tài)代理對(duì)象bean,并動(dòng)態(tài)注入到spring容器中的操作
- 詳解Spring的兩種代理方式:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理
- Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理
- Spring AOP攔截-三種方式實(shí)現(xiàn)自動(dòng)代理詳解
- Spring學(xué)習(xí)之動(dòng)態(tài)代理(JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理)
- Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
- spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解
- 解析Spring中的靜態(tài)代理和動(dòng)態(tài)代理
相關(guān)文章
java中的內(nèi)部類內(nèi)部接口用法說(shuō)明
這篇文章主要介紹了java中的內(nèi)部類內(nèi)部接口用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法
Java中CPU占用過(guò)高是一個(gè)常見(jiàn)的問(wèn)題,可能是由于線程過(guò)多、死循環(huán)、長(zhǎng)時(shí)間的阻塞、死鎖、GC頻繁等原因?qū)е碌?這篇文章主要介紹了java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法,需要的朋友可以參考下2025-03-03
java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
Java 并發(fā)編程學(xué)習(xí)筆記之核心理論基礎(chǔ)
編寫優(yōu)質(zhì)的并發(fā)代碼是一件難度極高的事情。Java語(yǔ)言從第一版本開(kāi)始內(nèi)置了對(duì)多線程的支持,這一點(diǎn)在當(dāng)年是非常了不起的,但是當(dāng)我們對(duì)并發(fā)編程有了更深刻的認(rèn)識(shí)和更多的實(shí)踐后,實(shí)現(xiàn)并發(fā)編程就有了更多的方案和更好的選擇。本文是對(duì)并發(fā)編程的核心理論做了下小結(jié)2016-05-05
Java隨機(jī)生成驗(yàn)證碼的實(shí)現(xiàn)示例
這篇文章主要介紹Java隨機(jī)生成驗(yàn)證碼的實(shí)現(xiàn)方法,文中有相關(guān)的實(shí)現(xiàn)代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08
springboot使用jasypt對(duì)配置文件加密加密數(shù)據(jù)庫(kù)連接的操作代碼
這篇文章主要介紹了springboot使用jasypt對(duì)配置文件加密加密數(shù)據(jù)庫(kù)連接的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
解決idea爆紅 cant resolve symbol String的問(wèn)題解析
連著出差幾個(gè)禮拜沒(méi)有使用idea開(kāi)發(fā)工具,突然一天打開(kāi)電腦發(fā)現(xiàn)idea里的代碼全部爆紅,懵逼不如所措,很多朋友建議我按住Alt+回車設(shè)置jdk就能解決,但是仍然報(bào)錯(cuò),經(jīng)過(guò)幾個(gè)小時(shí)的倒騰最終解決,遇到此問(wèn)題的朋友參考下本文吧2021-06-06

