标签:网关 Zuul springboot spring boot springframework import org cloud
springboot+Zuul网关服务(十四)
点关注不迷路,欢迎再来!
网关服务有效的降低维护路由规则与服务实例列表的难度。它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端都需要经过它来进行调度和过滤。
一.先创建一个Eureka-Server服务注册中心
回顾上节知识:springboot集成Eureka注册中心(四)
二.创建EurekaClient和EurekaCustom服务
回顾 springboot+Ribbon客户端负载均衡(七) ,可以复制源码,直接启动服务即可。
三.创建EurekaZuul服务
1.pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sun</groupId>
<artifactId>EurekaZuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>EurekaZuul</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- Zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- Fegin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--排除logback默认日志 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!--引入log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
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/** #以lind开头的路径被重定向到lind服务
serviceId: service-client
3.配置启动类引入@EnableZuulProxy
package com.sun.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.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 **
package com.sun.eureka.config;
import javax.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Configuration;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
/**
* 过滤器配置类
* @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
package com.sun.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import com.sun.eureka.config.AccessFilter;
/**
* 开启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();
}
}
标签:网关,Zuul,springboot,spring,boot,springframework,import,org,cloud 来源: https://blog.csdn.net/qq_39443053/article/details/95516826
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。