【Spring Cloud学习之四】Zuul网关
2024-09-02 18:09:55
环境
eclipse 4.7
jdk 1.8
Spring Boot 1.5.2
Spring Cloud 1.2
一、接口网关
接口网关:拦截所有的请求,交由接口网关,然后接口网关进行转发,类似nginx反向代理。
二、Zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务, 类似于nginx转发。
zuul默认和Ribbon结合实现了负载均衡的功能。
三、搭建zuul网关工程(eureka client)
1、新建maven工程:service-zuul
2、pom.xml
<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>
<groupId>com.wjy</groupId>
<artifactId>service-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>Dalston.RC1</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> <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories> </project>
3、application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
port: 8769
spring:
application:
name: service-zuul
zuul:
routes:
api-a:
path: /api-member/**
service-id: service-member
api-b:
path: /api-order/**
service-id: service-order
4、路由转发
启动类需要加@EnableZuulProxy 开启路由转发功能
package com.wjy; 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; @SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class, args);
} }
修改MemberController:
package com.wjy.controller; import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MemberController { @Value("${server.port}")
private String serverPort; @RequestMapping("/getUserList")
public List<String> getUserList() {
List<String> listUser = new ArrayList<String>();
listUser.add("zhangsan");
listUser.add("lisi");
listUser.add("wjy");
listUser.add("端口号:"+serverPort);
return listUser;
} @RequestMapping("/getMemberServiceApi")
public String getMemberServiceApi() {
return "this is 会员 服务工程";
} }
修改OrderController:
package com.wjy.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wjy.service.OrderMemberService; @RestController
public class OrderController {
@Autowired
private OrderMemberService orderMemberService; @RequestMapping("/getOrderUserAll")
public List<String> getOrderUserAll() {
System.out.println("订单服务开始调用会员服务");
return orderMemberService.getOrderUserAll(); } @RequestMapping("/getOrderServiceApi")
public String getOrderServiceApi() {
return "this is 订单服务工程";
}
}
测试验证:
发送请求http://127.0.0.1:8769/api-member/getMemberServiceApi转发到http://127.0.0.1:8762/getMemberServiceApi
发送请求http://127.0.0.1:8769/api-order/getOrderServiceApi转发到http://127.0.0.1:8764/getOrderServiceApi
6、服务过滤类:
package com.wjy; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext; @Component
public class MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); @Override
public String filterType() {
return "pre";
} @Override
public int filterOrder() {
return 0;
} public boolean shouldFilter() {
return true;
} public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
String refer = request.getHeader("refer"); if (accessToken != null) {
return null;
}
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (Exception e) {
}
return null; }
}
测试验证:
发送请求http://127.0.0.1:8769/api-member/getUserList?token=123456789
发送请求http://127.0.0.1:8769/api-member/getUserList
最新文章
- java中的 FileWriter类 和 FileReader类的一些基本用法
- Eclipse问题集锦
- 手机端布局 - rem计算
- 前端打包/自动化构建工具:gulp
- 纯CSS3实现轮播切换效果
- GetStartedWithWin10Develop
- And Then There Was One
- [Oracle]Oracle学习小结(1)
- 快学Scala第一部分
- ZOJ 3822 可能性DP
- 【转载】 Spark性能优化:资源调优篇
- ASP.NET Core中使用GraphQL - 第三章 依赖注入
- 伪指令 ENTRY 与 END
- ie6常见的兼容性问题
- tedu训练营day03
- 整型 布尔值 字符串 for循环
- if 嵌套if 的先后顺序的区别 (自测)
- How to extract a complete list of extension types within a directory?
- Golang的字符编码介绍
- 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
热门文章
- 题解:[HAOI2008]下落的圆盘
- vo bo po dao pojo dto
- React.js Tutorial: React Component Lifecycle
- LeetCode 934. Shortest Bridge
- 洛谷 P4158 [SCOI2009]粉刷匠 题解
- 解决mysql无法显示中文/MySQL中文乱码问号等问题
- flag&;to do list&;note
- saltstack自动化运维工具搭建个人笔记
- Sequelize 数据类型
- nginx之allow、deny