SpringCloud开发需要全部服务启动开发吗?

SpringCloud开发需要全部服务启动开发吗?

SpringCloud是目前最火的微服务架构之一,很多时候开发由于服务之间的依赖需要全部启动微服务,很浪费资源,并且自己的机器非常卡顿影响开发效率。

如何解决SpringCloud开发的启动问题

新版的SpringCloud提供了一个叫Gateway(网关)的项目,主要功能就是做请求转发、负载均衡、限流等。这些功能的原理都是基于GatewayFilter或、GlobalFilter实现的。

利用Filter我们可以实现很特性,比如说,请求签名、权限校验等。

org.springframework.cloud.gateway.filter.factory

这个包里面有很多FilterFactory,其中有一个RequestHeaderToRequestUriGatewayFilterFactory,这个过滤器工厂主要实现的就是请求转发到指定的微服务的。通过过滤器配置参数
如下:

args:
  instance:  http://localhost:8081/api/userinfo.do

以上配置的意思就是请求到网关,网关判断断言条件匹配,然后执行过滤器处理,将请求转发到指定服务器。

这种过滤器比较适合单一接口调试,并不适用几个接口调试。因此我考虑继承他的抽象类自行实现一个URI转发的过滤器。

自定义特定微服务的Filter

package com.springboot.cloud.gateway.filter;


/**
 * 这个过滤器通过请求头配置改变请求URI
 * @author marker
 * @create 2019-09-18 13:37
 **/

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.factory.AbstractChangeRequestUriGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.web.server.ServerWebExchange;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * 这个过滤器通过请求头配置改变请求URI
 * This filter changes the request uri by a request header
 *  支持GET & POST
 * @author Toshiaki Maki marker
 */
public class RequestUriOverwriteGatewayFilterFactory extends
        AbstractChangeRequestUriGatewayFilterFactory<AbstractGatewayFilterFactory.NameConfig> {
    private final Logger log = LoggerFactory
            .getLogger(org.springframework.cloud.gateway.filter.factory.RequestHeaderToRequestUriGatewayFilterFactory.class);

    public RequestUriOverwriteGatewayFilterFactory() {
        super(NameConfig.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(NAME_KEY);
    }

    @Override
    protected Optional<URI> determineRequestUri(ServerWebExchange exchange,
                                                NameConfig config) {
        String requestUrl = exchange.getRequest().getHeaders().getFirst(config.getName());
        URI uri = exchange.getRequest().getURI();
        String path  = uri.getPath();
        String reUrl = requestUrl + path;

        if(uri.getQuery() != null){
            reUrl += "?" + uri.getQuery();
        }

        String finalReUrl = reUrl;
        return Optional.ofNullable(requestUrl).map(url -> {
            try {
                return new URL(finalReUrl).toURI();
            }
            catch (MalformedURLException | URISyntaxException e) {
                log.info("Request url is invalid : url={}, error={}", finalReUrl,
                        e.getMessage());
                return null;
            }
        });
    }
}

NameConfig 主要配置请求头名称,通过名称获取请求的实例。比如我们配置的instance=http://localhost:8081,在请求时网关就会将具体的请求接口转发到http://localhost:8081

例如:请求的网关地址api.leyangxia.com/api/user/info GET,实际网关会转发到http://localhost:8081/api/user/info

具体的请求报文如下:

GET /api/user/info HTTP/1.1
Host: localhost:8000
Authorization: Basic [xxxxxxx]
instance: http://localhost:8081
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

实际微服启动

  • instance | http://192.168.0.9:8013 |

本机需要启动的服务(无需全部启动,启动三个即可业务接口调试)

  • center-eureka | 注册中心 |
  • center-config | 配置中心 |
  • application | 需要调试的微服务 |

从此再也不担心开发卡顿了,这种方式适合自己调试或联调。

来源: 雨林博客(www.yl-blog.com)