APP下载

微服务必备 zuul作为闸道器用起来太方便了 spring cloud实践(7)

消息来源:baojiabao.com 作者: 发布时间:2024-05-17

报价宝综合消息微服务必备 zuul作为闸道器用起来太方便了 spring cloud实践(7)

01 注册eureka

02 eureka后台监控加许可权

03 feign使用

04 引用common元件

05 hystrix 应用

06 ribbon应用

ribbon是针对微服务之间的负载均衡机制,如果从外部进来的请求需要访问内部服务的时候,就需要zuul来帮助我们了。他可以帮我们做外部访问的负载均衡和过滤的工作。

使用者请求zuul的时候会先经过pre过滤器,然后再通过route过滤器,他会通过路由配置把请求汇入到对应的微服务,然后再通过post过滤器,最后返回给使用者。

建立zuul 服务

先建立一个zuul的专案,一路向导达到目的。

然后就是三板斧。

依赖项,pom.xml 配置

org.springframework.boot

spring-boot-starter-parent

1.5.6.RELEASE

1.8

Dalston.SR4

org.springframework.cloud

spring-cloud-starter-eureka

org.springframework.cloud

spring-cloud-starter-zuul

配置项,application.yml。即然zuul是一个闸道器就会拦截外部浏览器对服务的请求,起到了过滤器的作用。制定一个zuul的名字,埠号,以及要注册的服务中心。

spring:

application:

name: demo-gateway-zuul

server:

port: 7600

eureka:

client:

service-url:

defaultZone: http://root:[email protected]:7776/eureka/

zuul:

routes:

demo-eureka-client-consumer: /user/**

这里要注意的是,在zuul.routes的定义中需要把访问服务的名字和路径定义起来。也就是说当访问 demo-eureka-client-consumer 的/user/ 路径的时候就可以被服务感知。

启动项

在启动的class上面打上annotation,告诉程式这个作为zuul的gateway。

测试结果

测试之前再回顾一下,我们之前的服务器埠号。

eureka server 7776

provider 8081

provider2 8083

consumer 8082

zuul 7600

现在我们要通过访问zuul的7600 埠,然后由zuul帮我们路由到 consumer 8082 上面去。

这里我们通过zuul的7600 服务,路由从原来的userlogin 更改成了 /user/userlogin zuul帮我们路由到了 consumer的 /userlogin 上面去了。

回头看看 zuul也注册到中心了。

过滤器filter 测试

这里建立一个filter的class,继承于ZuulFilter

主要是选择过滤器的型别,优先级,是否生效,过滤器执行的内容,如下。

@Component

public class PreFilter extends ZuulFilter{

@Override

public String filterType() {//过滤器型别

return FilterConstants.PRE_TYPE;

}

@Override

public int filterOrder() {//同类型过滤器优先级,数字越小优先级越高

return 0;

}

@Override

public boolean shouldFilter() {//过滤器是否生效

return true;

}

@Override

public Object run() {//出发过滤条件时执行的内容

RequestContext context = RequestContext.getCurrentContext();

HttpServletRequest request = context.getRequest();

String token = request.getHeader("token");

if (token == null || token.equals("")){

context.setSendZuulResponse(false);

context.setResponseStatusCode(401);

context.setResponseBody("{"message":"no permission, need to login!"}");

return "access denied";

}

return "access succeed";

}

}

然后再执行zuul,并且通过zuul访问consumer 服务。

访问的时候如果token为空那么,访问失败并且提示资讯如下。

然后,我们在token中随便填写一些内容。

得到正确的结果。

搞定收工。

如果喜欢点个关注,转发一下。

谢谢各位。

2020-01-01 18:50:00

相关文章