当前位置: 首页 > 工具软件 > Proxy-Filter > 使用案例 >

Spring boot使用ProxyFilter进行服务代理

胡俊弼
2023-12-01

Spring boot使用ProxyFilter进行服务代理


前段时间在公司内负责一个open api平台搭建的项目,当时采用了spring boot来进行搭建整个项目,但是对应的代理服务确实是想了一段时间才决定采用哪种方案的,因为需要开放出来的接口基本都不是需要token验证的,只需要对应的参数就可以正常访问,所以这些接口只能内部访问,在考虑使用哪种服务代理的时候个人考虑过以下几种:

  • Jersey代理

    jersey有个代理连接池的一个功能,只需要写好和对方对应的接口,本地不需要实现,就可以正常进行服务访问,但是server端提供多少个接口,open api平台就必须同样编写多少个对应的接口,十分麻烦。

  • HTTP-Proxy-Servlet

    基于Filter进行服务代理,只需要进行相关的配置之后,就能进行服务代理,同时核心文件只有2个,容易理解和进行改动,但是存在的问题是只能代理一个url,不能代理多个不同的url,jersey方便的是可以配置多个url进行代理,因此在这里,如果日后需要代理不同项目的接口的时候,就会有一定难度,需要对当前这个代理服务进行改造。

  • netflix-zuul

    这个是我在后来才找到的解决方案,基本需要将spring cloud这一套都配置,就我目前对zuul的了解中,似乎是可以满足目前的需求的,但是这个时候我已经将整个代理服务全部完成了,因此这种方案日后有需要再引进来。

在最后,我选取了第二种方案,就是基于Filter进行代理,引入进来后发现使用不错。


ProxyFilter

在使用这个解决方案的时候,maven仓库中有相应的依赖,使用相当方便,如下:

<dependency>
    <groupId>org.mitre.dsmiley.httpproxy</groupId>
    <artifactId>smiley-http-proxy-servlet</artifactId>
    <version>1.7</version>
</dependency>

这样使用到也不错,但实质上项目使用的时候,往往是需要进行一定程度的改造的,所以我更推荐的是直接将这个依赖中所有类引进来,方便自己改动。

因为使用的是spring boot项目,因此需要进行spring boot的相关配置,具体如下:

@Configuration
public class SolrProxyServletConfiguration implements EnvironmentAware {

  @Bean
  public ServletRegistrationBean servletRegistrationBean(){
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), propertyResolver.getProperty("servlet_url"));
    servletRegistrationBean.addInitParameter("targetUri", propertyResolver.getProperty("target_url"));
    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.solr.");
  }
}

配置文件
application.yml:

proxy:
    solr:
        servlet_url: /solr/*
        target_url: http://solrserver:8983/solr

对应的target是自己需要代理的服务,就这样配置完成后,启动两个server,访问对应的请求,就可以进行服务代理了。


综上

  • 我之所以推荐使用将ProxyFilter相应文件引进来的原因,主要有一点就是ProxyFilter里面所对应的服务代理本身就是使用HttpClient发出请求而已,但是在这里,原作者在这里构造的Http的连接池好像只设定了20个http连接,较少,如果请求量大一点就响应缓慢了,因此在这里推荐将原作者写的那一套Http连接池那里,全部去掉,自己编写一套代替。

  • ProxyFilter这个只能代理一个服务,如果需要代理多个服务的话,需要对服务进行进一步的改造,或者使用其他的方案。

 类似资料: