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 | 需要调试的微服务 |
从此再也不担心开发卡顿了,这种方式适合自己调试或联调。