路由访问映射规则
工程microservicecloud-zuul-gateway-9527
代理名称
YML
before
http://myzuul.com:9527/cloud-provider-payment/paymentInfo
zuul:
routes: # 路由映射配置
mypayment.path: /mypayment/** #IE地址栏输入的路径
mypayment.serviceId: cloud-provider-payment #注册进eureka服务器的地址
after
http://myzuul.com:9527/weixin/paymentInfo
此时问题
- 路由访问OK
http://myzuul.com:9527/weixin/paymentInfo
- 原路径访问OK
http://myzuul.com:9527/cloud-provider-payment/paymentInfo
如果不想使用默认的路由规则,可以添加以下配置来忽略默认路由配置
原有真实服务名忽略
YML
server:
port: 9527
spring:
application:
name: cloud-zuul-gateway
eureka:
client:
service-url:
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
zuul:
ignored-services: cloud-provider-payment
routes: # 路由映射配置
mypayment.serviceId: cloud-provider-payment
mypayment.path: /weixin/**
mysms.serviceId: cloud-provider-sms
mysms.path: /mysms/**
上一步配置后,cloud-provider-payment就不行了
http://myzuul.com:9527/cloud-provider-payment/paymentInfo
单个具体,多个可以用"*"
zuul:
ignored-services: "*"
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
路由转发和负载均衡功能
服务提供者SMS短信模块
- 建模块cloud-provider-sms8008
- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mscloud</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-sms8008</artifactId>
<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-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- YML
server:
port: 8008
###服务名称(服务注册到eureka名称)
spring:
application:
name: cloud-provider-sms
eureka:
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
#defaultZone: http://127.0.0.1:7001/eureka,http://127.0.0.1:7002/eureka
#defaultZone: http://eureka7001.com:7001/eureka # eureka集群加@老本版
- 业务类
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @auther zzyy
* @create 2019-11-14 14:35
*/
@RestController
public class SMSController
{
@Value("${server.port}")
private String serverPort;
@GetMapping("/sms")
public String sms()
{
return "sms provider service: "+"\t"+serverPort;
}
}
- 主启动
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @auther zzyy
* @create 2019-11-14 14:34
*/
@SpringBootApplication
@EnableEurekaClient
public class MainAppSMS8008
{
public static void main(String[] args)
{
SpringApplication.run(MainAppSMS8008.class,args);
}
}
- 启动8008并成功注册进eureka服务器上
修改我们的zuul服务9527
- 修改YML,体现路由转发和负载均衡
- YML
server:
port: 9527
spring:
application:
name: cloud-zuul-gateway
eureka:
client:
service-url:
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
zuul:
#ignored-services: cloud-provider-payment
routes: # 路由映射配置
mypayment.serviceId: cloud-provider-payment
mypayment.path: /weixin/**
mysms.serviceId: cloud-provider-sms
mysms.path: /mysms/**
- 由于Zuul自动集成了Ribbon和Hystrix,所以Zuul天生就有负载均衡和服务容错能力
测试
http://myzuul.com:9527/weixin/paymentInfo 负载均衡
http://myzuul.com:9527/mysms/sms 路由转发
微信服务找8001/8002
短信服务找8008
设置统一公共前缀
- YML
zuul:
prefix: /atguigu
ignored-services: "*"
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
-
http://myzuul.com:9527/atguigu/weixin/paymentInfo
-
http://myzuul.com:9527/atguigu/mysms/sms
-
http://myzuul.com:9527/atguigu/cloud-provider-payment/paymentInfo
-
最后YML
server:
port: 9527
spring:
application:
name: cloud-zuul-gateway
eureka:
client:
service-url:
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
zuul:
#ignored-services: cloud-provider-payment
prefix: /atguigu
routes: # 路由映射配置
mypayment.serviceId: cloud-provider-payment
mypayment.path: /weixin/**
mysms.serviceId: cloud-provider-sms
mysms.path: /mysms/**
查看路由信息
POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
YML
# 开启查看路由的端点
management:
endpoints:
web:
exposure:
include: 'routes'
查看路由详细信息
http://localhost:9527/actuator/routes
过滤器
功能
过滤功能负责对请求过程进行额外的处理,是请求校验过滤及服务聚合的基础。
过滤器的生命周期
ZuulFilter
过滤类型
- pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;
- routing:在请求被路由到目标服务时执行
- post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;
- error:请求在其他阶段发生错误时执行。
过滤顺序
- 数字小的先执行
过滤是否开启
shouldFilter方法为true走
执行逻辑
- 自己的业务逻辑
案例Case
前置过滤器,用于在请求路由到目标服务前打印请求日志
业务代码
package com.atguigu.springcloud.Filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* @auther zzyy
* @create 2019-11-14 16:00
*/
@Component
@Slf4j
public class PreLogFilter extends ZuulFilter
{
@Override
public String filterType()
{
return "pre";
}
@Override
public int filterOrder()
{
return 1;
}
@Override
public boolean shouldFilter()
{
return true;
}
@Override
public Object run() throws ZuulException
{
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String host = request.getRemoteHost();
String method = request.getMethod();
String uri = request.getRequestURI();
//log.info("=====> Remote host:{},method:{},uri:{}", host, method, uri);
System.out.println("********"+new Date().getTime());
return null;
}
}
测试
http://myzuul.com:9527/atguigu/mysms/sms
在调用8008之前会打印日志
开关,YML配置
zuul:
PreLogFilter:
pre:
disable: true