SpringCloud(五):搭建API网关服务

SpringCloud(五):搭建API网关服务

1.介绍
1.什么是API网关?
api网关就是应用程序接口网关,在微服务架构中分布着许多微服务,这些微服务不直接给用户调用,而是通过一个api网关的url为用户提供一致的服务。

2.为什么需要API网关?
为了简化调用逻辑,api网关对外提供一致的调用接口,可以简化客户端调用的复杂度。api网关可以将多个微服务的调用逻辑进行聚合,减少客户端的请求次数,优化客户端的使用体验。

3.API网关的主要功能是什么?
API网关主要功能是路由和服务治理。在微服务架构中,每个不同的后端服务可能都有用户维护的业务,所以在微服务中会有很多冗余的登录校验和签名校验,我们可以把微服务中的这些功能独立出来做成单独的OAuth2鉴权授权服务器,然后通过API网关调用OAuth2服务器来过滤用户的请求,保证对外服务的安全性。

Spring Cloud 提供了基于Netflix Zuul 实现的API网关组件 Spring Cloud Zuul,在Zuul中封装了API网关的各种功能,比如路由,过滤,Cookie和熔断与Ribbon的支持。
在这里插入图片描述

代码示例
pom.xml 引入依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-security</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-zuul</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-oauth2</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-tomcat</artifactId>
		<!--<scope>provided</scope>-->
	</dependency>
	<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
	<dependency>
		<groupId>io.jsonwebtoken</groupId>
		<artifactId>jjwt</artifactId>
		<version>0.9.0</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<!--<optional>true</optional>-->
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>

	<!--
        devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),
        实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。
        即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的
     -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional><!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 -->
	</dependency>
</dependencies>

2.创建项目配置文件 application.yml
在这里插入图片描述
在这里插入图片描述
创建启动项类
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
@EnableOAuth2Sso
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
}
创建zuul拦截类
/**

  • filterOrder:filter执行顺序,通过数字指定
    shouldFilter:filter是否需要执行 true执行 false 不执行
    run : filter具体逻辑
    filterType :filter类型,分为以下几种

pre:请求执行之前filter
route: 处理请求,进行路由
post: 请求处理完成后执行的filter
error:出现错误时执行的filter
by luzhuhong
*/
@Component
public class AccessFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

@Override
public String filterType() {
    return "pre";
}
@Override
public int filterOrder() {
    return 0;
}
@Override
public boolean shouldFilter() {
    return false;
}
@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest request = ctx.getRequest();
    log.info("----------"+String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
    Object accessToken = request.getParameter("access_token");
    if(accessToken == null) {
        log.warn("access token is empty12");
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(401);
        return null;
    }
    log.info("access token ok");
    return null;
}

}
加载到启动项里面去
@Configuration
public class FiltersConfig {

@Bean
public AccessFilter accessFilter() {
	return new AccessFilter();
}

@Bean
public ErrorHandleFilter errorHandleFilter(){
	return new ErrorHandleFilter();
}

}
按照上面配置就弄了一个网关配置 所有请求通过网关转发

猜你喜欢

转载自blog.csdn.net/luzhuhong1/article/details/82801871