JavaEE:SpringCloud-使用Zuul网关提供统一请求入口

说明:

提供统一的请求入口,通过配置的微服务路径拦截信息,根据不同的路径跳转到不同的微服务。

一、导入SpringCloud与SpringBoot依赖包(必须版本对应,此处为2.2.x <-> Hoxton):

见此文章第一章:https://blog.csdn.net/a526001650a/article/details/106859559

二、配置Eureka的Client端和Zuul微服务网关拦截信息:

1.导入Eureka的Client端依赖包和Zuul依赖包:


    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    
    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-zuul
    

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

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;
    }
}

 

你可能感兴趣的:(JavaEE)