spring boot配置多個請求服務(wù)代理的完整步驟
springboot 配置服務(wù)代理
有時候,我們可能有下邊這樣的需求:
即,針對于分布式服務(wù),我們會有多種業(yè)務(wù)接口服務(wù),但是服務(wù)器上可能只要求開放一個服務(wù)的端口,比如上圖的restA項目端口是對外開放的,但是restB項目端口并未對外開放,這樣帶來的問題就是,用戶無法直接請求restB項目。
那就想到了可以通過訪問restA ,請求路徑符合一定規(guī)范的時候,比如http://ip:port/test ,當(dāng)請求中以rest 開頭時,可以再轉(zhuǎn)發(fā)請求到restB 項目中即可。
當(dāng)然代理轉(zhuǎn)發(fā) ,有很多的解決辦法,nginx 、zuul 等都可以實現(xiàn),但是nginx 雖然簡單,但是總要多裝一個服務(wù);zuul 配置較為麻煩。
經(jīng)過百度后,發(fā)現(xiàn)了一個特別簡單的配置,即這里要說的東西,ServletRegistrationBean的注入,相當(dāng)于是引入servlet ,沒有具體看過 。
下面寫一下配置步驟:
1、項目結(jié)構(gòu)及介紹
下面是我的項目結(jié)構(gòu),以下選中藍(lán)色的項目為我們要配置的項目,其他的項目先忽略,是我們基于dubbo 和zookeeper 配置的時候用的。
項目已放到GitHub 上,下載項目GitHub地址
關(guān)于這個項目的介紹是下邊這樣的,再配張圖來介紹下:
上圖中關(guān)于suiteoneservice 、suitetwoservice、masterservice 項目是我們的服務(wù)接口發(fā)布方項目。在這里我只是畫出來,跟我們要配置的內(nèi)容是無關(guān)的。
suiteone 、suitetwo 項目端口沒有外放,用戶不能直接訪問,而master項目是可以直接訪問的,所以用戶是通過訪問master 項目,再由master 項目對請求代理轉(zhuǎn)發(fā)到這兩個項目中。
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必須要設(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")); //這個setName必須要設(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 項目的主配置文件,即application.properties 文件中,加入以下內(nèi)容:
#請求testone時代理轉(zhuǎn)發(fā)到30001項目中 proxy.test.servlet_url_one=/testone/* proxy.test.target_url_one=http://localhost:30001 #請求testtwo時代理轉(zhuǎn)發(fā)到30002項目中 proxy.test.servlet_url_two=/testtwo/* proxy.test.target_url_two=http://localhost:30002
上邊的配置簡單介紹一下,對于testone/* 這樣的寫法,意思就是當(dāng)你的請求路徑以testone 開頭,比如http://localhost:30000/testone/test/get1 這樣的路徑,它請求的真實路徑是http://localhost:30001/test/get1 。主要就是將testone 替換成對應(yīng)的被代理路徑而已,* 的意思就是實際請求項目中接口的路徑!??!
30001 端口即suiteone項目,30002 端口即suitetwo 項目,下載項目之后,分別啟動master 、suiteone 、suitetwo 項目的啟動類,啟動完成后,訪問http://localhost:30000/testone/test/get1 ,即會返回suiteone 項目test/get1 接口的內(nèi)容。
這種配置對get 、post 請求都有效。
以上即是完整的配置內(nèi)容。
如果有不懂的,可以下載下來項目看一下。GitHub地址
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
- 創(chuàng)建動態(tài)代理對象bean,并動態(tài)注入到spring容器中的操作
- 詳解Spring的兩種代理方式:JDK動態(tài)代理和CGLIB動態(tài)代理
- Spring AOP注解失效的坑及JDK動態(tài)代理
- Spring AOP攔截-三種方式實現(xiàn)自動代理詳解
- Spring學(xué)習(xí)之動態(tài)代理(JDK動態(tài)代理和CGLIB動態(tài)代理)
- Spring中的兩種代理JDK和CGLIB的區(qū)別淺談
- spring基礎(chǔ)概念A(yù)OP與動態(tài)代理理解
- 解析Spring中的靜態(tài)代理和動態(tài)代理
相關(guān)文章
如何讀取properties或yml文件數(shù)據(jù)并匹配
這篇文章主要介紹了如何讀取properties或yml文件數(shù)據(jù)并匹配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12關(guān)于Lambda表達(dá)式的方法引用和構(gòu)造器引用簡的單示例
這篇文章主要介紹了關(guān)于Lambda表達(dá)式的方法引用和構(gòu)造器引用簡的單示例,方法引用與構(gòu)造器引用可以使?Lambda?表達(dá)式的代碼塊更加簡潔<BR>,需要的朋友可以參考下2023-04-04Spring Cloud多個微服務(wù)之間調(diào)用代碼實例
這篇文章主要介紹了Spring Cloud多個微服務(wù)之間調(diào)用代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Java開發(fā)環(huán)境配置教程(win7 64bit)
這篇文章主要為大家詳細(xì)介紹了win7 64bit下Java開發(fā)環(huán)境的配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08