springboot+Zuul网关服务

  • Post author:
  • Post category:其他




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

在这里插入图片描述

在这里插入图片描述

到这里说明过滤器已经生效。所以为了避免将某些非业务性代码,冗余的逻辑从原有的微服务中拆分出来,冗余的拦截器或过滤器,更好的做法是通过前置的网关服务来完成这些非业务性质的校验。



版权声明:本文为qq_39443053原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。