springboot+Zuul网关服务
点关注不迷路,欢迎再来!
精简博客内容,尽量已专业术语来分享。
努力做到对每一位认可自己的读者负责。
帮助别人的同时更是丰富自己的良机。
网关服务有效的降低维护路由规则与服务实例列表的难度。它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端都需要经过它来进行调度和过滤。
一.先创建一个Eureka-Server服务注册中心
回顾上节知识:springboot集成Eureka注册中心(四)
二.创建EurekaClient和EurekaCustom服务
回顾 springboot+Ribbon客户端负载均衡(七) ,可以复制源码,直接启动服务即可。
三.创建EurekaZuul服务
1.pom.xml配置
<!-- Zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.配置application.yml文件
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://127.0.0.1:8081/eureka/
server:
port: 8085 #服务端口号
spring:
application:
name: service-zuul #服务名称--调用的时候根据名称来调用该服务的方法
zuul:
routes:
users:
path: /api-client/** #以api-client开头的路径被重定向到service-client服务,/**表示匹配任意数量字符,支持多级目录
serviceId: service-client
3.配置启动类引入@EnableZuulProxy
/**
* 开启Zuul的API
* @author andy
*
*/
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaZuulApplication.class, args);
}
}
4.访问serverZuul看看效果
因为我们在配置服务路由时对/api-client/**请求过滤
访问http://127.0.0.1:8085/api-client/client/index ,看结果会不会转发到service-client
从结果可以看出我们通过设置的请求过滤并成功的转发service-client,有小伙伴可能发现页面会报错不用担心,如果你回头看
springboot+Ribbon客户端负载均衡(七)
你就会明白是因为接口睡眠超时引起的,重新刷新页面就OK了。
5.编写过滤器AccessFilter
/**
* 过滤器配置类
* @author andy
*/
@Configuration
public class AccessFilter extends ZuulFilter{
private Logger logger = LogManager.getLogger(AccessFilter.class.getName());
@Override
public boolean shouldFilter() { //判断是否需要被过滤
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
logger.info("send {} request to {}",request.getMethod(),request.getRequestURI().toString());
String token = request.getParameter("accessToken");
if(token==null) {
logger.warn("access token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
logger.info("access token ok");
return null;
}
@Override
public String filterType() { //过滤类型
return "pre";
}
@Override
public int filterOrder() { //过滤执行顺序
return 0;
}
}
自定义过滤器之后,并不会直接生效,还需要为其创建具体的Bean
/**
* 开启Zuul的API
* @author andy
*
*/
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class EurekaZuulApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaZuulApplication.class, args);
}
//将过滤器注入到容器中
@Bean
public AccessFilter accessFilters() {
return new AccessFilter();
}
}
再次访问http://127.0.0.1:8085/api-client/client/index
到这里说明过滤器已经生效。所以为了避免将某些非业务性代码,冗余的逻辑从原有的微服务中拆分出来,冗余的拦截器或过滤器,更好的做法是通过前置的网关服务来完成这些非业务性质的校验。