说明:
提供统一的请求入口,通过配置的微服务路径拦截信息,根据不同的路径跳转到不同的微服务。
一、导入SpringCloud与SpringBoot依赖包(必须版本对应,此处为2.2.x <-> Hoxton):
见此文章第一章:https://blog.csdn.net/a526001650a/article/details/106859559
二、配置Eureka的Client端和Zuul微服务网关拦截信息:
1.导入Eureka的Client端依赖包和Zuul依赖包:
<dependencies>
<!-- 导入Eureka的Client端依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 导入Zuul依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
2.application.yml配置Eureka的Client端和Zuul网关信息:
spring:
application:
name: mall-gateway #配置本网关服务名称
server: #配置本网关端口号
port: 9999
#配置Eureka的Client端
eureka:
client:
service-url: #配置Eureka Server端服务器的地址
defaultZone: http://127.0.0.1:10000/eureka/
instance: #配置跨域访问
prefer-ip-adress: true
#配置Zuul网关信息
zuul:
routes: #配置要拦截的微服务
mall-usercenter: #mall-usercenter为自定义的微服务名称
path: /** #配置mall-usercenter微服务要拦截的路径
serviceId: mall-usercenter #配置该微服务在Eureka注册中心中的服务id
hystrix: #配置hystrix超时时间,可以不配使用默认值
command:
default: #默认所有超时时间
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 #6000毫秒
ribbon: #配置连接与读取超时时间,实际为(ConnectionTimeOut+ReadTimeOut)*2,要小于hystrix超时时间,可以不配使用默认值
ConnectionTimeOut: 600
ReadTimeOut: 2000
3.编写启动类(配置Eureka的Client端和Zuul):
@SpringBootApplication
@EnableEurekaClient //配置Eureka Client端
@EnableZuulProxy //配置Zuul
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class);
}
}
4.在浏览器输入网关IP与端口,路径用拦截的服务地址,能直接访问:
#127.0.0.1:9999为网关地址,/getUserDetail/1001为mall-usercenter微服务的请求路径
http://127.0.0.1:9999/getUserDetail/1001
三、Zull过滤器,根据条件阻止访问网关内部的微服务(需要增加头字段转发,防止丢失):
1.创建自定义类继承ZuulFilter(@Component自动扫描加载,让过滤器生效):
@Component //自动扫描加载,让过滤器生效
public class ZuulGatewayFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";//返回pre表示之前过滤,返回post表示之后过滤
}
@Override
public int filterOrder() {
return 0; //多个过滤器时,数字越小的先执行
}
@Override
public boolean shouldFilter() {
return true; //是否开启滤过器,true开启,false关闭
}
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String headStr= request.getHeader("Authorization");
if (true) { //条件,如果不满足则拦截,禁止访问网关内部的微服务
//此句设为false进行拦截,设为true或不调用则放行
context.setSendZuulResponse(false);
context.getResponse().setContentType("application/json;charset=utf-8"); //返回为json格式
context.setResponseBody("{code: 403, errorMsg: 请登录}"); //返回文本内容
return null;
}
//转发头字段,防止网关拦截后丢失
context.addZuulRequestHeader("Authorization", headStr);
return null;
}
}