写在前面
1:创建my-service-zuul
new
->module
,后续按照提示录入gav等信息,选择maven
,java8等后finish即可,finish当前项目模块结构如下图:
2:设置parent
<parent>
<groupId>dongshi.daddy</groupId>
<artifactId>my-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
3:引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
4:完整pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dongshi.daddy</groupId>
<artifactId>my-service-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>my-service-zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>dongshi.daddy</groupId>
<artifactId>my-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
5:配置文件
server:
port: 8769
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: service-zuul
zuul:
routes:
api-a:
path: /api-a/**
serviceId: dongshidaddy-first-ribbon
api-b:
path: /api-b/**
serviceId: dongshidaddy-first-feign-client
通过zuul.routes.{api-name}.path
设置要路由的API的路径,通过zuul.routes.{api-name}.serviceId
设置具体处理API路径的的服务id(在eureka服务端注册的id)
,这里存在如下的映射关系:
/api-a/** -> dongshidaddy-first-ribbon
/api-b/** -> dongshidaddy-first-feign-client
6:启用相关注解
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
作用都是启用相关的功能。
7:测试
7.1:启动my-enreka-server
该服务作为注册中心
使用。
可以看到此时No instances available
。
7.2:启动myeureka-client
该服务作为最终对外提供的服务的应用。注意这个不是咱们在my-service-zuul
的application.yml
中配置的serviceId
。
此时服务idDONGSHIDADDY-FIRST-EUREKA-CLIENT
就已经注册上来了。
7.3:启动my-service-feign
该服务就是我们在my-service-zuul
中配置:
api-b:
path: /api-b/**
serviceId: dongshidaddy-first-feign-client
其中的serviceId: dongshidaddy-first-feign-client
对应的具体服务。启动后注册信息下图:
7.4:启动my-service-ribbon
该服务就是我们在my-service-zuul
配置的
api-a:
path: /api-a/**
serviceId: dongshidaddy-first-ribbon
中的dongshidaddy-first-ribbon
对应的具体服务,启动后eureka服务端如下图:
7.5:启动my-service-zuul
启动后:
7.6:访问/api-a/**
xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-a/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763
7.7:访问/api-b/**
xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-b/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763
8:增加过滤功能
zuul除了路由的功能外,还支持过滤拦截功能,只需要实现com.netflix.zuul.ZuulFilter
抽象类就可以了,如下定义:
@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;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
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");
if(accessToken == 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;
}
log.info("ok");
return null;
}
}
8.1:测试
注意重新启动my-service-zuul
。
xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-b/hi?name=dongshidaddy
token is empty
xbdeMacBook-Air:~ xb$ curl "http://localhost:8769/api-b/hi?name=dongshidaddy&token=111"
hi dongshidaddy ,i am from port:8763